Autor |
Beitrag |
Timm3r
Hält's aus hier
Beiträge: 11
|
Verfasst: Fr 10.09.10 18:28
Guten Tag zusammen,
habe gerade das folgende Programm geschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.AmpelUmschaltenClick(Sender: TObject); begin if imAmpelRot.Visible=True
then begin imAmpelRot.Visible:=False imAmpelRotGelb.Visible:=True end else if imAmpelRotGelb.Visible=True then begin imAmpelRotGelb.Visible:=False imAmpelGruen.Visible:=True end else if ImAmpelGruen.Visible=True then begin ImAmpelGruen.Visible:=False ImAmpelGelb.Visible:=True end else ImAmpelGelb.Visible:=False ImAmpelRot.Visible:=True end;
end. |
Das ist halt so ne Ampel die die ganze Zeit umgeschaltet werden soll aber ich rall nicht wierklich was an dem Programm falsch sein soll.
Kann mir einer von euch sagen, wie ich das ändern soll?
Danke im Voraus!
Moderiert von Kha: Delphi-Tags hinzugefügt
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Fr 10.09.10 18:42
Wer sagt denn das etwas falsch ist?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 10.09.10 18:43
Hi und  im Forum!
Zunächst, niemals auf True prüfen! Warum? (Boolean Tutorial)
Darüberhinaus, was genau funktioniert denn nicht?
Grüße
Marc
Für diesen Beitrag haben gedankt: F34r0fTh3D4rk
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 10.09.10 18:58
_________________ Markus Kinzler.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 10.09.10 19:09
Erstens fehlen die Semikola am Zeilenende, das sollte dir der Compiler aber auch sagen, dass er jeweils ein ; vermisst.
Zweitens fehlt beim letzten else das begin.
// EDIT:
Ich seh schon, steht auch im Crosspost schon, ganz übersehen.
|
|
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Fr 10.09.10 19:14
Marc. hat folgendes geschrieben : | Hi und im Forum!
Zunächst, niemals auf True prüfen! Warum? (Boolean Tutorial)
Darüberhinaus, was genau funktioniert denn nicht?
Grüße
Marc |
Hallo Marc,
Das Tutorial kannte ich nicht. Jedoch habe ich hierzu eine Frage.
Zitat: | In Delphi ist False 0 und 1 ist True, wobei alles andere erstmal nicht vorgesehen ist. |
Wenn dem so ist, dürfte man ja von der Definition auch nicht davon ausgehen, dass ein Aufruf, der -1 (wie im Tutorial) zurück gibt, True oder False ist.
Im Beispiel, welches Timmer aufgezeigt hat, kann es nur 2 Zustände geben: Visible oder not(Visible).
Da er ja auf if Visible=True prüft, ergibt das in seinem konkreten Beispiel Wahr oder Falsch.
Ob das bei anderen Dingen später noch genau so funktioniert, ist erst einmal egal.
Warum hast Du aber nicht seine Frage beantwortet  ?
Timm3r hat folgendes geschrieben : | Guten Tag zusammen,
habe gerade das folgende Programm geschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.AmpelUmschaltenClick(Sender: TObject); begin if imAmpelRot.Visible=True
then begin imAmpelRot.Visible:=False imAmpelRotGelb.Visible:=True end else if imAmpelRotGelb.Visible=True then begin imAmpelRotGelb.Visible:=False imAmpelGruen.Visible:=True end else if ImAmpelGruen.Visible=True then begin ImAmpelGruen.Visible:=False ImAmpelGelb.Visible:=True end else ImAmpelGelb.Visible:=False ImAmpelRot.Visible:=True end;
end. |
Das ist halt so ne Ampel die die ganze Zeit umgeschaltet werden soll aber ich rall nicht wierklich was an dem Programm falsch sein soll.
Kann mir einer von euch sagen, wie ich das ändern soll?
Danke im Voraus!
Moderiert von Kha: Delphi-Tags hinzugefügt |
Ja, kann ich:
beim letzten end else hast Du ein begin und ein end; vergessen. Dadurch wird immer mit ImAmpelRot.Visible:=True die Ampel auf ROT gesetzt, wenn Du einen Button(?) drückst.
Edit: Huch, ein Quersender  ?
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 10.09.10 19:38
trm hat folgendes geschrieben : |
Wenn dem so ist, dürfte man ja von der Definition auch nicht davon ausgehen, dass ein Aufruf, der -1 (wie im Tutorial) zurück gibt, True oder False ist.
Im Beispiel, welches Timmer aufgezeigt hat, kann es nur 2 Zustände geben: Visible oder not(Visible).
Da er ja auf if Visible=True prüft, ergibt das in seinem konkreten Beispiel Wahr oder Falsch. |
Also erstmal zu den -1: Soweit ich das in Erinnerung habe, wird beim if / while / usw. 0 als False und alles andere als True interpretiert. Eben deshalb. Wenn er allerdings auf die Konstante True, die als 1 definiert ist, prüft, ist der Vergleich false, da (-1 - 1) alles andere als null ist.
Bei Delphi-only ist das egal. Es ist jedoch sinnvoll, diesen Vergleich wegzulassen. Das hat zwei Gründe:
1. Irgendwann wundert man sich, wenn man mit einem C-Programm kommuniziert (was True nicht als 00000001, sondern als 11111111, also -1, definiert; incl. Windows-API), dass es nicht klappt.
2. Wenn man wirklich verstanden hat, wie Kontrollstrukturen funktionieren, ist es die einzig logische Weise. Du würdest ja auch nicht schreiben
Delphi-Quelltext 1: 2: 3: 4:
| if (a = b) = True then begin ... end; |
Anfänger denken meistens, dass muss bei if irgendeine Bedingung sein, irgendwas mit =, <, >, ... Aber sie wissen nicht, dass Boolean dahinter steckt. Und dann kommt auch irgendwann Code wie
Delphi-Quelltext 1: 2: 3: 4:
| if a = True then b := False else b := True; |
anstatt b := not a; heraus. Ich weiß allerdings nicht, in wie weit Delphi da optimiert. Alle, die einen Delphi-Compiler zur Hand haben, können das ja mal eben schnell ausprobieren. Ich könnte mir das durchaus vorstellen, aber es ist trotzdem Schrott, weil es die Lesbarkeit herabsetzt.
Für diesen Beitrag haben gedankt: Hidden, Mitmischer 1703
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 05:29
Hier habe ich mal ein kleines Beispiel gebastelt, wann das mit dem Vergleich auf True schief geht:
www.delphi-forum.de/....php?p=548760#548760
Und warum das auch vollkommen unlogisch ist:
www.delphi-forum.de/....php?p=560637#560637
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 11.09.10 08:06
Timm3r hat folgendes geschrieben : | Guten Tag zusammen,
habe gerade das folgende Programm geschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.AmpelUmschaltenClick(Sender: TObject); begin if imAmpelRot.Visible=True
then begin imAmpelRot.Visible:=False imAmpelRotGelb.Visible:=True end else if imAmpelRotGelb.Visible=True then begin imAmpelRotGelb.Visible:=False imAmpelGruen.Visible:=True end else if ImAmpelGruen.Visible=True then begin ImAmpelGruen.Visible:=False ImAmpelGelb.Visible:=True end else ImAmpelGelb.Visible:=False ImAmpelRot.Visible:=True end;
end. |
Das ist halt so ne Ampel die die ganze Zeit umgeschaltet werden soll aber ich rall nicht wierklich was an dem Programm falsch sein soll.
Kann mir einer von euch sagen, wie ich das ändern soll?
Danke im Voraus!
Moderiert von Kha: Delphi-Tags hinzugefügt |
Ich denke, das liegt an dem Quelltext. Das Ganze ist in einer Zeile!!
Schreibe doch besser alles mit begin .. end, dann ist das Ganze übersichtlicher. Ich hoffe, so wie ich es hier schreibe, wird das, was Du willst, klarer:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| if imAmpelRot.Visible then begin imAmpelRot.Visible:=False; imAmpelRotGelb.Visible:=True; end else if imAmpelRotGelb.Visible then begin imAmpelRotGelb.Visible:=False; imAmpelGruen.Visible:=True; end else if imAmpelGruen.Visible then begin imAmpelGruen.Visible:=False; imAmpelGelb.Visible:=True; end else begin imAmpelGelb.Visible:=False; imAmpelRot.Visible:=True; end; |
Das Entscheidende ist immer die Übersichtlichkeit des Quelltextes. Deswegen mag ich auch C nicht, denn da kann man alles in eine Zeile packen. Wenn dann ein Problem auftritt weiß man nicht, wo dies liegt, weil alles in einer Zeile ist.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 09:51
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 11.09.10 10:07
Lieber Sebastian,
Danke für Deine Belehrung. Aber für mich ist - und sicher auch für den Compiler ist es so - dass eine doppelt gemoppelte Schreibweise nicht verkehrt sondern nur unnötig ist. Wahrscheinlich wird der Compiler dies automatisch löschen. Aber dazu weiß ich als einer, der eben eine 6 von einem Oberlehrer bekommen hat, doch wohl zuwenig.
Vielleicht hätte Herr Oberlehrer sich mit den wirklichen Fehlern des Quelltextes auseinandersetzen sollen, statt auf Nickeligkeiten herumzureiten!!!
Aber danke noch mal für die 6.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 10:14
Tranx hat folgendes geschrieben : | Aber für mich ist - und sicher auch für den Compiler ist es so - dass eine doppelt gemoppelte Schreibweise nicht verkehrt sondern nur unnötig ist. |
In diesem Fall ja. Aber eben nicht immer. Und wenn du dir das Beispiel angesehen (oder ausprobiert hättest, wenn ansehen nicht reicht), dann wäre dir das auch klar...
Wenn man sich das dann als Anfänger angewöhnt, wundert man sich hinterher warum andere Quelltexte mit API-Zugriffen nicht funktionieren.
Für diesen Beitrag haben gedankt: F34r0fTh3D4rk
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 11.09.10 10:17
Der Hauptfehler war aber nicht - im vorliegenden Fall - die Vergleiche mit TRUE sondern der Befehlscode in einer Zeile. Deshalb hat das Ganze nicht funktioniert. Vielleicht schaust Du mal mein Beispiel an, und den Quellcode des Fragenden.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 10:19
Tranx hat folgendes geschrieben : | Der Hauptfehler war aber nicht - im vorliegenden Fall - die Vergleiche mit TRUE sondern der Befehlscode in einer Zeile. |
Dass da die Semikola und ein begin fehlten, hatte ich schon gaanz oben geschrieben.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 11.09.10 10:22
Und was ist dann konkret an meinem Code-Vorschlag, das Problem zu lösen - abgesehen von meiner unqualifizierten Kommentarzeile! - falsch???
Geht es nicht darum, dem Fragenden eine Lösung anzubieten, oder nicht?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 11.09.10 10:25
Nichts, ich hatte mich verguckt, ich hatte das "=True" auch in deinem Quelltext gesehen.
Tut mir leid, nur wegen dem Kommentar hätte ich das nicht geschrieben.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 11.09.10 11:52
Tranx hat folgendes geschrieben : | Und was ist dann konkret an meinem Code-Vorschlag, das Problem zu lösen - abgesehen von meiner unqualifizierten Kommentarzeile! - falsch???
Geht es nicht darum, dem Fragenden eine Lösung anzubieten, oder nicht? |
Ja, aber nachdem Marc. darauf hingewiesen hatte und die Diskussion in eine unschöne Richtung lief, musste das Problem einfach geklärt werden. Und es ging AUSSCHLIESSLICH darum, denn, wie jaenicke schon sagte, kam die Lösung zum Problem ganz weit oben bereits.
Übrigens muss ich mich korrigieren.
Jakob_Ullmann hat folgendes geschrieben : | 1. Irgendwann wundert man sich, wenn man mit einem C-Programm kommuniziert (was True nicht als 00000001, sondern als 11111111, also -1, definiert; incl. Windows-API), dass es nicht klappt.
|
Auch C++ definiert true als 1.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| #include <iostream>
int main() { bool a = true; std::cout << static_cast<int>(a) << std::endl; return 0; } |
Und C kennt kein bool. Ändert aber nichts daran, dass API-Funktionen -1 als WAHR nehmen (was meiner Meinung auch mehr Sinn macht, da man dann nicht zwischen bitweisen und logischen Operationen unterscheiden muss).
ÜBRIGENS:
Tranx hat folgendes geschrieben : | Das Entscheidende ist immer die Übersichtlichkeit des Quelltextes. Deswegen mag ich auch C nicht, denn da kann man alles in eine Zeile packen. Wenn dann ein Problem auftritt weiß man nicht, wo dies liegt, weil alles in einer Zeile ist. |
Du kannst auch in Delphi alles in eine Zeile packen. Ich empfinde C, wenn man halbwegs diszipliniert schreibt, mittlerweile als übersichtlicher, da vieles nicht durch Wörter, sondern durch Symbole ({...} statt begin ... end; &&/& statt and, ...) ausgedrückt wird und du besser Quelltext von Struktur trennen kannst, Wenn du aber alles in eine Zeile packst, brauchst du dich nicht zu wundern, wenn es unübersichtlich wird. Es gibt für C genügend Code-Formatierer für alle möglichen Indent-Styles.
Zuletzt bearbeitet von Jakob_Ullmann am Sa 11.09.10 13:08, insgesamt 1-mal bearbeitet
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 11.09.10 11:56
False ist 0 und True <> 0.
Deshalb sollte man nie auf True Testen. Zudem liefert eine Vergleich einen Boolean und man braucht, wenn man schoen einen hat, den nicht mehr Testen
_________________ Markus Kinzler.
|
|
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Sa 11.09.10 13:21
Hi.
Sollte man also, wenn man nicht auf True prüfen sollte, dann generell auf False prüfen?
Also eben statt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if panel1.visible then begin showmessage('panel1 ist sichtbar'); end else begin showmessage('panel1 ist NICHT sichtbar'); end; |
..das hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if not panel1.visible then begin showmessage('panel1 ist NICHT sichtbar'); end else begin showmessage('panel1 ist sichtbar'); end; |
Oder sollte man, so wie ich es ganz gern mache - da ich persönlich else - Konstrukte HASSE (wegen der unübersichtlichkeit - folgendes nutzen:
Delphi-Quelltext 1: 2: 3: 4:
| Case panel1.visible of True: showmessage('panel1 ist sichtbar'); False: showmessage('panel1 ist NICHT sichtbar'); end; |
Oder als Alternative:
Delphi-Quelltext 1: 2: 3: 4:
| if panel1.visible then showmessage('panel1 ist sichtbar'); if not panel1.visible then showmessage('panel1 ist NICHT sichtbar'); |
Was sagen die Profis dazu?
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 11.09.10 13:25
Nein, aber nicht
Delphi-Quelltext 1:
| if panel1.visible = True then |
_________________ Markus Kinzler.
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|