[Erledigt] Boolean-Prüfung funktioniert nicht

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

[Erledigt] Boolean-Prüfung funktioniert nicht

Beitragvon MacWomble » 27. Apr 2018, 10:18 [Erledigt] Boolean-Prüfung funktioniert nicht

Ich habe in meinem Programm

Code: Alles auswählen
 
        if DoSave = True then
        begin
          if qryPosition.State = dsEdit then
         ...
 


DoSave ist definitiv FALSE, trotzdem wird der Zweig ab 'begin' abgearbeitet.
Das selbe Verhalten habe ich, wenn ich (das empfohlene)

If DoSave Then

verwende.

DoSave ist als Boolean definiert und der Debugger zeigt mir auch false an.
Zuletzt geändert von MacWomble am 27. Apr 2018, 20:12, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 581
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon theo » 27. Apr 2018, 10:21 Re: Boolean-Prüfung funktioniert nicht

Woran erkennst du das?
theo
 
Beiträge: 8054
Registriert: 11. Sep 2006, 18:01

Beitragvon MacWomble » 27. Apr 2018, 10:26 Re: Boolean-Prüfung funktioniert nicht

Siehe Screenshot
Bildschirmfoto vom 2018-04-27 11-24-59.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 581
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon theo » 27. Apr 2018, 10:31 Re: Boolean-Prüfung funktioniert nicht

Ich meine, dass er den Codeblock durchläuft?
Es kann ja eigentlich nicht sein, sonst würde nichts laufen.
"Spinnt" der Debugger?
theo
 
Beiträge: 8054
Registriert: 11. Sep 2006, 18:01

Beitragvon MacWomble » 27. Apr 2018, 10:40 Re: Boolean-Prüfung funktioniert nicht

Ich bin im Einzelschrittmodus durch die Routine. Sieht man im Screenshoot auch, dass er in diesem Codebereich ist.
Es werden definitiv die Befehle im 'True'-Block ausgeführt!
Zuletzt geändert von MacWomble am 27. Apr 2018, 11:33, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 581
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon siro » 27. Apr 2018, 10:40 Re: Boolean-Prüfung funktioniert nicht

Hallo MacWomble,

oft bauen die Compiler eine gemeinsamen Codeabschnitt für die If Then Abfragen,
da lässt man sich schnell ins Boxhorn jagen, er kommt da zwar rein, führt aber nix wirklich aus
bzw. nur Code der für beide Abschnitte gültig ist.
Das passiert besonders gern wenn man die Optimierungen eingeschaltet hat.
Im Zweifel schaue ich mir dann immer den Assemblercode an.
Prüf das mal mit einer zusätzlichen Variable, indem Du die vor der Abfrage auf FALSE setzt
und in der IF TRUE Abfrage dann auf TRUE setzt.
Nach der IF then schaust Du wie die Variable dann steht.

Code: Alles auswählen
 
var f:Boolean;
 
f:=FALSE;
if DoSave = TRUE then
begin
   f := TRUE;
.....


hier guckst Du Dir dann das f dann an.

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon MacWomble » 27. Apr 2018, 11:30 Re: Boolean-Prüfung funktioniert nicht

@siro

F ist true, also arbeitet er es ab!

Aber das wusste ich ja bereits. Siehe oben.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 581
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon gladio » 27. Apr 2018, 11:40 Re: Boolean-Prüfung funktioniert nicht

und wenn du das mal andersherum angehst:
Code: Alles auswählen
if DoSave <> false then
begin

oder
Code: Alles auswählen
if DoSave = false then 
  //mach irgendwas oder nichts
  //einfach mal beep
else
begin
  if qryPosition.State = dsEdit then
..
 
Zuletzt geändert von gladio am 27. Apr 2018, 11:41, insgesamt 1-mal geändert.
gladio
 
Beiträge: 95
Registriert: 21. Jun 2014, 05:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win7/10-32/64 - Laz 1.8 Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon af0815 » 27. Apr 2018, 11:41 Re: Boolean-Prüfung funktioniert nicht

Ist das DoSave eindeutig ?

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3472
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon m.fuchs » 27. Apr 2018, 11:43 Re: Boolean-Prüfung funktioniert nicht

Das = True würde ich weglassen, aber das dürfte nicht das Problem sein.

Lösche mal alle kompilierten Dateien (excutable und ppu) und bau das ganze Projekt neu. Das klingt für mich eher, als ob sich der Debugger irgendwo verschluckt und noch mit alten Kompilaten arbeitet.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1963
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon siro » 27. Apr 2018, 11:55 Re: Boolean-Prüfung funktioniert nicht

Ist das DoSave eine Funktion ?
Dann könnte das Ergebnis evtl. undefiniert sein ? obwohl er ja FALSE anzeigt, laut deiner Beschreibung.

function DoSave:Boolean;
begin
// result vergessen...
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if DoSave then beep; // Zufalls bedingt
end;

ich würd jetzt zum Testen eine Variable definieren
var DoSave2:Boolean;

und diese dann abfragen.
solllte das richtig gehen, hängt es wohl mit der Funktion bzw. der Rückgabe zusammen.
Speicher / Stackproblem
-------------------------------
Neue Idee:

Kann das durch eine Vermischung der Boolean passieren ?

ein Boolean ist ja nur ein Byte
ein LongBool sind 4 Bytes
Wenn sich im Speicher der Wert z.B. auf 256 befindet, dann ist der Boolean False
während der LongBool vermutlich TRUE ist.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon MacWomble » 27. Apr 2018, 13:38 Re: Boolean-Prüfung funktioniert nicht

1. DoSave ist eine Variable
2. If DoSave Then hatte ich, geht aber auch nicht
3. Auch nach einem frischen (kompletten) kompilieren geht es nicht
4. Passiert dies an mindestens 10 Stellen im Programm


Es ist ein Form mit zwei Buttons Verwerfen und Speichern.

Im OnClick wird DoSave auf False bzw. auf True gesetzt.

Wenn DoSave wahr ist, wird der Datensatz gespeichert, im anderen Fall soll er nicht gespeichert werden.

(Code gekürzt)
Code: Alles auswählen
 
unit frm_position;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, Controls, ctrfunctions, DB, DBCtrls, DBGrids, Dialogs, ExtCtrls, FileUtil, Forms, frm_mengeneinheiten,
  frm_textbausteine, Graphics,
  LCLType, StdCtrls, DBExtCtrls, SysUtils;
 
type
 
  { TfrmPosition }
 
  TfrmPosition = class(TForm)
    lblArtikelnummer: TLabel;
   ...
    procedure btnBausteinPositionClick(Sender: TObject);
    procedure dbeLohnExit(Sender: TObject);
    procedure dblPositionsArtChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure btnSpeichernClick(Sender: TObject);
    procedure btnVerwerfenClick(Sender: TObject);
  private
 
  public
 
  end;               
 
var
  frmPosition: TfrmPosition;
  DoSave: boolean;
 
function BearbeiteAuftragsPosition(IDAuftrag: integer; IDPosition: integer; Neu: boolean): boolean;
 
 
implementation
 
uses
  dtm_artikel, dtm_auftrag, dtm_basis, frm_getartikel;
 
{$R *.frm} 
 
function BearbeiteAuftragsPosition(IDAuftrag: integer; IDPosition: integer; Neu: boolean): boolean;
var
  Suchtext: string;
  LastRec: integer;
  PosNeu: integer;
  IDArtikel, IDPreis: integer;
  StSatz, FStSatz: string;
  F: TfrmPosition;
  LDat: boolean;
  begin
  with dtmAuftrag do
  begin
    qryPosition.Connection.StartTransaction;
      if IDPosition = 0 then
      if MessageDlg('Es sind noch keine Positionen vorhanden. Wollen Sie jetzt eine anlegen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        Neu := True
      else
      begin
        Result := False;
        exit;
      end;
    LDat := False;
    case dtmAuftrag.qryAuftragsListe.FieldByName('auf_typ').AsInteger of
      10, 40, 50, 53, 59: LDat := True;
    end;
    if Neu then
      CreateNewPosition(IDPosition);
 
    if IDPosition > 0 then
    begin
      OpenSQLSet(qryPosition, 'Select * from AuftragsPositionen where idauftragsposition = ' + IntToStr(IDPosition));
      BerechnePosition;
 
      F := TfrmPosition.Create(nil);
 
      try
        F.ShowModal;
 
// Hier findet der Spuk statt:
 
        if DoSave = True then
        begin
          if qryPosition.State = dsEdit then
            qryPosition.ApplyUpdates;
          qryPosition.Connection.Commit;
          if qryPosition.FieldByName('fk_posart').AsInteger=2 then
             ExecSQLDirect(dtmBasis.qrySQL,'Update AuftragsPositionen set apo_artikelgruppe=0 '+
             'where idauftragsposition=' + qryPosition.FieldByName('idauftragsposition').AsString);
 
          qryPositionsListe.Refresh;
          qryPositionsListe.Locate('idauftragsposition', qryPosition.FieldByName('idauftragsposition').AsInteger, []);
          Result := True;
        end
        else
        begin
// Hier kommt das Programm nie hin
          qryPosition.Connection.Rollback;
          Result := False;
        end;
      finally
        FreeAndNil(F);
      end;
    end;
  end;
end;           
 
 
 
 
{ TfrmPosition }
 
procedure TfrmPosition.btnSpeichernClick(Sender: TObject);
begin
  DoSave := True;
  Close;
end;
 
procedure TfrmPosition.btnVerwerfenClick(Sender: TObject);
begin
  if MessageDlg('Sollen wirklich alle Änderungen verworfen werden?', mtWarning, [mbYes, mbNo], 0) = mrYes then
  begin
    DoSave := False;
    Close;
  end;
end
 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 581
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon af0815 » 27. Apr 2018, 13:59 Re: Boolean-Prüfung funktioniert nicht

Irgendwie schon komisch !

a) DoSave in den implementationsteil, oder MUSS es zwingend im Interface stehen. Damit es zumindest nur unitglobal ist.
b) DoSave zwingend vor der Verwendung initialisieren
c) Abfrage immer mit Klammer versehen
IF (DoSave = true) THEN

Wenn du Fenster Modal öffnest, so würde ich das ModalResult nehmen für die Entscheidung. Ich vermeide soweit es geht globale Variablen. Unitglobal, ja wenn es wirklich Sinn macht.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3472
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 27. Apr 2018, 14:16 Re: Boolean-Prüfung funktioniert nicht

ModalResult ?

Kenne ich nicht, muss ich mir ansehen.
Das kann hier aber auch nicht helfen.

DoSave muss innerhalb dieser einen Unit erreichbar sein.

Muss aber jetzt erst mal zu einem Kunden...

Zwischenergebnis:;

1. In den Implementation-Teil verschoben, hilft nichts
2. Aus If DoSave=True then wieder If DoSave Then gemacht, hilft nichts

Das ganze ist total unlogisch und im Moment zweifle ich wirklich an Lazarus. So etwas darf nicht passieren!
Wenn ein Initialisierungsfehler vorliegt, muss der Compiler darauf hinweisen. Einfach einen Boolean, welcher definitiv auf False steht als True zu interpretieren hat fatale Folgen! - Oder sollte ich mich täuschen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 581
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon wp_xyz » 27. Apr 2018, 15:56 Re: Boolean-Prüfung funktioniert nicht

Ähnliches Verhalten hatte ich auch schon. Bist du sicher, dass alle Quellcodes aktuell comiliert sind (alle ppu's manuell löschen)? Gibt es eine zweite Version deines Quelltexts, die unbeabsichtigt aufgeruften wird?
wp_xyz
 
Beiträge: 2620
Registriert: 8. Apr 2011, 08:01

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste

porpoises-institution
accuracy-worried