![]() |
Delphi-Version: 11 Alexandria
if..then..else Konstrukt
Hi zusammen
Ich habe hier ein Demoprogramm mit einem für mich doch recht exotischen Konstrukt:
Delphi-Quellcode:
Im ersten Teil ist das if..then..else-Konstrukt für mich eher gewöhnungsbedürftig, dürfte so aber durchaus möglich sein.
// SelectedIndex := XXX.CharacterIndexAtPos(X, Y, Tolerance, Tolerance);
// if (not Selecting) and (XXX.WebLinkAtPos(X, Y) <> -1) then // XXX.Cursor := crHandPoint // else if SelectedIndex >= 0 then // XXX.Cursor := crIBeam // else // XXX.Cursor := crDefault; {* if Selecting then if SelectedIndex >= 0 then begin NeedRepaint := False; if SelectionStart = -1 then begin SelectionStart := SelectedIndex; NeedRepaint := True; end; if SelectionEnd <> SelectedIndex then begin SelectionEnd := SelectedIndex; NeedRepaint := True; end; if NeedRepaint then XXX.Invalidate; end; *} Etwas anders sieht es im zweiten, mit Klammern/Sternchen auskommentierten Teil aus. Die erste Zeile dieses Blocks beginnt mit einem einfachen if..then. Daran schliessen sich mehrere if..then..begin..end einfache Blöcke an. Wenn ich das so lese, müsste, wenn die 1. Zeile nicht zutrifft, die Prozedur beendet werden (beim nächsten, hier nicht gezeigten end). Aber was mich am meisten irritiert ist, dass nach der ersten if-Abfrage mehr als eine Zeile folgt (Folgen kann), die nur in Abhängigkeit dieser Abfrage(true) ausgeführt wird. Wie seht ihr das? Gruss Delbor |
AW: if..then..else Konstrukt
"Mehr als eine Zeile" ist nicht die exakte Regel die gilt wenn kein begin/end genutzt wird. Genauer ist eine Anweisung ODER ein Block.
In dem Fall steht der gesamte "if SelectedIndex >= 0 then"-Block unter dem ersten if. Es ist sehr schlecht und unleserlich eingerückt und man sollte gerade wenn es nicht um wirklich nur 1 Anweisung sondern einen ganzen Block geht begin/end nutzen: Schlecht (so ist es jetzt):
Delphi-Quellcode:
Besser:
if Selecting then
if SelectedIndex >= 0 then begin ... end;
Delphi-Quellcode:
Gut:
if Selecting then
if SelectedIndex >= 0 then begin ... end;
Delphi-Quellcode:
Alle 3 Versionen funktionieren am Ende gleich.
if Selecting then
begin if SelectedIndex >= 0 then begin ... end; end; |
AW: if..then..else Konstrukt
Die Einrückung irritiert.
Zudem würde ich statt
Code:
eher schreiben
if Selecting then
if SelectedIndex >= 0 then begin ... end
Code:
denn das macht es viel klarer.
if Selecting and (SelectedIndex >= 0) then begin ... end
|
AW: if..then..else Konstrukt
Das Einrücken durch die gschweifte Klammer ist mist. Die Klammer muss auf eine extra Zeile. Generell ist das alles auskommentiert zum aktuellen Zeitpunkt. Was soll nun ausgeführt werden? Nur die // oder alles zwischen {**}?
Aufgeräumt sieht das bei mir so aus:
Delphi-Quellcode:
Also sind es eigentlich zwei Blöcke.
SelectedIndex := XXX.CharacterIndexAtPos(X, Y, Tolerance, Tolerance);
if (not Selecting) and (XXX.WebLinkAtPos(X, Y) <> -1) then XXX.Cursor := crHandPoint else if SelectedIndex >= 0 then XXX.Cursor := crIBeam else XXX.Cursor := crDefault; if Selecting then begin if SelectedIndex >= 0 then begin NeedRepaint := False; if SelectionStart = -1 then begin SelectionStart := SelectedIndex; NeedRepaint := True; end; if SelectionEnd <> SelectedIndex then begin SelectionEnd := SelectedIndex; NeedRepaint := True; end; if NeedRepaint then XXX.Invalidate; end; end; |
AW: if..then..else Konstrukt
Hi zusammen
Danke für eure Antworten. Persönlich halte ich es auch so, dass ich auch da ein begin..end setze, wo es eigentlich nicht nötig wäre, ausser so ein Einzeiler steht gut erkennbar alleine. Ich hab gerade jetzt wieder so einen Fall, dass Delphi meint: Zitat:
Ach ja: Ich habe den oben auskommentierten Code aus dem bisherigen Eventhandler ins 'Zwischenarchiv' verschoben und durch eigenen Code (zT. von hier) ersetzt. Und genau da muss ich mir die Sache 'eingebaut' haben. @Sinspin : Ich habe den Code auskommentiert, weil ich ihn zumindest vorerst nicht mehr brauche - da ich ihn noch nicht wirklich verstehe, hab ich ihn auch noch nicht gelöscht. Zwei verschiedene Auskommentierungen habe ich verwendet, um die einzelnen Codezeilen/Abschnitte zu verdeutichen Gruss Delbor |
AW: if..then..else Konstrukt
Zitat:
Ich sehe es genau anders herum. Die zwei If-Anweisungen kann man viel besser debuggen. Einfach durchsteppen ohne den Inhalt der Variablen ansehen zu müssen. |
AW: if..then..else Konstrukt
Zitat:
Delphi-Quellcode:
if a = b then
c := a; if a = b then begin c := a; d := b; end; if a = b then begin if a = b then begin c := a; d := b; end; end: |
AW: if..then..else Konstrukt
Zitat:
|
AW: if..then..else Konstrukt
Ob ein oder zwei IF ... meistens Geschmackssache.
Aber wenn man auf die saudämiche Idee kommen sollte die "vollständige boolische Auswertung" zu aktivieren, dann sind zwei IFs eh oft zwingend notwendig. Ich tendiere eher zum AND und Andere machen das dann wieder "kaputt", indem sie jeden AND/OR/+/...-Teil auf eine neue Zeile schieben. Aber ist auch OK, allerdings nehme ich dann die Operatoren nach vorhne, damit man direkt erkennt, dass es da weitergeht, während Andere die Operatoren gern hinten "verstecken". unvmm. Das mit dem Haltepunkt stimmt auch nicht ganz, denn du kannst den Haltepunkt auch im Assembler auf den Teil hinterm AND setzen. (könnte man über einen netten Debughelper bestimmt auch aus der PAS erledigen) Außerdem reicht auch ein Haltepunkt zu Beginn und dann sieht man sich eben die Werte im Debugger an (dafür ist er ja da), oder gibt es als "Bedingung" für den Haltepunkt an. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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 by Thomas Breitkreuz