| Autor |
Beitrag |
Jojojoxx
      
Beiträge: 386
|
Verfasst: 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:
Ich benutze folgenden Code:
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
      
Beiträge: 236
WinXP Home
Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 346
|
Verfasst: 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.
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 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 346
|
Verfasst: Mo 20.06.05 13:42
Moin!
Ja, sorry, mein Fehler: Im Create sollte in Klammern noch Application rein.
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
      
Beiträge: 179
Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
|
Verfasst: 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 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 179
Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
|
Verfasst: 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
      
Beiträge: 346
|
Verfasst: Mo 20.06.05 14:04
Moin!
Radioactive 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:
Muetze1 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.
Jojojoxx 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:
Radioactive 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:
Radioactive 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 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 346
|
Verfasst: Mo 20.06.05 14:14
Moin!
Jojojoxx 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:
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
      
Beiträge: 179
Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
|
Verfasst: 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
      
Beiträge: 346
|
Verfasst: Mo 20.06.05 14:15
Moin!
Radioactive 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
      
Beiträge: 179
Win 98, Win XP Home SP2
D3 Prof, D7 Pers, D2005 Pers
|
Verfasst: Mo 20.06.05 14:18
Muetze1 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 
      
Beiträge: 386
|
Verfasst: Mo 20.06.05 14:22
Hi!
Es hat geklappt mit "Form2.showModal".
Danke euch für die Hilfe!!!!
mfg
Jojo
|
|
|