![]() |
Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Eine kleine Verständnisfrage hätte ich.
Wenn bei folgender If-Konstruktion A = B bereits zutrifft, wird C = D dann noch überprüft oder nicht? Das Frage ich mich schon seit langer Zeit
Delphi-Quellcode:
if (A = B) or (C = D) then
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
![]() ![]() Kurze Antwort: Nein. Etwas längere Antwort: Nein, es sei denn du hast in den Projekt-Optionen "Vollständige boolsche Auswertung" aktiviert (warum sollte man so etwas tun?) |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Oder wenn Du es testen willst:
Delphi-Quellcode:
procedure TfrmMain.Button3Click(Sender: TObject);
var myPanel: TPanel; begin if (1=1) or (myPanel.Name = 'test') then showmessage('a'); if (myPanel.Name = 'test') or (1=1) then showmessage('b'); end; |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Müsste das nicht *Puff* machen? Immerhin greifst Du auf die Eigenschaft einer Instanzvariablen ohne Instanz zu.
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Ach, wenn das so gedacht war, habe ich nichts gesagt :)
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
:) Hätte es in der Tat mehr ausführen können.
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Wollte auch erst schreiben dass ich nicht verstehe wie das ein Test sein soll.
Und dann kam grad vorher noch DeddyHs Post und erst dann kam die Erleuchtung :mrgreen: |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Wobei myPanel nicht initialisiert ist ... Wenn da "zufällig" ein Wert drin steht, der einen Zeiger auf ein TComponent darstellt, dann knallt es nicht. :stupid:
PS:
Delphi-Quellcode:
->
{$BOOLEVAL ON}
![]() Hmmmmm, was ist mit XOR? Zitat:
Und ja, bei Delphi stimmt es, aber z.B. bei PostgrSQL muß man aufpassen. Die Optimierung kann da diese Prüfungen austauschen/umdrehen und dann knallt's. UND, in C-Sprachen ist die Auswertungsreihenfolge der Operatoren andersrum, als im Delphi. ( == vor AND statt AND vor =) |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
Der Unterschied liegt in der Heftigkeit des Schubs, den man braucht, um zu bemerken wie nah der Tellerrand ist. Gruß K-H |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Och, man gewöhnt sich an fast alles.
Dafür muß man in C noch 'ne Klammer um Alles drum machen, was dann auch viele wieder in Delphi nachmachen.
Delphi-Quellcode:
Und so mancher macht so viele (unnötige) Klammern, dass man erstmal schauen muß was wo anfängt und aufhört.
if (...) {
} if (...) then begin end; if ... then begin end; |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
Das hat Delphi, wie immer, natürlich nicht, obwohl es hunderte Euros kostet. |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
Und ich gehöre auch zu denen, die bei if .. then lieber gleich ein begin..end anhängen, weil es sich so leichter erweitern lässt. Macht man überall nur ein if .. then machwas else machwasanderes; und will noch eine zweite Anweisung innerhalb des if-Blockes anhängen, produziert man entweder einen Logikfehler, wenn das begin..end fehlt oder muss es auch wieder ergänzen. |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Das ist zwar jetzt total OffTopic aber...
kann ich mein Delphi irgendwie reparieren und FireMonkey nachinstallieren? Denn ohne den Affen funktioniert CnPck nicht. |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
|
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Ich hab grade im XE einen eigenartigen Fehler gefunden.
Da sucht man sich echt dumm und dusselig danach, wenn das ab und an in einen OnPopup auftritt, denn die erste Codezeile läuft erfolgreich durch und die Zweite knallt, mit einer wunderschönen Zugriffsverletzung. Obj.Count=0 und daher löst Obj.Prop[0] eine Exception aus.
Delphi-Quellcode:
Hatte erst geschaut, ob {$BoolEval} ausversehn aktiv ist, aber nee.
xxx.Enabled := (Obj.Count = 1) and (Obj.Prop[0].GetVariant('ein String') = 'xxx');
xxx.Enabled := (Obj.Count = 1) and not Obj.Prop[0].GetVariant('ein Boolean'); Es knallt einfach, wenn ein implizier Cast auftritt, weil trots {$BoolEval off} der Getter ausgeführt wird und bei einem explizitem VarAsBool oder Boolean-Cast drumrum, passiert das nicht.
Delphi-Quellcode:
Nach Analyse des Codes, seh ich, dass der Compiler nicht den zweiten Paramter in einen Boolean castet und dann einfach nur ein AND macht,
xxx.Enabled := (Obj.Count = 1) and not Obj.Prop[0].GetVariant('ein Boolean'); // knallt
xxx.Enabled := (Obj.Count = 1) and not Boolean(Obj.Prop[0].GetVariant('ein Boolean')); // knallt nicht xxx.Enabled := (Obj.Count = 1) and not VarAsBool(Obj.Prop[0].GetVariant('ein Boolean')); // knallt och ni sondern es wird der erste Parameter in einen Variant gecastet und dann das Ganze in
Delphi-Quellcode:
reingequetscht.
VarAnd(variant, variant): boolean
Tolle Leisung, vom Compiler. :thumbsup: xxx.Enabled := (Obj.Count = 1) and not VarToBool(Obj.Prop[0].GetVariant('ein Boolean')); // das IMHO Logische xxx.Enabled := VarAnd(VarFromBool(Obj.Count = 1), VarNot(Obj.Prop[0].GetVariant('ein Boolean'))); // die Idee des Compiler
Code:
// VarAsBool
mov eax,[ebp-$04] mov eax,[eax+$00000430] call $0ea6d894 // GetCount dec eax jnz $0ea7bc20 xor edx,edx mov eax,[ebp-$04] mov eax,[eax+$00000430] call $0ea6d89c // GetProp lea ecx,[ebp-$38] mov edx,$0ea7c150 call $0ea6d98c // GetVariant lea eax,[ebp-$38] call $0ea53264 // VarAsBool test al,al jz $0ea7bc24 xor edx,edx jmp $0ea7bc26 mov dl,$01 mov eax,[ebp-$04] mov eax,[eax+$000004e4] call $0ea53024 // SetEnabled // Boolean mov eax,[ebp-$04] mov eax,[eax+$00000430] call $0ea6d894 // GetCount dec eax jnz $0ea7bc89 xor edx,edx mov eax,[ebp-$04] mov eax,[eax+$00000430] call $0ea6d89c // GetProp lea ecx,[ebp-$48] mov edx,$0ea7c150 call $0ea6d98c // GetVariant lea eax,[ebp-$48] call $0ea51668 // VarToBool test al,al jz $0ea7bc8d xor edx,edx jmp $0ea7bc8f mov dl,$01 mov eax,[ebp-$04] mov eax,[eax+$000004e4] call $0ea53024 // SetEnabled // implizit mov eax,[ebp-$04] mov eax,[eax+$00000430] call $0ea6d894 // GetCount dec eax setz dl lea eax,[ebp-$58] call $0ea51680 // VarFromBool lea eax,[ebp-$58] push eax xor edx,edx mov eax,[ebp-$04] mov eax,[eax+$00000430] call $0ea6d89c // GetProp <- hier knallt's dann lea ecx,[ebp-$68] mov edx,$0ea7c150 call $0ea6d98c // GetVariant lea eax,[ebp-$68] call $0ea516a8 // VarNot lea edx,[ebp-$68] pop eax call $0ea516f0 // VarAnd lea eax,[ebp-$58] call $0ea51668 // VarToBool mov edx,eax mov eax,[ebp-$04] mov eax,[eax+$000004e4] call $0ea53024 // SetEnabled |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Delphi-Quellcode:
Ich kenne es nur so
xxx.Enabled := (Obj.Count = 1) and not VarToBool(Obj.Prop[0].GetVariant('ein Boolean')); // das IMHO Logische
//
Delphi-Quellcode:
Aber hier sieht man mal wie schön der Compiler alles umänert.
xxx.Enabled := (Obj.Count = 1) and (not VarToBool(Obj.Prop[0].GetVariant('ein Boolean')));
//
Delphi-Quellcode:
xxx.Enabled := VarAnd(VarFromBool(Obj.Count = 1), VarNot(Obj.Prop[0].GetVariant('ein Boolean'))); // die Idee des Compiler
// |
AW: Verständnisfrage: IF (Bedingung1 ODER Bedingung1)
Zitat:
Also, die Vorzeichen (+/-) kommen immer zuerst, dann sogleich das NOT und erst danach wird der ganze Rest ausgewertet. (andersrum kann man +/- und NOT eh nicht schreiben, außer man klammert, also ist quasi Beides gleichrangig und kommt "immer zuerst dran") Ich kenn aber zuviele, die benutzen NOT wie eine Funktion und schreiben das dann auch so. :wall::freak:
Delphi-Quellcode:
xxx.Enabled := (Obj.Count = 1) And Not(VarToBool(Obj.Prop[0].GetVariant('ein Boolean')));
geklammert wird das dann auch oftmals
Delphi-Quellcode:
xxx.Enabled := (Obj.Count = 1) And (Not(VarToBool(Obj.Prop[0].GetVariant('ein Boolean'))));
Leerzeichen gibt es nicht und um alles kommt sowieso nochmal 'ne Klammer drum.
Delphi-Quellcode:
xxx.Enabled:=((Obj.Count=1)And(Not(VarToBool(Obj.Prop[0].GetVariant('ein Boolean')))));
Aber hier muß man eh zuviele Klammern machen, denn sonst müsste man ja ein Leerzeichen einfügen, damit es nicht
Delphi-Quellcode:
heißt :lol:
xxx.Enabled:=(Obj.Count=1)AndNotVarToBool(Obj.Prop[0].GetVariant('ein Boolean'));
Und wenn man schon konsequent alles klammert, dann doch bitte richtig. :angle2:
Delphi-Quellcode:
xxx.Enabled:=(((Obj.Count)=(1))And(Not(VarToBool(Obj.Prop[0].GetVariant('ein Boolean')))));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz