Autor Beitrag
BeniSchindler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win 2k / suse9.1
D7 Prof / Kylix 3
BeitragVerfasst: Mo 28.03.11 21:48 
Ich habe folgendes Problem:

Ich benutze Woll2Woll komponenten um DB-Grids anzuzeigen.
Es hat bisher immer alles wunderbar funktioniert.

Nun gibt der compiler auf einmal Access Violations aus, wenn ich diese Komponenten verwenden will.
Wenn ich die Stelle begutachte wo er aussteigt, muss ich auch sagen, dass ich diese auch fehlerhaft programmiert finde.

Sie schreiben folgende Art von if-Statements:

ausblenden Delphi-Quelltext
1:
2:
if aObject <> nil and aObject.parent is TForm then
  do something;


Nun ist es für mein Verständnis jedoch normal, dass das Programm austeigen muss, wenn aObject = nil ist.
Oder sehe ich da etwas falsch? Oder kann man dem Compiler irgendwo sagen, dass er den zweiten if-Part nicht prüft, wenn der erste nicht true ist.

ich selber dachte bisher immer man müsste es fogender masen programmieren:


ausblenden Delphi-Quelltext
1:
2:
3:
if aObject <> nil then
 if aObject.parent is TForm then
   do something;



Haben die Fehlerhaft programmiert? Oder habe ich ausversehen etwas falsch im compiler eingestellt.
Aber warum hat es dann bisher immer funktioniert?

_________________
Result := 42; Application.ProcessMessages;
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 28.03.11 21:50 
Funktioniert denn die zweite Variante überhaupt? Aber normalerweise müsste er schon bei der linken Hälfte der if-Abfrage aufhören, wenn diese false ergibt. Mal Klammern probiert?
ausblenden Delphi-Quelltext
1:
if (aObject <> niland (aObject.parent is TForm) then					
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mo 28.03.11 22:06 
soweit ich weiß, wird bei AND immer erstmal nur das erste statement geprüft - Allerdings habe ich keine Ahnung ;) Klammern sind trotzdem nötig.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 28.03.11 22:13 
Die entsprechende Compilereinstellung nennt sich vollständige boolesche Auswertung. Wenn {$BOOLEVAL OFF} gesetzt ist (Standardeinstellung), wird ein boolescher Ausdruck nur so weit analysiert bis das Ergebnis feststeht.

Wenn die Direktive gesetzt ist, wird alles ausgewertet. Deshalb ist es sehr wichtig diese Direktive selbst direkt vor dem betroffenen Code ein-/auszuschalten, wenn man sich darauf verlässt, dass sie entsprechend gesetzt ist...
BeniSchindler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win 2k / suse9.1
D7 Prof / Kylix 3
BeitragVerfasst: Di 29.03.11 15:26 
@jaenicke: Vielen Dank! Das war genau die Einstellung die ich gesucht habe.

Nachdem ich vor alle kritischen Abschnitte von der gekauften Komponente {$BOOLEVAL OFF} geschrieben habe, funktoiniert sie wieder einwand frei. Was jedoch komisch ist, ich muss es tatsächlich bei allen Abschnitten wieder neu davor schreiben.
Einmal am anfang des Projekts reicht komischer weise nicht.

Mein Compiler scheint irgendwo her auf einmal immer {$BOOLEVAL ON} zu bekommen, und ich weiss nicht wieso.
Das war bis vorgestern nicht so.

Egal, auf jeden Fall habe ich wieder ein funktionierendes Programm.
So kann man auch nach 15Jahren programmieren noch etwas über so einfache sachen wie IF-Abfragen lernen :)

@alle:

Wegen der Klammern - Stimmt, da habe ich beim beispiel Code schreiben nicht aufgepasst :)
Und die zweite Variante ist die, wie man es programmieren müsste wenn {$BOOLEVAL ON} ist, damit keine Zugriffsverletzungen auftreten. ... Und wieso sollte sie nicht funktionieren?

Wobei ich auch da schlampigen Beispielcode geschrieben habe. "do something" sollte nicht die Delphi direktive "do" sein sondern für einen beliebigen Prozeduraufruf stehen. :)

Euch allen einen schönen Tag und nochmal vielen Dank!
Beni

_________________
Result := 42; Application.ProcessMessages;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 29.03.11 15:52 
user profile iconBeniSchindler hat folgendes geschrieben Zum zitierten Posting springen:
Mein Compiler scheint irgendwo her auf einmal immer {$BOOLEVAL ON} zu bekommen, und ich weiss nicht wieso.
Vielleicht aus den Projektoptionen (Verzeichnisse/Bedingungen --> Definition, bzw. bei neueren Delphiversionen: Delphi-Compiler --> Bedingungen)? Oder direkt unter Compiler die Option? ;-)