Autor Beitrag
Jojojoxx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Mo 20.06.05 12:11 
Hallo!

Ich habe folgendes Problem:

Ich möchte, dass Form2 beim erstellen von Form1 geladen wird, gleichzeitig soll Form1.enabled:=False gesetzt werden.
Leider kriege ich immer folgende Fehlermeldung:

user defined image

Ich benutze folgenden Code:

ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
form2.show;
end;


Lasse ich Form2 allerdings zeitverzögert (500 ms) mit einem Timer starten, funktioniert alles. Ich denke, dass es damit zusammenhängt, dass Form2 noch nicht existiert, wenn der Befehl "Form2.show" ausgefphrt werden soll. Ein Timer ist allerdings nicht wirklich eine Lösung für mich.
Wie kann ich das noch lösen??
Danke euch für die Hilfe!!

mfg

Jojo
sango
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 236

WinXP Home
Delphi 2005 Pro
BeitragVerfasst: Mo 20.06.05 12:35 
ich würd mal annehmen, das es so ist wie du sagst, die form2 wird noch garnicht created worden sein, wenn du sie schon zeigen willst, daher solltest du wohl ein anderes event als auslöser fürs anzeigen benutzen.
bzw. setz doch einfach form2.visible := true, dann wird die auch gleich angezeigt. wenns bei dir so reinpasst ins programm.
ausserdem kannst du die reihenfolge auch verändern, das z.b. erst die form2 created wird, und dann form1 und sobald die fertig ist, lässt du die form 2 anzeigen.
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Mo 20.06.05 12:40 
Hi!

Danke für deine Antwort!
Das optimalste wäre, wenn ich wirklich - wie du schon vorgeschlagen hast - Form2 vor Form1 laden lassen könnte.
Wie kann ich das denn hinkriegen??
Danke dir!

mfg

Jojo
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 20.06.05 13:35 
Moin!

Du müsstest die Reihenfolge in deinem Projektfile abändern, aber dadurch wird die 2. Form auch Hauptformular des Programms, was du bestimmt auch nicht willst. Daher empfehle ich dir eher n den Projektoptionen die Form2 von den zu erstellenden Formularen in die verfügbaren Formulare zu verschieben und danach im FormCreate der 1. Form die 2. Form selbst erstellen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
  form2 := TForm2.Create;
  Form2.Show;
end;


MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Mo 20.06.05 13:40 
Hi!

So bekomme ich die Fehlermeldung "Nicht genügend wirkliche Parameter". Der will, dass ich hinter dem Create noch etwas in Klammern setze, also "form2 := TForm2.create();".. ??
Hast du da eine Idee??

mfg

Jojo
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 20.06.05 13:42 
Moin!

Ja, sorry, mein Fehler: Im Create sollte in Klammern noch Application rein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
  form2 := TForm2.Create(Application);
  Form2.Show;
end;


(Durch Application als Owner kümmert sich Delphi auch ordentlich um die Freigabe der Form beim beenden)

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Radioactive
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179

Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 20.06.05 13:57 
Wird Form2 dann nicht doppelt Created? Denn in der Projectunit wird Form2 ja auch noch ein mal erzeugt... Ich denke, man sollte halt dann eine Anweisung löschen.

_________________
Radioactive
"Wer scrollt, verliert!" Matthias Stein, Informatiklehrer am GG
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Mo 20.06.05 13:59 
Hi!

Danke, das klappt!
Aber irgendwie kommt jetzt automatisch Form1 in den Vordergrund, da hilft kein "Form1.invisible:=False;" oder ein "Form1.enabled:=False;". Weiß aber nicht, ob das etwas damit zu tun hat... :?:

mfg

Jojo
Radioactive
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179

Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 20.06.05 14:03 
Du kannst Form1 verstecken (mit Form1.Hide) oder du zeigst Form2 nicht schon beim Form1Creat an, denn dann ist Form1 über Form2, sondern erst danach.
Oder du aktivierst Form2 mit Form2.Activate. Aber nutzt alles nichts, wenn du die Anweisung in Form1Create reinschreibst.

_________________
Radioactive
"Wer scrollt, verliert!" Matthias Stein, Informatiklehrer am GG


Zuletzt bearbeitet von Radioactive am Mo 20.06.05 14:05, insgesamt 1-mal bearbeitet
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 20.06.05 14:04 
Moin!

user profile iconRadioactive hat folgendes geschrieben:
Wird Form2 dann nicht doppelt Created? Denn in der Projectunit wird Form2 ja auch noch ein mal erzeugt... Ich denke, man sollte halt dann eine Anweisung löschen.


Wer lesen kann, ist klar im Vorteil:

user profile iconMuetze1 hat folgendes geschrieben:
Daher empfehle ich dir eher n den Projektoptionen die Form2 von den zu erstellenden Formularen in die verfügbaren Formulare zu verschieben und danach im FormCreate der 1. Form die 2. Form selbst erstellen.


Wenn du dies machst, wird die Erstellung der Form aus dem Projectfile entfernt und keine Instanz erstellt.

user profile iconJojojoxx hat folgendes geschrieben:
Aber irgendwie kommt jetzt automatisch Form1 in den Vordergrund, da hilft kein "Form1.invisible:=False;" oder ein "Form1.enabled:=False;". Weiß aber nicht, ob das etwas damit zu tun hat... :?:


Form1 existiert doch noch nichtmal richtig und du willst es im FormCreate() schon wieder auf nicht sichtbar stellen - die Form1 wird doch noch nichtmal angezeigt zu dem Zeitpunkt.

Grundlegend stellt sich für mich die Frage: Soll denn die Form1 überhaupt noch angezeigt werden? Jetzt klingt es für mich eher, als wenn du die Form2 als einzige Form sehen willst und diese somit zum Hauptformular werden soll. Dieses erreichst du doch über eine einfach Auswahl in den Projektoptionen schneller...

Also, wie soll dat nu?

/EDIT:
user profile iconRadioactive hat folgendes geschrieben:
Du kannst Form1 verstecken (mit Form1.Hide) oder du zeigst Form2 nicht schon beim Form1Creat an, denn dann ist Form1 über Form2, sondern erst danach.
Oder du aktivierst Form2 mit Form2.Activate. Aber nutzt alles nichts, wenn du die Anweisung in Form1Create reinschreibst.


Wie gesagt - die Instanzenvariable in Form1 enthält die Instanz, welche aber noch nicht angezeigt wird im OnCreate - daher würde auch ein Hide nichts nützen...

/EDIT2:
user profile iconRadioactive hat folgendes geschrieben:
Oder du aktivierst Form2 mit Form2.Activate. Aber nutzt alles nichts, wenn du die Anweisung in Form1Create reinschreibst.


Aktiv nützt nix - wenn, dann BringToFront o.ä.. Aktiv kann das Formular auch hinter dem anderen Formular werden...

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Mo 20.06.05 14:09 
Alsooo, das soll folgendermaßen aussehen.

Form1 soll IMMER sichtbar sein, nur soll FORM1 nicht enabled sein, solange Form2 sichtbar ist.
Beim Erstellen von Form1 wird überprüft, ob eine bestimmte Datei exisitert, wenn nicht, soll Form2 gezeigt werden (evtl. erstellt, wie auch immer). Wenn nicht, soll Form2 nur über einen Button erreichbar sein, also wird Sie im Falle, dass die Datei exisitert Nicht automatisch geladen...
Hoffe so war das verständlich :?

mfg

Jojo
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 20.06.05 14:14 
Moin!

user profile iconJojojoxx hat folgendes geschrieben:
Alsooo, das soll folgendermaßen aussehen.

Form1 soll IMMER sichtbar sein, nur soll FORM1 nicht enabled sein, solange Form2 sichtbar ist.
Beim Erstellen von Form1 wird überprüft, ob eine bestimmte Datei exisitert, wenn nicht, soll Form2 gezeigt werden (evtl. erstellt, wie auch immer). Wenn nicht, soll Form2 nur über einen Button erreichbar sein, also wird Sie im Falle, dass die Datei exisitert Nicht automatisch geladen...
Hoffe so war das verständlich :?

mfg

Jojo


Alles klar, dann mein Vorschlag dazu:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.FormCreate(Sender: TObject);
begin
  If Not FileExists(xxx) Then
  Begin
    form2 := TForm2.Create(Application);
    Try
      Form2.ShowModal;
    Finally
      FreeAndNil(Form2);
    End;
  End;
end;


Dadurch wird die Form2 Modal (also zu einem Dialog) und nach dem schliessen der Form ist die Form1 auch wieder aktiv. Auch bei diesem Beispiel am besten die o.g. Schritte durchführen und die Form2 zu den verfügbaren Formularen verschieben.

Und auf deiner Form2 kannst du einfach einen Button draufpappen, der in der Eigenschaft ModalResult irgendein Wert ungleich mrNone hat, dadurch wird das Formular beim Klick auf den Button auch gleich geschlossen.

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Radioactive
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179

Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 20.06.05 14:14 
Dann zeig doch Form2 modal an (mit Form2.ShowModal). Dabei kann man auf Form1 nicht zurückgreifen, solange Form2 nicht geschlossen ist. Ich würde außerdem das ganze Zeug aus Form1Create raushauen und das in der .dpr machen (vor Application.Run). Da kann man dann Fenster anzeigen lassen, wie man will, nachdem sie created worden sind.

_________________
Radioactive
"Wer scrollt, verliert!" Matthias Stein, Informatiklehrer am GG
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 20.06.05 14:15 
Moin!

user profile iconRadioactive hat folgendes geschrieben:
Ich würde außerdem das ganze Zeug aus Form1Create raushauen und das in der .dpr machen (vor Application.Run). Da kann man dann Fenster anzeigen lassen, wie man will, nachdem sie created worden sind.


Warum das Projectfile editieren? Im Normalfall sollte dies nicht angerührt werden, so lange du nichts grundlegendes verändern willst am Konzept der VCL Applikation.

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Radioactive
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179

Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 20.06.05 14:18 
user profile iconMuetze1 hat folgendes geschrieben:

Warum das Projectfile editieren? Im Normalfall sollte dies nicht angerührt werden, so lange du nichts grundlegendes verändern willst am Konzept der VCL Applikation.


Was soll den das heißen? Natürlich darf und kann man im Normalfall die Projektdatei ändern. Manchmal ist das sogar ein besserer Weg. Aber macht das, wie ihr wollt.

_________________
Radioactive
"Wer scrollt, verliert!" Matthias Stein, Informatiklehrer am GG
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Mo 20.06.05 14:22 
Hi!

Es hat geklappt mit "Form2.showModal".
Danke euch für die Hilfe!!!!

mfg

Jojo