[Erledigt] Boolean-Prüfung funktioniert nicht

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Boolean-Prüfung funktioniert nicht

Beitrag von Mathias »

Könnte sein, das DoSave an 2 Orten deklariert ist.
Einmal in deiner Globale Deklaration, und das zweite mal sonst in irgendeiner Unit ?

Das würde man sofort merken, wen du die globale Deklaration mal ausklammerst.
Solche Doxxxx Deklarationen gibt es viele in er LCL.

Wäre es möglich mal den ganze Quell-Code hoch zu laden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Boolean-Prüfung funktioniert nicht

Beitrag von MacWomble »

Ja, ist aktuell kompiliert, vorher alle ppus gelöscht.

Habe aber jetzt etwas herausgefunden:

Da ich die DoSave in mehreren Forms definiert habe, habe ich diese nun in der besagten Form anders benannt: DoPosSave.

Diese wird bei Klick auf den Verwerfen-Button auf False gesetzt, ist dann aber an der Problemstelle wieder True.
Es scheint irgendwie mit der Sichtbarkeit von DoPosSave zu tun zu haben.
Wo muss ich diese richtigerweise definieren, wenn sie in der gesamten Unit - und nur dort - sichtbar sein soll?
Die Funktion BearbeiteAuftragsPosition soll auch von außerhalb aufgerufen werden können, weswegen sie vor
dem Implementation-Teil ist. Ist der Fehler eventuell hier zu suchen?
Zuletzt geändert von MacWomble am Fr 27. Apr 2018, 19:44, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Boolean-Prüfung funktioniert nicht

Beitrag von MacWomble »

Mathias hat geschrieben:Wäre es möglich mal den ganze Quell-Code hoch zu laden ?


Ich denke, das macht kein Sinn. Sind ca. 40 Datenbanktabellen und 38 Forms und einige Frames. Bis du da den Überblick hast ...

Aber mit meinem letzten Beitrag habe ich das Problem ja schon eingegrenzt. DoPosSave wird ansonsten nirgends verwendet.

Kann man denn von einer modal aufgerufenen Form einen Wert zurück geben, je nach dem, welcher Button geklickt wurde?

Code: Alles auswählen

 
// So geht es ja wohl nicht ;-) Aber irgendetwas in dieser Art?
If  F.ShowModal = True then
 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Boolean-Prüfung funktioniert nicht

Beitrag von Mathias »

Wo muss ich diese richtigerweise definieren, wenn sie in der gesamten Unit - und nur dort - sichtbar sein soll?

Hier:

Code: Alles auswählen

implementation
 
uses
  dtm_artikel, dtm_auftrag, dtm_basis, frm_getartikel;
 
var
  DoSave: boolean;
 


Generell würde ich mir angewöhnen, keine globalen Variablen zu deklarieren.
In diesem Fall könntest du sie auch im privaten Teil von TfrmPosition deklarieren.


Der Aufruf wären dann hier so:

Code: Alles auswählen

// Hier findet der Spuk statt:
 
        if frmPosition.DoSave = True then
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Boolean-Prüfung funktioniert nicht

Beitrag von MacWomble »

Das ergibt:
frm_position.pas(181,14) Error: identifier idents no member "DoPosSave"

Edit
Wenn ich sie im Private erzeuge, findet er sie wieder, aber ist immer wieder True :-(

Die komplette Unit hier eingefügt und dann fiel es mir wie Schuppen von den Augen:

Die Wurzel allen Übels ist gefunden - Vielen Dank für eure Hilfe.

Wenn ich in OnFormClose den Wert auf True setze, brauch ich mich wahrlich nicht zu wundern :-(

Code: Alles auswählen

 
 
procedure TfrmPosition.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  DoPosSave := True;
  Close;
end;
 
 
end.
Zuletzt geändert von MacWomble am Fr 27. Apr 2018, 21:13, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Boolean-Prüfung funktioniert nicht

Beitrag von Mathias »

Wenn ich in OnFormClose den Wert auf True setze, brauch ich mich wahrlich nicht zu wundern :-(

Dies gibt es ab und zu, das man ein Brett vor den Augen hat. :wink:

Aber Hauptsache, du hast es zu laufen gebracht. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Boolean-Prüfung funktioniert nicht

Beitrag von MacWomble »

Dafür ist die Variable jetzt auch nicht mehr global, was ja auch richtig ist. Es funktioniert einwandfrei - Nochmals Danke an Alle.

Der Aufruf für die Form sieht jetzt so aus:

Code: Alles auswählen

 
        F.DoSave:=False;
        F.ShowModal;
        if F.DoSave then 
 


und ein paar Änderungen hier:

Code: Alles auswählen

 
procedure TfrmPosition.btnSpeichernClick(Sender: TObject);
begin
  DoSave := True;
  Close;
end;
 
procedure TfrmPosition.btnVerwerfenClick(Sender: TObject);
begin
  DoSave := False;
  Close;
end;     
 
 
procedure TfrmPosition.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  If not DoSave then // Falls das Fenster einfach geschlossen wird oder Verwerfen angeklickt wurde
  if MessageDlg('Sollen wirklich alle Änderungen verworfen werden?', mtWarning, [mbYes, mbNo], 0) = mrYes then
    DoSave := False
  else
    DoSave := True;
  Close;
end;       
 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten