![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 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