MDIForms :: TForm.Create
MDIForms :: TForm.Create
Hallo Leute,
ich habe grade ein Brett vor dem Kopf und brauche mal eure Hilfe.
Es ist schon eine Weile her das ich mit Pascal aktiv war und komme aus der Java-Ecke. Iich möchte ein MDI Main erstellen und darin sollen MDIChilds leben.
HauptProgramm das MDIMain und darin Kunden-MDIChild, ArtikelMDIChild etc.
Nun habe ich aber schon in diversen Googleteilen gelesen das Lararus wohl keine MDIs unterstützt. Ist auch nicht tragisch, also habe ich mein Mainform und ein Kundenform, wenn auch ersteinmal probehalber erstellt und möchte dann mit einen ToolBarButten das KundenForm öffen. Allerdings werden offensichtlich schon alle Formen beim Start aufgerufen. Dann habe ich eben Application.CreateForm(Kundenform) aus der Main Unit heraus genommen und onButtonclick Application.Createform aufgerufen. Ist das die Lösung oder ist das nicht so besonders?
Oder gibt es inzwischen die MDI Unterstützung, denn man kann ja bei den Formen MDIChild auswählen, allerdings sehe ich das Child dann nicht und ich glaube dem Rechner gefällt das auch nicht so besonders.
Irgendeine gute Idee wäre hilfreich!
Danke im Voraus
ich habe grade ein Brett vor dem Kopf und brauche mal eure Hilfe.
Es ist schon eine Weile her das ich mit Pascal aktiv war und komme aus der Java-Ecke. Iich möchte ein MDI Main erstellen und darin sollen MDIChilds leben.
HauptProgramm das MDIMain und darin Kunden-MDIChild, ArtikelMDIChild etc.
Nun habe ich aber schon in diversen Googleteilen gelesen das Lararus wohl keine MDIs unterstützt. Ist auch nicht tragisch, also habe ich mein Mainform und ein Kundenform, wenn auch ersteinmal probehalber erstellt und möchte dann mit einen ToolBarButten das KundenForm öffen. Allerdings werden offensichtlich schon alle Formen beim Start aufgerufen. Dann habe ich eben Application.CreateForm(Kundenform) aus der Main Unit heraus genommen und onButtonclick Application.Createform aufgerufen. Ist das die Lösung oder ist das nicht so besonders?
Oder gibt es inzwischen die MDI Unterstützung, denn man kann ja bei den Formen MDIChild auswählen, allerdings sehe ich das Child dann nicht und ich glaube dem Rechner gefällt das auch nicht so besonders.
Irgendeine gute Idee wäre hilfreich!
Danke im Voraus
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: MDIForms :: TForm.Create
Willkommen hier im Lazarusforum.
Also, obwohl ich mich in dem Bereich nicht so gut auskenne versuch ich mal zu antworten:
Soweit ich weis sind MIDChilds (das sind doch Fenster in einem Fenster oder ? ) in der Entwicklung. Ich glaube auch irgendow gelesen zu haben das diese schon teilweise funktionieren, selber hab ich das noch nicht hinbekommen (interressiert mich auch nicht so stark)
Normalerweise gibt folgendes:
Du kannst mehrere Form's erstellen.
Diese werden alle beim Programmstart erstellt (So würde ich es auch lassen, also das Application.CreateForm(Kundenform) wieder so machen wie es vorhin war)
Allerdings ist die erste Form die Hauptform, sie sollte als einziges sichtbar sein beim Programmstart und alle anderen sollten erstmal unsichtbar sein.
In deinem Button würde ich dann die Kundenform nur von der Sichtbarkein ändern, heißt:
Also, obwohl ich mich in dem Bereich nicht so gut auskenne versuch ich mal zu antworten:
Soweit ich weis sind MIDChilds (das sind doch Fenster in einem Fenster oder ? ) in der Entwicklung. Ich glaube auch irgendow gelesen zu haben das diese schon teilweise funktionieren, selber hab ich das noch nicht hinbekommen (interressiert mich auch nicht so stark)
Normalerweise gibt folgendes:
Du kannst mehrere Form's erstellen.
Diese werden alle beim Programmstart erstellt (So würde ich es auch lassen, also das Application.CreateForm(Kundenform) wieder so machen wie es vorhin war)
Allerdings ist die erste Form die Hauptform, sie sollte als einziges sichtbar sein beim Programmstart und alle anderen sollten erstmal unsichtbar sein.
In deinem Button würde ich dann die Kundenform nur von der Sichtbarkein ändern, heißt:
Code: Alles auswählen
Kudnernform.Show;
// Kundenform.Hide; versteckt es wieder
Code: Alles auswählen
Signatur := nil;
Re: MDIForms :: TForm.Create
Hej MAC,
danke für die Antwort. Jetzt stellt sich natürlich die Frage WANN ich Form.HIDE aktivieren kann.
Denn bei Form.Create bekomme ich sicherlich einen Fehler, denn laut LPR wird erst das Main und dann die anderen erstellt.
Meine Lösung ist bisher:
Aber ich nehme gerne weitere Vorschläge und Hinweise entgegen 
Danke!
danke für die Antwort. Jetzt stellt sich natürlich die Frage WANN ich Form.HIDE aktivieren kann.
Denn bei Form.Create bekomme ich sicherlich einen Fehler, denn laut LPR wird erst das Main und dann die anderen erstellt.
Meine Lösung ist bisher:
Code: Alles auswählen
procedure TfrmMain.ToolButton1Click(Sender: TObject);
begin
Application.CreateForm(TfrmLogin, FormLogin);
FormLogin.ShowOnTop;
end;

Danke!
Zuletzt geändert von Lori am Mo 22. Aug 2011, 18:03, insgesamt 1-mal geändert.
Grund: Highlighter
Grund: Highlighter
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: MDIForms :: TForm.Create
also ich vermute bisher, das die Lösung nicht optimal ist, vor allem,wenn man den Button mehrmals betätigt werden mehrere Formen erstellt, und Pascal hat im Gegensatz zu Java kein GC, also würden Speicherlecks entstehen.
Was auch geht ist folgendes:
- du lässt Beide Application.CreateForm da wo sie waren.
- eigentlich sollte es nicht notwenidg sein das 2te Fenster zu verstecken, da es standartmäßig versteckt , allerdings ist das trotzdem möglich indem du einen kleinen Trick verwendest:
a) Wie du schon gesagt hast gibt es die Form2 noch nicht während Form1.Create...
Was ich immer mache ist mir ein Timer auf Form1 zu setzen, das Interval setze ich auf 1 (=1 ms) und mein Timer1.Timer sieht ungefähr so aus:
Was auch geht ist folgendes:
- du lässt Beide Application.CreateForm da wo sie waren.
- eigentlich sollte es nicht notwenidg sein das 2te Fenster zu verstecken, da es standartmäßig versteckt , allerdings ist das trotzdem möglich indem du einen kleinen Trick verwendest:
a) Wie du schon gesagt hast gibt es die Form2 noch nicht während Form1.Create...
Was ich immer mache ist mir ein Timer auf Form1 zu setzen, das Interval setze ich auf 1 (=1 ms) und mein Timer1.Timer sieht ungefähr so aus:
Code: Alles auswählen
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False; // Sorgt dafür , das der Timer nur 1 einziges mal ausgefürt wird // Timer1.Free würde eigentlich auch gehen.
{ Hier kann jetzt alles stehen, denn der Timer wird erst aufgerufen, sobald der ganze Rest (Form1.Create, Form2.Create) erledigt wurde...
end;
Code: Alles auswählen
Signatur := nil;
Re: MDIForms :: TForm.Create
Ok, wenn ich es so lasse mit welchem Aufruf schliesse ich dann das aufgerufene Fenster wieder?
ButtonClose.Click
Form.Hide
führt zu einem SIG Fehler und das Main taucht nicht mehr auf.
Form.destroy geht auch nicht und Form.close ist ja auch eine schlechte Wahl denn dann sehe ich es nie wieder
Das mit dem Timer habe ich nicht ganz verstanden. Wo taucht dieser Timer denn auf um dann FormAnmeldung.hide aufzurufen.
Im Main als Procedure und wie wird die aufgerufen?
ButtonClose.Click
Form.Hide
führt zu einem SIG Fehler und das Main taucht nicht mehr auf.
Form.destroy geht auch nicht und Form.close ist ja auch eine schlechte Wahl denn dann sehe ich es nie wieder

Das mit dem Timer habe ich nicht ganz verstanden. Wo taucht dieser Timer denn auf um dann FormAnmeldung.hide aufzurufen.
Im Main als Procedure und wie wird die aufgerufen?
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: MDIForms :: TForm.Create
zeig am besten mal den code, wie du ihn jetzt hast, dann kann ich das besser nachvollziehen...
Code: Alles auswählen
Signatur := nil;