AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

if..then..else Konstrukt

Ein Thema von Delbor · begonnen am 21. Jun 2022 · letzter Beitrag vom 21. Jun 2022
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

if..then..else Konstrukt

  Alt 21. Jun 2022, 13:06
Delphi-Version: 11 Alexandria
Hi zusammen

Ich habe hier ein Demoprogramm mit einem für mich doch recht exotischen Konstrukt:
Delphi-Quellcode:
// 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; *}
Im ersten Teil ist das if..then..else-Konstrukt für mich eher gewöhnungsbedürftig, dürfte so aber durchaus möglich sein.
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 13:12
"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:
if Selecting then
if SelectedIndex >= 0 then
begin
  ...
end;
Besser:
Delphi-Quellcode:
if Selecting then
  if SelectedIndex >= 0 then
  begin
    ...
  end;
Gut:
Delphi-Quellcode:
if Selecting then
begin
  if SelectedIndex >= 0 then
  begin
    ...
  end;
end;
Alle 3 Versionen funktionieren am Ende gleich.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
563 Beiträge
 
Delphi XE6 Enterprise
 
#3

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 13:16
Die Einrückung irritiert.
Zudem würde ich statt
Code:
if Selecting then
if SelectedIndex >= 0 then begin ... end
eher schreiben
Code:
if Selecting and (SelectedIndex >= 0) then begin ... end
denn das macht es viel klarer.
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
615 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 13:40
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:
  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;
Also sind es eigentlich zwei Blöcke.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 14:29
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:
')' erwartet, aber '.' gefunden in Klasse TViewerFormMain.
Dabei hatte ich erst einen Prozedurkopf angelegt mit begin..end und wollte die Deklaration mit Shift/Ctrl+C anlegen. Wo der Punkt ist, ist keine Frage, aber die Klammer könnte in wirklichkeit auch ein fehlendes end sein - und das im kompletten Code über dem Punkt. Da wünsche ich mir schon mal viel Spass...

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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 17:48
Die Einrückung irritiert.
Zudem würde ich statt
Code:
if Selecting then
if SelectedIndex >= 0 then begin ... end
eher schreiben
Code:
if Selecting and (SelectedIndex >= 0) then begin ... end
denn das macht es viel klarer.

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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 18:21
Code:
if Selecting and (SelectedIndex >= 0) then begin ... end
Das geht für mich so garnciht, weil cih so keien Breakpint auf den Teil nach then setzen kann. Daher mache ich nach jedem then eine neue Zeile. Ob dann eine begin/end block kommt hängt davon ab, ob dieser aus mehr als einer Statementzeile besteht.

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:
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 18:57
Wo der Punkt ist, ist keine Frage, aber die Klammer könnte in wirklichkeit auch ein fehlendes end sein - und das im kompletten Code über dem Punkt. Da wünsche ich mir schon mal viel Spass...
Automatische Codeformatierung ausführen, dann siehst du sofort, wo das Problem liegt...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#9

AW: if..then..else Konstrukt

  Alt 21. Jun 2022, 19:27
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Jun 2022 um 19:33 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz