![]() |
FormCreate(Sender); - undefinierter Bezeichner?
Ich will in einer Procedur FormCreate(Sender); aufrufen, aber bekomme die Fehlermeldung -> undefinierter Bezeichner: 'Sender'
Wer kann mir weiter helfen? Wo und wie muss ich diesen definieren? |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Es fehlt der Typ
|
Re: FormCreate(Sender); - undefinierter Bezeichner?
Aber wo und wie soll ich diesen Typ da definieren?
|
Re: FormCreate(Sender); - undefinierter Bezeichner?
Okay, folgendes:
1. Du lagerst den Code in dem FormCreate-Eventhandler in eine neue Metrhode aus. 2. Du rufst diese aus dem Eventhandler und der anderen Prozedur auf ;) (Das ist die saubere Lösung. Die unsaubere ist FormCreate(nil); ;) ) |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Danke jfheins, hab aber nix verstanden :(
Kannst du vllt den Code schreiben? |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Zitat:
Delphi-Quellcode:
FormCreate(nil); // <== Der Code !
|
Re: FormCreate(Sender); - undefinierter Bezeichner?
Und wieso ist diese Lösung unsauber?
Darf ich dir vllt mein QuellCode zeigen und du machst das für mich sauber? Hier der Code
Delphi-Quellcode:
implementation
{$R *.DFM} procedure TForm1.NextQuestion; var i : integer; begin if (FiCountCorrect = 10) or (FiCountTries=3) then //15 begin ShowResults; exit; end; FiCountQuestion:=Random(6)+1; //inc(FiCountQuestion); Label6.Caption:=IntToStr(FiCountCorrect); FiCountTries := 2; GroupBox2.Caption := IntToStr(FiCountQuestion)+'. Frage'; Label2.Caption := aqQuiz[FiCountQuestion].sQuestion; Edit2.text := IntToStr(FiCountTries); for i := 1 to 4 do begin TButton(FindComponent('Button'+IntToStr(i))).Caption := chr(64+i)+' - '+aqQuiz[FiCountQuestion].sAnswer[i]; end; FICorrect := aqQuiz[FiCountQuestion].iCorrect; end; procedure TForm1.FormCreate(Sender: TObject); var i : integer; j : integer; sSection : string; begin Randomize; iniQuiz := TIniFile.Create(ExtractFilePath(paramstr(0))+'Quiz.ini'); try for i := 1 to 6 do //15 begin sSection := 'Frage'+IntToStr(i); aqQuiz[i].sQuestion := iniQuiz.ReadString(sSection,'Frage',''); for j := 1 to 4 do begin aqQuiz[i].sAnswer[j] := iniQuiz.ReadString(sSection,'Antwort'+IntToStr(j),''); end; aqQuiz[i].iCorrect := iniQuiz.ReadInteger(sSection,'Korrekt',0); end; FiCountCorrect := 0; FiCountError := 0; FiCountQuestion := 0; NextQuestion; finally FreeAndNil(iniQuiz); end; end; procedure TForm1.Button1Click(Sender: TObject); var iChoice : integer; begin iChoice := 1; if iChoice = FiCorrect then begin //ShowMessage('Richtig'); inc(FiCountCorrect); NextQuestion; exit; end; if FiCountTries = 2 then begin ShowMessage('Leider falsch.'#13#10'Noch ein Versuch.'); dec(FiCountTries); Edit2.Text := IntToStr(FiCountTries); exit; end; ShowMessage('Leider falsch.'); inc(FiCountError); FiCountTries:=3; NextQuestion; end; ..... procedure TForm1.ShowResults; begin ShowMessage('Das Quiz ist vorbei.'#13#10'Richtig: '+IntToStr(FiCountCorrect)+#13#10'Falsch: '+IntToStr(FiCountError)); if Application.MessageBox('Neues Spiel anfangen?','Frage',36) = 7 then Close; FormCreate(Sender); //HIER KOMMT DER FEHLER end; |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Es ist unsauber, weil das TForm1.FormCreate(Sender: TObject) ein Eventhandler ist. Das heißt, er wird von dem Formular aufgerufen.
Ideeal wäre es jetzt, wenn du den eigentlichen Code und diee Events nicht miteinander vermischst, sodass du auch mal andere Events benutzen kannst, ohne dabei Code umkopieren zu müssen. Aber als Anfänger ist das durchaus okay ;) P.S. Nein, ich habe keine Lust deinen Code umzuschreiben ;) |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Also schnell geht es nur mit nil? Hm... hab versucht, das Prog spinnt danach total...
|
Re: FormCreate(Sender); - undefinierter Bezeichner?
Moin,
Ich habe deinen Quellcode jetzt nur kurz überflogen, aber du kannst / solltest FormCreate nicht selbst aufrufen. Die Prozedur steht einfach dafür, dass sie nur am beginn (dann, wenn die Form erstellt wird) aufgerufen wird. Natürlich ist es möglich die Prozedur nachher ebenfalls zu benutzen, aber das fällt meiner Meinung nach in die Sparte "Schlechter Stil" (um keinen Krieg loszubrechen: Ja es mag Gründe geben, die Prozedur unter Wahrung des guten Stils aufzurufen, aber dieser Fall hier gehört nicht dazu). Ich würde es so lösen: Verlagere alles, was nötig ist, um ein neues Spiel zu starten, in eine eigene Prozedur (meinetwegen procedure NeuesSpiel;). Diese kannst du dann sowohl im OnCreate-Ereignis aufrufen (also aus der FormCreate-Prozedur heraus), als auch, wenn das Spiel zu ende ist und ein Neues gestartet werden kann. Grüße, Max |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Oh man... da verstehe ich nur Bahnhof. Ich bin Anfänger und hab diesen Code aus diesem Forum geholt, allerdings schon sehr verändert.
Wer die Frage nach dem neuen Spiel wahrscheinlich in den OnClick der Buttons legen. |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Ok Jungs ich hab's anders gemacht und sehr sauber :thumb:
Hab folgendes geändert:
Delphi-Quellcode:
Ist doch wunderbar, oder?
procedure TForm1.ShowResults;
begin ShowMessage('Das Quiz ist vorbei.'#13#10'Richtig: '+IntToStr(FiCountCorrect)+#13#10'Falsch: '+IntToStr(FiCountError)); FiCountCorrect := 0; FiCountError := 0; FiCountQuestion := 0; FiCountTries := 2; if Application.MessageBox('Neues Spiel anfangen?','Frage',36) = 7 then Close; NextQuestion; end; Danke für die Hilfe. |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Moin,
Hast du schon einmal ein neues Spiel gestartet, denn ich bezweifle, dass das funktioniert. Du rufst Close; auf. Damit schließt du die Form (und wenn es die HauptForm = MainForm ist, dann damit auch die komplette Applikation). Grüße, Max Edit: OK, mein Fehler. 7 steht für "Nein" (deshalb sind Konstanten dein Freund ;) ). Jetzt ist es wohl etwas sauberer, dennoch könnte man es eleganter lösen ;) |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Ne wieso, Close; wird aufgerufen wenn man auf Nein klickt, das Spiel bzw. das Programm wird somit geschloßen. Wenn User auf Ja klickt gehts zu NextQuestion. :-D
|
Re: FormCreate(Sender); - undefinierter Bezeichner?
Zitat:
Und wie sieht es eleganter aus? :gruebel: |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Man könnte z.B. statt der nichtssagenden Zahl 7 die dafür vorgesehene Konstante nutzen. Da hast du es dir allerdings unbewusst etwas schwieriger gemacht, weil du Application.MessageBox() benutzt, welches in sich die MessageBox-Funktion der user32.dll aufruft, und die Rückgabewerte stehen, wie bei Win-API Dingen üblich, nicht direkt so in der Delphi-Hilfe, sondern müssten im msdn nachgeschlagen werden. In diesem Fall gibt es die Konstante "IDNO" welche für diesen Fall gedacht ist (und oh wunder, 7 ist).
Die VCL-Variante heisst MessageDlg() und findet sich in der Unit Dialogs.pas. Auch dort gibt es einen Enum-Type der die möglichen Rückgabewerte bezeichnet. Da dort im Grunde nur ein neues Formular erzeugt und modal angezeigt wird, gelten hier die ModalResult Konstanten, im Falle eines Klicks auf [Nein] wäre dies dann "mrNo". DAS wäre der konsequente Weg in einer VCL Anwendung. Auch ist es etwas unschön, dass du noch Code hinter dem möglichen Close() hast. Den solltest du in einen else-Zweig der Abfrage davor packen, damit besser ersichtlich ist, dass das nur dann noch ausgeführt wird, wenn Close() nicht statt fand. Funktional ändert das zwar nichts, aber es ging ja um Eleganz. Es gehört generell zum "guten Ton" Code hinter einem Close, Exit, Continue usw. in einen alternativen Konditional-Zweig zu packen, da man sich sonst wieder der verpönten "Goto-Mentalität" annähert, und es einfach den Lesefluss erleichtert wenn man den Code durchgeht (besonders wenn man nicht selbst der Autor ist, oder man sich den Code nach 3 Jahren mal wieder anschaut). |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Delphi-Frage |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Statt
Delphi-Quellcode:
besser
if Application.MessageBox('Neues Spiel anfangen?','Frage',36) = 7 then Close;
Delphi-Quellcode:
Statt "Handle" kannst Du auch eine Null ("0") schreiben.
if MessageBox(Handle,'Neues Spiel anfangen?','Frage',mb_YesNo or mb_IconQuestion or mb_DefButton1) = id_NO then Close;
Klick mal in Delphi (nicht hier) auf das Wort "MessageBox" und drück dann [F1] :mrgreen: Edith meint, daß "Medium" oben mit erhobenem Zeigefinger nur mehrwertlos herumschwafelt ;-) |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Na wenn ich fertig bin, dann könnt ihr vllt ein Auge drüber werfen und gucken was sich besser machen lässt. :-D
|
Re: FormCreate(Sender); - undefinierter Bezeichner?
Hallo AlexII,
Außerdem hast du bei „procedure TForm1.ShowResults;“ das Problem, dass du da was miteinander vermischst. Ich würde einfach noch eine Prozedur anlegen: „StartGame“ die in „FormCreate“ aufgerufen wird, und in ShowResults, sofern nicht Nein angeklickt würde. Das wäre imho eleganter ;)
Delphi-Quellcode:
MfG
procedure TForm1.ShowResults;
begin ShowMessage('Das Quiz ist vorbei.'#13#10'Richtig: '+IntToStr(FiCountCorrect)+#13#10'Falsch: '+IntToStr(FiCountError)); if Application.MessageBox('Neues Spiel anfangen?','Frage',MB_OK*or MB_ICONQUESTION) = ID_YES then StartGame else Close; end; xZise |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Ich verstehe aber nicht ganz was wird da vermischt?
Und in die StartGame Prozedur kommt dann dieses wie ich verstanden haben?
Delphi-Quellcode:
oder?
FiCountCorrect := 0;
FiCountError := 0; FiCountQuestion := 0; FiCountTries := 2; NextQuestion; |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Naja da kommt alles so rein, dass du ein neues Spiel starten kannst. So hättest du es auch von FromCreate entkoppelt.
MfG xZise |
Re: FormCreate(Sender); - undefinierter Bezeichner?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz