MDIForms :: TForm.Create

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
GeeBee
Beiträge: 3
Registriert: So 21. Aug 2011, 13:40

MDIForms :: TForm.Create

Beitrag von GeeBee »

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

MAC
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

Beitrag von MAC »

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:

Code: Alles auswählen

Kudnernform.Show;
// Kundenform.Hide; versteckt es wieder

Code: Alles auswählen

Signatur := nil;

GeeBee
Beiträge: 3
Registriert: So 21. Aug 2011, 13:40

Re: MDIForms :: TForm.Create

Beitrag von GeeBee »

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:

Code: Alles auswählen

procedure TfrmMain.ToolButton1Click(Sender: TObject);
begin
  Application.CreateForm(TfrmLogin, FormLogin);
  FormLogin.ShowOnTop;
end;
Aber ich nehme gerne weitere Vorschläge und Hinweise entgegen :)

Danke!
Zuletzt geändert von Lori am Mo 22. Aug 2011, 18:03, insgesamt 1-mal geändert.
Grund: Highlighter

MAC
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

Beitrag von MAC »

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:

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;

GeeBee
Beiträge: 3
Registriert: So 21. Aug 2011, 13:40

Re: MDIForms :: TForm.Create

Beitrag von GeeBee »

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?

MAC
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

Beitrag von MAC »

zeig am besten mal den code, wie du ihn jetzt hast, dann kann ich das besser nachvollziehen...

Code: Alles auswählen

Signatur := nil;

Antworten