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



BeitragVerfasst: Sa 18.09.10 12:49 
Guten Tag zusammen,

habe das folgende Programm geschrieben:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
      if ImSonne.Visible=true
      
      then begin

      if ImSonne.left<450
      then begin
          ImSonne.Left:=ImSonne.Left+10;
          ImSonne.Top:=ImSonne.Top-10;
      end;


      if ImSonne.Visible=true

      then begin
      if ImSonne.Left>450
      then begin

      if ImSonne.Left<900
          then begin
          ImSonne.Left:=ImSonne.Left+10;
          ImSonne.Top:=ImSonne.Top+10;
      end;

      if ImSonne.Left>900

      then begin
          ImSonne.visible:=false;
          ImMond.visible:=true;
      end;


      if ImMond.visible=true

       then begin
      if ImMond.Left>395
      then begin
          ImMond.Left:=ImMond.left-8;
          ImMond.Top:=ImMond.Top-7;
      end;




      if ImMond.Left<395
      then begin
      if ImMond.Left>16
      then begin
          ImMond.Left:=ImMond.Left-9;
          ImMond.Top:=ImMond.Top+12;
      end;


      if ImMond.Left<16
      then begin
          ImMond.Visible:=false;
          ImMond.Left:=864;
          ImSonne.Left:=16;
          ImSonne.Visible:=true;
      end
end;
end;
end;
end;
end;
end;
end.


Die Sonne geht auf und unter aber der mond bleibt stehen.

was soll ich machen?

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 18.09.10 13:04 
Moin!

Formatiere deinen Quelltext mal :shock: ;) :!:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if ImSonne.Visible then begin
    if ImSonne.left < 450 then begin
      ImSonne.Left := ImSonne.Left + 10;
      ImSonne.Top := ImSonne.Top - 10;
    end;
    if ImSonne.Visible then begin
      if ImSonne.Left > 450 then begin
        if ImSonne.Left < 900 then begin
          ImSonne.Left := ImSonne.Left + 10;
          ImSonne.Top := ImSonne.Top + 10;
        end;
        if ImSonne.Left > 900 then begin
          ImSonne.Visible := false;
          ImMond.Visible := true;
        end;
        if ImMond.Visible then begin
          if ImMond.Left > 395 then begin
            ImMond.Left := ImMond.left - 8;
            ImMond.Top := ImMond.Top - 7;
          end;
          if ImMond.Left < 395 then begin
            if ImMond.Left > 16 then begin
              ImMond.Left := ImMond.Left - 9;
              ImMond.Top := ImMond.Top + 12;
            end;
            if ImMond.Left < 16 then begin
              ImMond.Visible := false;
              ImMond.Left := 864;
              ImSonne.Left := 16;
              ImSonne.Visible := true;
            end;  //; eingefügt
          end;
        end;
      end;
    end;
  end;
end;


Wie du jetzt sehen kannst, wird der gesamte Programmblock nur ausgeführt, wenn Sonne.Visible ist. Kann ja nicht gehen :nixweiss:
Den Rest überlasse ich mal dir, ich kann irgendwie gerade nur sehen, was der Code dem Computer sagt - nicht, was du sagen wolltest :P

lg,

*Vergleiche auf true/false
*Crashkurs von Christian S.

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Timm3r Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 18.09.10 14:14 
Nein,

das sind ja alles getrennte if-sätze, deshalb wird alles nur ausgeführt wenn die entsprechenende bedingungen erfüllt werde,
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 18.09.10 14:18 
user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if ImSonne.Visible then begin
    if ImSonne.left < 450 then begin
      ImSonne.Left := ImSonne.Left + 10;
      ImSonne.Top := ImSonne.Top - 10;
    end;
    if ImSonne.Visible then begin  //<-------hier
      if ImSonne.Left > 450 then begin
        if ImSonne.Left < 900 then begin
          ImSonne.Left := ImSonne.Left + 10;
          ImSonne.Top := ImSonne.Top + 10;
        end;
        if ImSonne.Left > 900 then begin
          ImSonne.Visible := false;
          ImMond.Visible := true;
        end;
        if ImMond.Visible then begin
          if ImMond.Left > 395 then begin
            ImMond.Left := ImMond.left - 8;
            ImMond.Top := ImMond.Top - 7;
          end;
          if ImMond.Left < 395 then begin
            if ImMond.Left > 16 then begin
              ImMond.Left := ImMond.Left - 9;
              ImMond.Top := ImMond.Top + 12;
            end;
            if ImMond.Left < 16 then begin
              ImMond.Visible := false;
              ImMond.Left := 864;
              ImSonne.Left := 16;
              ImSonne.Visible := true;
            end;  //; eingefügt
          end;
        end;
      end;
    end;
  end;
end;

Zum markierten begin gehört das markierte end :nixweiss: Das kann man nur bei formatiertem Quelltext richtig sehen.
Dein Timer macht gar nichts, wenn die Sonne nicht sichtbar ist.

Dass das nicht so gedacht ist wie es da steht, siehst du schon dadurch, dass du in der mit Kommentar versehenen Zeile wiederholt abfragst, ob die Sonne sichtbar ist.

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
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 18.09.10 14:37 
Erstmal: vor end muss kein Semikolon stehen.
Zweitens: Den Code solltest du überdenken. Da sieht niemand durch. Klar können wir erahnen, was der machen soll, aber er ist unsichtbar und die Zahlen sind nicht gerade schön. Ich würde dir eine saubere Lösung mit trigonometrischen Funktionen empfehlen, damit sich deine Objekte auch auf einer elliptischen Bahn bewegen. Außerdem hast du dann bessere Kontrolle, da du dann die Position von Sonne und Mond an Winkeln festmachen kannst.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
{ Beispiel für elliptische Bewegung }
c := Pi / 180;

// Winkel vermindern
deg := (deg - 1mod 360;

// Positionieren
// Parameter:        sWidth, sHeight, sX, sY
// sWidth / sHeight: Höhe / Breite der Bahnellipse
// sX / sY:          Mittelpunktkoordinaten
ImSonne.Left := -(ImSonne.Width  div 2) + Trunc(sWidth  * cos(deg * c));
ImSonne.Top  := -(ImSonne.Height div 2) + Trunc(sHeight * sin(deg * c));

if deg in [0..179then
  // untere Hälfte
  // hier kannst du darauf reagieren
else if deg in [180..359then
  // obere Hälfte
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 18.09.10 14:40 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Erstmal: vor end muss kein Semikolon stehen.

Akzeptiert, dann aber bitte konsistent ;) Ich mache immer mit, andere können gerne immer ohne machen.

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Timm3r Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 18.09.10 16:25 
wie beende ich denn diesen scheiß if-satz
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 18.09.10 16:59 
@Hidden: *zustimm*

user profile iconTimm3r hat folgendes geschrieben Zum zitierten Posting springen:
wie beende ich denn diesen schei* if-satz


Nach if..then folgt immer nur ein Befehl oder ein Block (begin..end;).
Timm3r Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 18.09.10 17:01 
Also ich verzweifle hier gerade fast, ich programmiere jetzt seit stunden verwerfe alles wieder und programmiere wieder.

Mein jetziger Quelltext sieht folgendermaßen aus:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TSonnenlauf.Timer1Timer(Sender: TObject);

begin
  if ImSonne.Visible=True
    then begin
  if ImSonne.Left>0
    then begin
      ImSonne.Left:=ImSonne.Left+10;
      ImSonne.Top:=ImSonne.Top-10;
    end;

    end
  else if ImSonne.Left>250
    then begin
  if ImSonne.Left<500
    then begin
      ImSonne.Left:=ImSonne.Left+10;
      ImSonne.Top:=ImSonne.Top+10
    end;
    end
  else if ImSonne.Left>500
    then begin
      ImSonne.Visible:=False;
      ImSonne.Visible:=True;
    end;
end;
end.

begin
  if ImMond.visible=true
    then begin
  if ImMond.Left>250
    then begin
      ImMond.Left:=ImMond.left-10;
      ImMond.Top:=ImMond.Top-10;
    end;
    end
  else if ImMond.Left<250
    then begin
  if ImMond.Left<0
    then begin
      ImMond.Left:=ImMond.left-10;
      ImMond.Top:=ImMond.Top+10;
    end;
    end;
end.


Aber der Fehler ist: [Fatal Error] Could not create output file 'C:\Program Files\Borland\Delphi7\Projects\Project1.exe'

Was muss ich denn ejtzt machen? Ich verzweifle hier echt.

Bitte dringend um Hilfe!

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 18.09.10 17:02 
Ausführlichst, vielleicht weißt du das teilweise schon:
Eine Anweisung nach einem if wird nur ausgeführt, wenn die Bedingung zwischen if und then zu dem Zeitpunkt erfüllt ist, zu dem der Prozessor bei der Abfrage ankommt. Durch Sprungbefehle oder Schleifen kann dies auch mehrmals geschehen, dann kann die Anweisung auch mehrmals ausgeführt werden und mehrmals nicht.

Statt einer einzelnen Anweisung kann auch ein Block folgen. Dieser besteht aus begin, beliebig vielen Anweisungen, und schließlich einem end;. Der gesamte Block wird wie eine einzelne Anweisung ausgeführt: Das heißt entweder ganz oder gar nicht, und zwar genau dann, wenn die Bedingung erfüllt ist.

In deinem Fall sind alle weiteren Abfragen nach der ersten im Block enthalten. Das heißt, dass auch nichts davon ausgeführt wird, so lange die Sonne nicht sichtbar ist.
Um das zu "reparieren", musst du einfach das markierte end; so weit nach oben schieben, bis genau noch das im Block der Sonne.Visible-Abfrage enthalten ist, was darin enthalten sein soll.

Hoffe, das hat geholfen :zwinker:

Moderiert von user profile iconMartok: Beiträge zusammengeführt.

user profile iconTimm3r hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure TSonnenlauf.Timer1Timer(Sender: TObject);

begin
  if ImSonne.Visible  //=True ist unnötig, kann sogar zu Fehlern führen
  then begin
    //Den Ganzen Block einrücken du musst ;)
    if ImSonne.Left>0
    then begin  //ok. Ich spare lieber eine Zeile, das ist Geschmackssache du kannst auch then begin oder begin in eine neue Zeile schreiben
      ImSonne.Left:=ImSonne.Left+10;
      ImSonne.Top:=ImSonne.Top-10;
    end;
  end else begin
    if ImSonne.Left>250
    then begin
      if ImSonne.Left<500
      then begin
        ImSonne.Left:=ImSonne.Left+10;
        ImSonne.Top:=ImSonne.Top+10
      end;
    end;
  end else if ImSonne.Left>500
  then begin
    ImSonne.Visible:=False;
    ImSonne.Visible:=True;
  end;
  end;
end.  //here be dragons! :P
  //Ein end mit . kommt nur am Ende eines Programms vor, alles dahinter
  //wird nicht vom Compiler gelesen und zählt somit als Kommentar.

begin
  if ImMond.visible=true
    then begin
  if ImMond.Left>250
    then begin
      ImMond.Left:=ImMond.left-10;
      ImMond.Top:=ImMond.Top-10;
    end;
    end
  else if ImMond.Left<250
    then begin
  if ImMond.Left<0X
    then begin
      ImMond.Left:=ImMond.left-10;
      ImMond.Top:=ImMond.Top+10;
    end;
    end;
end.

Klasse, da kann man jetzt richtig was erkennen. Editiere ich gleich noch 'was zu rein :)

Edit ist da(vgl. Quelltext).
Mit zwei Prozeduren(so ähnlich, wie du es jetzt versucht hast) kann man das auch machen. Versuche aber mal den Ansatz:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Timer1Timer(Sender: TObject);
begin
  if Sonne.Visible then begin
    //bewegen der Sonne
  end;
  if Mond.Visible then begin
    //bewegen des Monds
  end;
end;


user profile iconTimm3r hat folgendes geschrieben Zum zitierten Posting springen:
Aber der Fehler ist: [Fatal Error] Could not create output file 'C:\Program Files\Borland\Delphi7\Projects\Project1.exe'

Hmm, das kann verschiedene Gründe haben. Das ist kein Syntaxfehler in deinem Programm: Delphi sagt dir, dass Windows es aus irgend einem Grund nicht erlaubt, in die .exe-Datei zu schreiben. Starte einmal Delphi neu, und wenn das nichts hilft den Computer.

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Timm3r Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 19.09.10 21:12 
Also danke für die vielen Antworten, aber ich kriege es einfach nicht hin und eure Tips haben leider auch nichts gebracht. Ich habe jetzt mal alles in 2 Timer gepackt im einen ist der Mond und im anderen die Sonne. Jetzt öffnet der PC gar nichts mehr. Das ist jetzt mein Text:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
procedure TSonnenlauf.Timer1Timer(Sender: TObject);

begin
  if ImSonne.Visible
    then begin
  if ImSonne.Left>0
    then begin
  if ImSonne.Left<500
    then begin
      ImSonne.Left:=ImSonne.Left+1;
      ImSonne.Top:=ImSonne.Top-1;
    end;
    end;
    end;
    end;
  else if ImSonne.Left>500
    then begin
  if ImSonne.Left<1000
    then begin
      ImSonne.Left:=ImSonne.Left+1;
      ImSonne.Top:=ImSonne.Top+1
    end;
    end
  else if ImSonne.Left>1000
    then begin
      ImSonne.Visible:=False;
      ImMond.Visible:=True;
    end;
end;
end.

procedure TSonnenlauf.Timer2Timer(Sender: TObject);
begin
 if ImMond.visible
    then begin
  if ImMond.Left>500
    then begin
      ImMond.Left:=ImMond.left-1;
      ImMond.Top:=ImMond.Top-1;
    end;
    end
  else if ImMond.Left<500
    then begin
  if ImMond.Left>0
    then begin
      ImMond.Left:=ImMond.left-1;
      ImMond.Top:=ImMond.Top+1;
    end;
  else if ImMond.Left<0
    then begin
      ImMond.Visible:=False;
      ImSonne.Visible:=True;
    end
    

end;

end;
end.


und es kommen die folgenden Fehler:

[Error] Unit1.pas(45): Declaration expected but 'ELSE' found
[Error] Unit1.pas(47): Undeclared identifier: 'ImSonne'
[Error] Unit1.pas(49): Missing operator or semicolon
[Error] Unit1.pas(49): Missing operator or semicolon
[Error] Unit1.pas(50): Missing operator or semicolon
[Error] Unit1.pas(50): Missing operator or semicolon
[Error] Unit1.pas(51): Statement expected, but expression of type 'Integer' found
[Error] Unit1.pas(53): '.' expected but 'ELSE' found
[Error] Unit1.pas(54): Identifier redeclared: 'Finalization'
[Error] Unit1.pas(55): Missing operator or semicolon
[Error] Unit1.pas(56): Undeclared identifier: 'ImMond'
[Warning] Unit1.pas(57): Text after final 'END.' - ignored by compiler
[Error] Unit1.pas(16): Unsatisfied forward or external declaration: 'TSonnenlauf.Timer2Timer'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 19.09.10 22:31 
du weißt das in der klammer immer die zeilennummer steht? rechts daneben dann eine genaue beschreibung was der compiler von dir will. ;)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.

Für diesen Beitrag haben gedankt: der organist
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 20.09.10 02:57 
user profile iconTimm3r hat folgendes geschrieben Zum zitierten Posting springen:
und es kommen die folgenden Fehler:


Du solltest Dir angewöhnen, den Text ordentlich zu formatieren: begin und end an der gleichen Spaltenposition beginnen und nicht "then begin" in einer Zeile. Außerdem kosten Leerzeichen nichts (z. B. bei +, -, =, / usw.).

Ich habe mir mal erlaubt, Deinen Quelltext entsprechend zu formatieren:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
procedure TSonnenlauf.Timer1Timer(Sender: TObject);
begin
  if ImSonne.Visible then 
    begin
      if ImSonne.Left > 0 then 
        begin
          if ImSonne.Left < 500 then 
            begin
              ImSonne.Left:=ImSonne.Left + 1;
              ImSonne.Top:=ImSonne.Top - 1;
            end;
        end;
    end;
    end;
  else 
    if ImSonne.Left > 500 then 
      begin
        if ImSonne.Left < 1000 then 
          begin
            ImSonne.Left:=ImSonne.Left + 1;
            ImSonne.Top:=ImSonne.Top + 1;
          end;
      end
    else 
      if ImSonne.Left > 1000 then 
        begin
          ImSonne.Visible := False;
          ImMond.Visible := True;
        end;
end;
end.  // <--- end mit Punkt gibts in jeder Unit nur einmal,
      //      und zwar am Ende der Unit.

procedure TSonnenlauf.Timer2Timer(Sender: TObject);
begin
  if ImMond.visible then 
    begin
      if ImMond.Left > 500 then
        begin
          ImMond.Left := ImMond.left - 1;
          ImMond.Top := ImMond.Top - 1;
        end;
    end
  else 
    if ImMond.Left < 500 then 
      begin
        if ImMond.Left > 0 then 
          begin
            ImMond.Left := ImMond.left - 1;
            ImMond.Top := ImMond.Top + 1;
          end;
    else 
      if ImMond.Left < 0 then 
        begin
          ImMond.Visible := False;
          ImSonne.Visible := True;
        end
end;      
end;
end.

Damit sollte es Dir ein Leichtes sein, Deine Fehler selbst zu finden. Du brauchst nur zu jedem begin das dazugehörige end zu suchen bzw. umgekehrt.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 20.09.10 15:19 
(Off Topic)

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
nicht "then begin" in einer Zeile.

Einspruch ;) Quote, und für den Rest am besten nochmal den Thread aufrollen(mit Quote auf mich hier), nicht diesen.
Vor begin wird allerdings in keinem Styleguide, den ich kenne, eingerückt(erst danach). Möchte ich als falsch bezeichnen, weil es den Überblick stört. Immerhin muss das Auge dann die doppelte Einrückung von der einfachen unterscheiden, die für den Programmfluss die selbe Bedeutung hat.

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TSonnenlauf.Timer1Timer(Sender: TObject);
if ImSonne.Visible then 
  begin
    if ImSonne.Left > 0 then

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 20.09.10 17:39 
user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
(Off Topic)

Einspruch ;) Quote, und für den Rest am besten nochmal den Thread aufrollen(mit Quote auf mich hier), nicht diesen.
Vor begin wird allerdings in keinem Styleguide, den ich kenne, eingerückt(erst danach). Möchte ich als falsch bezeichnen, weil es den Überblick stört. Immerhin muss das Auge dann die doppelte Einrückung von der einfachen unterscheiden, die für den Programmfluss die selbe Bedeutung hat.


Es ist mehr als offensichtlich, daß der Threadstarter ein Problem mit der Verschachtelung seiner If-Then-Else-Konstruktionen hat. Somit kann ein Hinweis auf eine entsprechende Formatierung keinesfalls Off-Topic sein, denn damit wird das eigentliche Problem des Threadstartes angegangen.
Bei meiner Variante reicht notfalls ein Lineal, um zu sehen, was zusammen gehört und was nicht (begin und end), was voneinander abhängig ist (if und else) usw. Wenn DAS nicht lesbar sein soll, kann ich Dir leider auch nicht helfen ... ;-)
Und um auf den von Dir genannten Styleguide des Herrn Charles Calvert einzugehen: Man muß sich nicht selbst die Hose mit einer Kneifzange anziehen, nur weil es ein Herr Calvert vielleicht so macht oder alle anderen es so machen. ;-)
Oder um es mal mit den Worten meines ehemaligen Professors zu sagen: "Es gibt eine herrschende Meinung, und es gibt Leute, die eine andere Meinung haben. Nur deshalb müssen die Leute mit einer anderer Meinung nicht unbedingt falsch liegen. Sie müssen nur ihre Meinung begründen können."
Der genannte Styleguide ist (nicht nur in meinen Augen) an manchen Stellen inkonsequent. Laut Styleguide des Autoren Calvert:
1. Zwischen begin und end wird eingerückt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
  B := C;
  A := B;
end;

2. Nach einem then wird eingerückt:
ausblenden Delphi-Quelltext
1:
2:
3:
// RICHTIG
if A < B then
  DoSomething;

3. If und else stehen untereinander (beginnen an der gleichen Spaltenposition).

Nach einer if-Bedingung kann eine einzelne Anweisung oder ein Block mit Anweisungen folgen, die (siehe 2.) einzurücken sind. Wenn ein Block mit begin und end folgt, dann ist der auch einzurücken (siehe 1.).
Daraus folgt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if A < B then
  begin
    B := C;
    A := B;
  end
else
  begin
    C := D;
    D := E;
  end;

Somit ist diese Formatierung keinesfalls falsch. Sie ist lesbar und ergonomisch, weil Abgängigkeiten sofort auf einen Blick erkennbar sind. Man sieht sofort, was zusammen gehört und was nicht. Man braucht nur einen Blick darauf zu werfen, um die Struktur zu erfassen.
Aber ich gestehe Dir das Recht zu, anderer Meinung zu sein. ;-)
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: Mo 20.09.10 17:51 
Ziel des Styleguides ist es aber, einen einheitlichen Programmierstil zu schaffen. Und es macht nun einmal fast jeder so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if Condition then
begin
  ...
end;


Eindeutig zu lesen hier: de.wikibooks.org/wik...stil#Einr.C3.BCckung

Ich weiß, der ist nicht offiziell, aber hat wohl in dem Fall trotzdem seine Gültigkeit.

So etwas (in meinen Augen unleserliches) gibt es sonst nur beim GNU-C-Stil:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
int main (int argc, char *argv[])
 {
  FILE *f;
  f = fopen (...);
  if (f != NULL)
   {
    if (!strcmp (argv[0], ""))
     {
      /* do () man beachte das Leerzeichen vor den Klammern */
     }
   }
 }
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 20.09.10 18:09 
Sowohl C als aus JS als auch Delphi kenn ich aus meinem Erfahrungsbereich nur mit hängendem Begin, also:
ausblenden C oder JS
1:
2:
3:
if (something) {
  doit();
}

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if A then begin
  c:= 4;
  d:= 6;
end else begin
  c:= 7;
  d:= 9;
end;

Also eher Python-Stil: man schätzt die Einrückung höher als das Schlüsselwort, was immerhin nur für den Compiler da ist - der Mensch sieht anhand der Einrückungen sofort was zusammengehört. Ein Zeilenumbruch von dem begin ist zwar gut wenn man nach Zeilen bezahlt wird, aber sonst bringt er eher wenig.

Und zumindest bei JS gibt mir Crockford auch recht, wenn das auch eher daran liegt dass da der Zeilenumbruch tatsächlich einen Bedeutungsunterschied darstellen kann.

Wichtigster Punkt dürfte aber wohl sein, dass NIEMAND vor dem then einen Zeilenumbruch hat.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Hidden
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: Mo 20.09.10 18:26 
Naja, gerade bei C-ähnlichen Sprachen (syntaxbezogen) gibts ja tausende Stile. Um nur einige zu haben: en.wikipedia.org/wiki/Indent_style

Bei Delphi gibt es da denke ich bei weitem weniger, die von mehr als einer Person benutzt werden. Ob das begin nun hängend ist oder nicht, ist, denke ich, ziemlich egal, da man beides ziemlich oft sieht. Aber dass begin zusätzlich eingerückt wird habe ich sonst noch nie gesehen.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 20.09.10 18:59 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Aber dass begin zusätzlich eingerückt wird habe ich sonst noch nie gesehen.
Z. B. hier: www.text-konverter.h...iPrettyPrint_ge.html