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<>nil) do 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
Christian 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<>nil) do 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 else 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 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 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 begin Memo1.Lines.Text := Zeiger^.Name; Memo2.Lines.Text := Zeiger^.Kuerzel; Memo3.Lines.Text := Zeiger^.Schluessel; Memo3.Lines.Add('string'); end else |
Zitat: |
Wo ist z.B. das Begin beim "While"? |
Delphi-Quelltext
1: 2: 3: 4: 5:
| While not Ende DO begin 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
JayK hat folgendes geschrieben: |
Zitat: | Wo ist z.B. das Begin beim "While"? |
Delphi-Quelltext 1: 2: 3: 4: 5:
| While not Ende DO begin 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!