AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FormCreate(Sender); - undefinierter Bezeichner?

Ein Thema von AlexII · begonnen am 27. Sep 2008 · letzter Beitrag vom 28. Sep 2008
Antwort Antwort
Seite 1 von 3  1 23      
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#1

FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:25
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:36
Es fehlt der Typ
Markus Kinzler
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#3

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:39
Aber wo und wie soll ich diesen Typ da definieren?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:42
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); )
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#5

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:45
Danke jfheins, hab aber nix verstanden

Kannst du vllt den Code schreiben?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:46
Zitat von AlexII:
Danke jfheins, hab aber nix verstanden

Kannst du vllt den Code schreiben?
Okay, also nochmal die unsaubere Lösung (wie oben bereits geschrieben ...) in extra-Code-Tags FormCreate(nil); // <== Der Code !
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#7

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:49
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;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:53
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
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#9

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:56
Also schnell geht es nur mit nil? Hm... hab versucht, das Prog spinnt danach total...
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#10

Re: FormCreate(Sender); - undefinierter Bezeichner?

  Alt 27. Sep 2008, 22:57
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
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz