TForm.MDIChildCount bleibt immer 0

Rund um die LCL und andere Komponenten
Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

TForm.MDIChildCount bleibt immer 0

Beitrag von Kay »

Hallo,

ich habe ein Problem bei der Verwendung von MDI-Formularen.

Ich habe zunächst ein Hauptformular entworfen, auf dem sich eine Menüleiste TMainMenu und eine ListBox befinden.

Bei einem Klick im Menü soll ein neues Unterformular erzeugt werden, Num ist dabei eine globale Integer-Variable:

Code: Alles auswählen

procedure TForm1.FileNewMenuClick(Sender: TObject);
begin
  Inc(Num);
  with TForm2.Create(Self) do
  begin
    Caption := 'MDIChild' + IntToStr(Num);
    Visible := True;
    ListBox1.Items.Add(Caption);
  end;
end;
Das funktioniert soweit auch sehr gut, d.h. das neue Formular wird eingeblendet.

Nun möchte ich durch einen Klick in der ListBox zwischen den verfügbaren Unterformularen wechseln. Da hier Zugriffsverletzungen auftraten, habe ich zunächst nur die Anzahl ausgeben lassen:

Code: Alles auswählen

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(MDIChildCount));
//  MDIChildren[ListBox1.ItemIndex].BringToFront;
end;
Aber egal wie viele Unterformulare ich hinzugefügt habe, die Eigenschaft MDIChildCount bleibt immer auf 0 stehen. Wie kann das denn sein?

Form1 hat natürlich fsMDIForm und Form2 hat fsMDIChild. Daran sollte es also eigentlich nicht liegen.

Vielen Dank schonmal!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Michl »

Das Verhalten kann ich bestätigen unter Win7: Lazarus 1.3 r43595M FPC 2.7.1 i386-win32-win32/win64, getestet mit:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  NewForm2:TForm2;
begin
  NewForm2:=TForm2.Create(Self);
//  NewForm2.FormStyle:=fsMDIChild;  //schon im Objektinspektor zugewiesen - ist aber Wurst...
  NewForm2.Caption:='Form Nummer '+IntToStr(MDIChildCount);
  NewForm2.Visible:=True;
end;  
(Form1.FormStyle=fsMDIForm)

Soweit ich das gelesen habe, ist MDI nicht vollständig integriert/portiert und funktioniert nur partiell. Empfohlen wird wohl stattdessen MultiDoc (habe ich aber nicht getestet): http://wiki.freepascal.org/MultiDoc/de, kommt aber darauf an, was Du eigentlich vorhast...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Kay »

Hm, na wenn die MDI-Eigenschaften nicht vollständig integriert sind, brauche ich mich natürlich auch nicht zu wundern.
Aber mal ganz naiv gefragt: Müsste die Lazarus-IDE selbst nicht auch MDI verwenden, um die Quelltextfenster für die ganzen Units darzustellen? Oder ist das ein TDI?

Den Artikel zu TMultiDoc habe ich mir gerade mal angeschaut. Wenn ich allerdings im Downloadbereich klicke, dann wird lediglich das Archiv powerpdf heruntergeladen. In den Sourcen finde ich dort nirgendswo eine Komponente TMultiDoc.
Kann es sein, dass die falsche Datei verlinkt wurde bzw. die Komponente nicht verfügbar ist?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Michl »

Kay hat geschrieben:Kann es sein, dass die falsche Datei verlinkt wurde bzw. die Komponente nicht verfügbar ist?
Ja, müsstes mal die englische Wiki-Page nehmen, da gibt es einen alternativen Link...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Kay »

Na das ist ja lustig. Aber gut, ich habe jetzt alles gefunden. Der alternative Link funktionierte.
Das Paket sieht auf den ersten Blick auch echt brauchbar aus. Da werde ich jetzt etwas experimentieren.
Vielen Dank auf jeden Fall für den Tipp!

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Kay »

OK, ich bräuchte jetzt doch nochmal etwas Hilfe bei der Installation des Packages.

Ich bin folgendermaßen vorgegangen:

Zunächst habe ich das Package LMDI installiert, da Multidoc dieses benötigt. LMDI wurde erfolgreich installiert, Lazarus wurde problemlos neu kompiliert.
Nun habe ich testhalber eine TButtonsBar auf ein leeres Formular gelegt und das Projekt kompiliert. Das funktionierte alles einwandfrei. Ich nehme also an, dass das Package verfügbar ist und die Units auch gefunden werden.

Im nächsten Schritt wollte ich das Package Multidoc installieren. Ich kopiere also den entpackten multidoc-Ordner inkl. aller enthaltenen Dateien und Unterverzeichnisse nach $(LazarusDir)\components und öffne die multidocpackage.lpk.
Wenn ich jetzt allerdings auf "Installieren" klicke, erhalte ich die Fehlermeldung, dass das Package nicht installiert werden kann, weil die Unit ButtonsBar nicht gefunden wurde.

Das verstehe ich nicht. Muss ich denn die LPK-Datei noch irgendwie anpassen? Es ist doch eigentlich alles vorhanden!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Michl »

Sehr merkwürdig, bei mir funktioniert alles (wie gesagt: Win7: Lazarus 1.3 r43595M FPC 2.7.1 i386-win32-win32/win64)...

LMDI runtergeladen von hier http://www.oocities.org/br/hipernetjr/lmdi/lmdi-0.1.zip
MultiDoc 0.3.1 runtergeladen von hier http://www.oocities.org/br/hipernetjr/l ... -0.3.1.zip

Zuerst hatte ich die MultiDoc kompilieren wollen, da hat der Compiler geschimpft, dass die LMDI fehlt, also habe ich diese kompiliert. Dann habe ich MultiDoc installiert, alles ohne Probleme! Ein erster Test war auch erfolgreich!

Habe die zwei Packages noch angefügt.
Dateianhänge
multidoc-0.3.1.zip
(20.73 KiB) 74-mal heruntergeladen
lmdi-0.1.zip
(80.06 KiB) 67-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Kay »

Also ich dachte, dass es eventuell an meiner etwas überholten Version von Lazarus liegen könnte. Ich habe daher jetzt ein Upgrade von 1.0.10.0 auf 1.0.14.0 durchgeführt. Leider besteht das Problem weiterhin.
Nun habe ich überlegt, ob die IDE die Units nicht findet. Den lmdi-Ordner habe ich unter $(LazarusDir)\components abgelegt und eigentlich dachte ich, dass alle im components-Ordner vorhandenen Unterverzeichnisse automatisch in den Suchpfad aufgenommen werden. Ist das denn nicht so? Muss ich das eventuell ändern? Wenn ja, wo und wie?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TForm.MDIChildCount bleibt immer 0

Beitrag von Michl »

Bin gerade unterwegs, habe aber gerade die zwei oben hinzugefügten Packages vom Forum runtergeladen und nochmal auf ein KlappRechner mit Win7 Lazarus 32bit 1.0.14 kopiert (habe einfach ein neues Verzeichnis erstellt C:\06\TestMultiDoc und dahin kopiert), zuerst LMDI kompiliert, dann Multidoc kompiliert, dann Multidoc installiert. Funktioniert problemlos. Ein kleiner Test mit MultiDoc und FormPanel funktioniert auch. Kann das Problem nicht nachstellen, weiss auch nicht, was Du für ein System/Lazarusversion(32bit/64bit) nutzt?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten