Autor Beitrag
Timm3r
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 10.09.10 18:28 
Guten Tag zusammen,

habe gerade das folgende Programm geschrieben:

ausblenden 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 user profile iconKha: Delphi-Tags hinzugefügt
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 10.09.10 18:43 
Hi und :welcome: im Forum!

Zunächst, niemals auf True prüfen! Warum? (Boolean Tutorial) :mahn: :zwinker:
Darüberhinaus, was genau funktioniert denn nicht?

Grüße
Marc

Für diesen Beitrag haben gedankt: F34r0fTh3D4rk
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 10.09.10 18:58 

_________________
Markus Kinzler.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Fr 10.09.10 19:14 
user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
Hi und :welcome: im Forum!

Zunächst, niemals auf True prüfen! Warum? (Boolean Tutorial) :mahn: :zwinker:
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 ;) ?


user profile iconTimm3r hat folgendes geschrieben Zum zitierten Posting springen:
Guten Tag zusammen,

habe gerade das folgende Programm geschrieben:

ausblenden 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 user profile iconKha: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Fr 10.09.10 19:38 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:

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

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 11.09.10 08:06 
user profile iconTimm3r hat folgendes geschrieben Zum zitierten Posting springen:
Guten Tag zusammen,

habe gerade das folgende Programm geschrieben:

ausblenden 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 user profile iconKha: 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:

ausblenden 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;                
//
// "if xx=TRUE then" ist identisch mit "if xx then"
//


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 09:51 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
//
// "if xx=TRUE then" ist identisch mit "if xx then"
//
Setzen, 6. Das ist schlicht falsch. Siehe mein Beispiel im Post über dir.

Nur weil es meistens das Gewünschte macht ist es noch lange nicht richtig und schon gar nicht identisch.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 10:14 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 10:19 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.09.10 10:25 
Nichts, ich hatte mich verguckt, ich hatte das "=True" auch in deinem Quelltext gesehen. :gruebel:
Tut mir leid, nur wegen dem Kommentar hätte ich das nicht geschrieben.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Sa 11.09.10 11:52 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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.

ausblenden 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:

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 11.09.10 13:25 
Nein, aber nicht
ausblenden 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.