Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kann kein END vor ELSE schreiben


Knedcox - Sa 20.08.05 12:36
Titel: Kann kein END vor ELSE schreiben
Mein Programmteil sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 if Application.MessageBox('Wollen Sie die Daten wirklich löschen?','Hinweis',MB_OKCANCEL)=IDOK then
     begin
       vorg:= start;
       zeiger:=vorg^.Next;
       while (zeiger^.Name<> Memo1.Lines.Text) and (zeiger^.Next<>nildo
          begin
           vorg:=vorg^.Next;
           zeiger:=zeiger^.Next;
          end  <= dieses end ist mein Problem
       else vorg^.Next:=zeiger^.Next;
   end;


Wenn ich das END ohne ";" schreib, kommt als Fehlermeldung "END erwartet aber ELSE gefunden" und wenn ich END mit ";" schreib, kommt als Fehlermeldung "Kein ; vor ELSE".

Was soll ich machen, damit es funktioniert?


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Di 23.08.2005 um 11:30


Delete - Sa 20.08.05 12:38

Was du machen sollst? Dir deinen Code mal genauer angucken. Da gibt es nämlich noch ein begin und end welches zu dem if gehört:

Quelltext
1:
2:
3:
4:
5:
6:
7:
if
begin
  while
  begin
  end
  else
end

so sieht es nämlich bei dir im Moment aus.


Knedcox - Sa 20.08.05 12:48

Sorry wenn ich noch mal nerv, aber ich weiß nicht, wo daran mein Fehler ist?


MrSaint - Sa 20.08.05 12:57

das else steht bei der while-Schleife! machs so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 if Application.MessageBox('Wollen Sie die Daten wirklich löschen?','Hinweis',MB_OKCANCEL)=IDOK then
     begin
       vorg:= start;
       zeiger:=vorg^.Next;
       while (zeiger^.Name<> Memo1.Lines.Text) and (zeiger^.Next<>nildo
          begin
           vorg:=vorg^.Next;
           zeiger:=zeiger^.Next;
          end;
     end
     else vorg^.Next:=zeiger^.Next;



MrSaint


Knedcox - Sa 20.08.05 13:00

Jetzt hab ichs. Merci und Gruß.


Knedcox - Sa 20.08.05 13:43

Als ich es vorhin ausprobiert hab, hats ja gleich funktioniert. Allerdings muss ich jetzt feststellen, dass ich es scheinbar gar nicht kapiert hab (auch wenn ich das zuerst dachte). Denn jetzt hab ich an anderer Stelle das gleiche Problem.

Vielleicht kann mir ja noch mal jemand sagen, wo in dem Code der Fehler steckt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button5Click(Sender: TObject);
begin
     if edit1.Text <> '' then begin
                                  Zeiger:=start;
                                  while Zeiger^.Name <> Edit1.Text do
                                     Zeiger:=Zeiger^.Next;
                                  end
                                  else begin
                                         Memo1.Lines.Text:=Zeiger^.Name;
                                         Memo2.Lines.Text:=Zeiger^.Kuerzel;
                                         Memo3.Lines.Text:=Zeiger^.Schluessel;
                                         Memo3.Lines.Add('string');
                                       end;
                                end  <= hier hängts
     else if ...


Als Fehlermeldung kommt immer, ";" erwartet aber ELSE gefunden. Und wenn ich dann ein ";" hinschreib, kommt als Fehlermeldung "Deklaration erwartet, aber ELSE gefunden".

Wie gesagt, bin echt totaler Anfänger... Vielleicht kann mir auch jemand sagen, wo ich das nachlesen kann.


Delete - Sa 20.08.05 13:47

Rück doch mal gescheit ein:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button5Click(Sender: TObject);
begin
  if edit1.Text <> '' then
  begin
    Zeiger := start;
    while Zeiger^.Name <> Edit1.Text do
      Zeiger := Zeiger^.Next;
  end
  else
  begin
    Memo1.Lines.Text := Zeiger^.Name;
    Memo2.Lines.Text := Zeiger^.Kuerzel;
    Memo3.Lines.Text := Zeiger^.Schluessel;
    Memo3.Lines.Add('string');
  end;
  end <= hier hängts
  else
  if ...

Wo soll denn das markierte end hingehören?


Blawen - Sa 20.08.05 13:53


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button5Click(Sender: TObject);
begin
  if edit1.Text <> '' then
    begin
      Zeiger := start;
      while Zeiger^.Name <> Edit1.Text do
      Zeiger := Zeiger^.Next;
    end
  else
    begin
      Memo1.Lines.Text := Zeiger^.Name;
      Memo2.Lines.Text := Zeiger^.Kuerzel;
      Memo3.Lines.Text := Zeiger^.Schluessel;
      Memo3.Lines.Add('string');
    end;
  end <= hier hängts  // Klaro wo hast Du den das zugehörige begin?
  else               //  wo hast Du den das zugehörige IF ?
  if ...

Siehe die 2 Bemerkungen - eine gescheite Einrückung verhindert solche Fehler!

Gruss
Blawen

PS: Dein Code sieht demzufolge so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button5Click(Sender: TObject);
begin
  if edit1.Text <> '' then
    begin
      Zeiger := start;
      while Zeiger^.Name <> Edit1.Text do
      Zeiger := Zeiger^.Next;
    end
  else
    begin
      Memo1.Lines.Text := Zeiger^.Name;
      Memo2.Lines.Text := Zeiger^.Kuerzel;
      Memo3.Lines.Text := Zeiger^.Schluessel;
      Memo3.Lines.Add('string');
    end;
end;


Knedcox - Sa 20.08.05 14:05


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button5Click(Sender: TObject);  
begin  
  if edit1.Text <> '' then  
    begin  
      Zeiger := start;  
      while Zeiger^.Name <> Edit1.Text do  
       Zeiger := Zeiger^.Next;  
      end  (Dieses end gehört zum while da ich ja im ursprünglichen Programmteil dieses Threads kein end nach dem while hatte und dann immer die Fehlermeldung kam) 
      else(Dieses else bezieht sich auch aufs while)  
       begin  
        Memo1.Lines.Text := Zeiger^.Name;  
        Memo2.Lines.Text := Zeiger^.Kuerzel;  
        Memo3.Lines.Text := Zeiger^.Schluessel;  
        Memo3.Lines.Add('string');  
       end;  
    end (Und das end hier gehört zum zweiten begin von oben)
  else (Und das else gehört zum ersten if)


Blawen - Sa 20.08.05 14:10


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button5Click(Sender: TObject);  
begin  
  if edit1.Text <> '' then  
    begin  
      Zeiger := start;  
      while Zeiger^.Name <> Edit1.Text do Zeiger := Zeiger^.Next;  
    end  (Dieses end gehört zum while // FALSCH!!
  else( Dieses else bezieht sich auch aufs while)  // FALSCH!
    begin  
      Memo1.Lines.Text := Zeiger^.Name;  
      Memo2.Lines.Text := Zeiger^.Kuerzel;  
      Memo3.Lines.Text := Zeiger^.Schluessel;  
      Memo3.Lines.Add('string');  
    end;  
  end //???
  else //???


Meine obige Aussage (Quelltext) ändert sich noch immer nicht...

Wo ist z.B. das Begin beim "While"?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
While not Ende DO
begin
  mache was;
  IF Abbruchbedingung THEN Ende = True
                      ELSE Ende = False;
End;


PS: Seit wann kennt eine "While" Schleife ein "Else"?


hansa - Sa 20.08.05 14:17

Dein Source hier :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button5Click(Sender: TObject);
begin
     if edit1.Text <> '' then begin
                                  Zeiger:=start;
                                  while Zeiger^.Name <> Edit1.Text do
                                     Zeiger:=Zeiger^.Next;
                                  end
                                  else begin
                                         Memo1.Lines.Text:=Zeiger^.Name;
                                         Memo2.Lines.Text:=Zeiger^.Kuerzel;
                                         Memo3.Lines.Text:=Zeiger^.Schluessel;
                                         Memo3.Lines.Add('string');
                                       end;
                                end  <= hier hängts
     else if ...


sähe bei mir so aus :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button5Click(Sender: TObject);
begin
  if edit1.Text <> '' then begin
    Zeiger:=start;
    while Zeiger^.Name <> Edit1.Text do
      Zeiger:=Zeiger^.Next;
  end
  else begin
    Memo1.Lines.Text:=Zeiger^.Name;
    Memo2.Lines.Text:=Zeiger^.Kuerzel;
    Memo3.Lines.Text:=Zeiger^.Schluessel;
    Memo3.Lines.Add('string');
  end;
end  <= hier hängts
else if ...


Dem Borland Style-Guide entspricht dabei nicht, daß die begins in derselben Zeile sthen, wie if, while usw. Ich will aber lieber sehen zu welchem If, while die ends gehören und nichtg, daß sie zu einem begin gehören. Das ist sowieso klar.

Aber egal. Selbst ein Blinder mit Krückstock sieht jetzt, daß es zu dem else gar kein if gibt !! Und bei dem "hier hängts" da bringst Du Delphi vollkommen durcheinander. Klar ist : da muß zwingend ein ; hin. Wird der gesetzt, dann guckt sich der Compiler das nächste Wort an und das ist ein else. Dein Pech ist nun, daß bei else wohl auch immer das Zeichen davor überprüft wird und das ist ein ; der vor diesem else (wenn überhaupt ein if da wäre) nichts zu suchen hat ! 8)


JayK - Sa 20.08.05 14:21


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button5Click(Sender: TObject);  
begin  
  if edit1.Text <> '' then  
  begin  
    Zeiger := start;  
    while Zeiger^.Name <> Edit1.Text do Zeiger := Zeiger^.Next;  
  end  
  else // Du schriebst: "(Dieses else bezieht sich auch aufs while)" 
       // Wozu ein else für ein while frag ich mich??
  begin  
    Memo1.Lines.Text := Zeiger^.Name;  
    Memo2.Lines.Text := Zeiger^.Kuerzel;  
    Memo3.Lines.Text := Zeiger^.Schluessel;  
    Memo3.Lines.Add('string');  
  end // ; weg
// das Fehler-end weg, wozu soll das hier überhaupt sein??
  else 
  // hier Code nach dem else, 
  // entweder in begin...end eingeschlossen 
  // oder überhaupt kein begin oder end schreiben, 
  // wenn nur eine Codezeile bei else ausgeführt werden soll


Zitat:
Wo ist z.B. das Begin beim "While"?


Delphi-Quelltext
1:
2:
3:
4:
5:
While not Ende DO
begin // <-- Hier vielleicht?!?
  mache was;
  Abbruchbedingung?
End;

:rofl:

// EDIT: :shock: 3 Leute waren schneller als ich :rofl:


Knedcox - Sa 20.08.05 14:24

Jetzt klappts. Der Hinweis das zu einem WHILE kein ELSE passt, war der "Schlüssel-Hinweis", der mir die Augen geöffnet hat.

Danke für Eure Geduld... :D


Blawen - Sa 20.08.05 14:27

user profile iconJayK hat folgendes geschrieben:

Zitat:
Wo ist z.B. das Begin beim "While"?


Delphi-Quelltext
1:
2:
3:
4:
5:
While not Ende DO
begin // <-- Hier vielleicht?!?
  mache was;
  Abbruchbedingung?
End;


Klaro, die Aussage bezog sich ja auch nicht auf mein Beispiel, sondern auf den Code von Knedcox!


hansa - Sa 20.08.05 14:52

@JayK : Dein Source ist aber fast genauso schwer zu lesen (zumindest um verwaiste begin/end zu suchen), wie der von mir zitierte. Ich habe noch nie verstanden, warum der Style-Guide vorschlägt, die Begins an den Zeilenanfang zu schreiben. Nach Style-Guide sähe er so aus :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button5Click(Sender: TObject);  
begin  
  if edit1.Text <> '' then 
  begin  
    Zeiger:=start;  
    while Zeiger^.Name <> Edit1.Text do  
      Zeiger:=Zeiger^.Next;  
  end  
  else
  begin  
    Memo1.Lines.Text:=Zeiger^.Name;  
    Memo2.Lines.Text:=Zeiger^.Kuerzel;  
    Memo3.Lines.Text:=Zeiger^.Schluessel;  
    Memo3.Lines.Add('string');  
  end;  
end  <= hier hängts  
else if ...


Drucke den mal aus und den von mir auch und lege die zwei Ausdrucke nebeneinander. Ich weiche in diesem einzigen Punkt bewußt vom Style-Guide ab ! Bei Prozeduren teilweise über 5 DIN A 4 Seiten hat sich das als wesentlich übersichtlicher erwiesen.