Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Liste der geöffneten MDI-Child-Fenster (https://www.delphipraxis.net/64258-problem-mit-liste-der-geoeffneten-mdi-child-fenster.html)

hincapie 1. Mär 2006 14:18


Problem mit Liste der geöffneten MDI-Child-Fenster
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,
bei mir raucht's mal wieder! :gruebel: :drunken:
Also, ich habe da einen Editor als MDI-Anwendung und möchte mir die göffneten Child-Fenster als TabSheets in einem PageControl anzeigen lassen.
Dazu nutze ich folgende Prozedur:
Delphi-Quellcode:
   
procedure TFrameForm.MakeChilds;
var
  i, c: integer;
begin
  i := 0;
  c := 0;
  for i := 0 to PageControl1.PageCount -1 do
     PageControl1.Pages[i].Free;
  for c:=0 to MDIChildCount -1 do
    with tTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
    end;
  if MDIChildCount = 0 then CoolBar1.Height :=               Toolbar2.Height +4 
    else CoolBar1.Height := Toolbar2.Height + PageControl1.Height +8;
end;
Diese Prozedur rufe ich nun beim OnCreate des ChildFensters auf. Soweit so gut.
Bei zwei Childs funzt das auch, siehe Bild 'korrekt.jpg';
beim Öffnen des dritten Childs kommt's dann, siehe 'unkorrekt.jpg';
beim vierten ist dann wieder alles in Butter -> 'geht_wieder.jpg'.
Hat jemand eine halbwegs logische Erklärung dafür? :wiejetzt:

Ach ja, irgendwie muss ich noch auf das Beenden eines Childs reagieren, aber wie?
Beim OnDestroy mit o.g. Prozedur zählt immer noch das gerade geschlossene Fenster mit. :shock:

uwewo 1. Mär 2006 15:32

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Hallo,

das ist völlig klar, beim freigeben der PageControls gehst Du falsch herum vor.

Ändere Deine Schleife von

Delphi-Quellcode:
for i := 0 to PageControl1.PageCount -1 do
in

Delphi-Quellcode:
for i := PageControl1.PageCount -1 downto 0 do
und alles ist wunderbar.

Uwe

hincapie 2. Mär 2006 07:11

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
@ uwewo:
Es scheint wohl so, habe den Code umgestellt auf:
Delphi-Quellcode:
   for i := PageControl1.PageCount -1 downto 0 do
     PageControl1.Pages[i].Free;
Jetzt funktioniert es richtig! Danke für den Tipp!!

Hhm, nun brauche ich nur noch ne vernünftige Lösung für das Schliessen der Childs.
Mit dieser Schleife im OnDestroy oder OnClose des ChildFensters wird immer noch das eigentlich gerade geschlossene Fenster mit angezeigt.

Mavarik 2. Mär 2006 10:16

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von hincapie
Hhm, nun brauche ich nur noch ne vernünftige Lösung für das Schliessen der Childs.
Mit dieser Schleife im OnDestroy oder OnClose des ChildFensters wird immer noch das eigentlich gerade geschlossene Fenster mit angezeigt.

Wie wäre es, wenn Du den Pointer des gerade zu schliessenden Fensters mit an die Routine übergibst...

Dann kannst Du den abtesten und das Fenster ignorieren..

Frank :coder:

uwewo 2. Mär 2006 12:29

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Hi hincapie,

eigentlich finde ich es eh nicht so toll, daß Du jedesmal alle
PageControls entfernst und dann alle wieder erstellst.

Du kannst doch auch über den Index, einzelne bei Gelegenheit freigeben
und neue einfach hinzufügen.

Oder verstehe ich es nicht richtig.

Uwe

Mavarik 2. Mär 2006 12:59

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von uwewo
Hi Frank,

Ich? War nicht meine Idee!

hincapie 2. Mär 2006 14:03

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von Mavarik
Zitat:

Zitat von hincapie
Hhm, nun brauche ich nur noch ne vernünftige Lösung für das Schliessen der Childs.
Mit dieser Schleife im OnDestroy oder OnClose des ChildFensters wird immer noch das eigentlich gerade geschlossene Fenster mit angezeigt.

Wie wäre es, wenn Du den Pointer des gerade zu schliessenden Fensters mit an die Routine übergibst...

Dann kannst Du den abtesten und das Fenster ignorieren..

Frank :coder:

Hab noch nicht viel mit Pointern zu tun gehabt. :oops:
Wie sollte das denn Deiner Meinung nach aussehen? :?:

Flocke 2. Mär 2006 15:05

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Du kannst alternativ auch testen, ob das Fenster bald zerstört werden wird:
Delphi-Quellcode:
for c:=0 to MDIChildCount -1 do
  if not (csDestroying in MDIChildren[c].ComponentState) then
    with tTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
    end;
Dann kannst du die Routine auch im OnDestroy der MDI-Fenster benutzen (wenn das Ereignis ausgelöst wird ist das Flag csDestroying schon gesetzt).

hincapie 2. Mär 2006 15:21

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von Flocke
Du kannst alternativ auch testen, ob das Fenster bald zerstört werden wird:
Delphi-Quellcode:
for c:=0 to MDIChildCount -1 do
  if not (csDestroying in MDIChildren[c].ComponentState) then
    with tTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
    end;
Dann kannst du die Routine auch im OnDestroy der MDI-Fenster benutzen (wenn das Ereignis ausgelöst wird ist das Flag csDestroying schon gesetzt).

Danke! Funzt!! :thumb: :zwinker:

hincapie 3. Mär 2006 08:44

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
So, gleicher Kontext, neues Problem:

Ich möchte nun mit einem Klick auf das TabSheet das dazugehörige Child-Fenster in den Vordergrund bringen.
Diese Anweisung funktioniert nur bedingt:
Delphi-Quellcode:
procedure TFrameForm.PageControl1Change(Sender: TObject);
begin
  MdiChildren[PageControl1.ActivePageIndex].BringToFront;
end;
Beim ersten Klick wechselt nur die Reihenfolge der Tabsheets im PageControl, beim nächsten Klick wird erst das richtige Childfenster in den Vordergrund gebracht.
Hat jemand eine Erklärung dafür? :gruebel:

uwewo 3. Mär 2006 11:02

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Ich kann das jetzt schlecht nachstellen, aber kannst Du den Index des
zu aktivierende Fenster nicht über seinen Namen bestimen.

hincapie 3. Mär 2006 11:40

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von uwewo
Ich kann das jetzt schlecht nachstellen, aber kannst Du den Index des
zu aktivierende Fenster nicht über seinen Namen bestimen.

Ja, aber wie komme ich an den Namen, wenn ich die TabSheets doch erst zur Laufzeit erstellen lasse und daher den Namen vorher gar nicht kenne? :gruebel:

Flocke 3. Mär 2006 21:39

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Du kannst anhand der Caption suchen (Tabsheet.Caption = MDIChild.Caption).

Besser: definiere deine eigene TMDIChildTabSheet-Klasse mit
Delphi-Quellcode:
type
  TMDIChildTabSheet = class(TTabSheet)
  private
    FMDIChild: TForm;
  public
    property MDIChild: TForm read FMDIChild write FMDIChild;
  end;
Die Tabsheets erzeugst du dann so:
Delphi-Quellcode:
for c:=0 to MDIChildCount -1 do
  if not (csDestroying in MDIChildren[c].ComponentState) then
    with tMDIChildTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
      MDIChild := MDIChildren[c];
    end;
Und dann kannst du es einfach mit
Delphi-Quellcode:
procedure TFrameForm.PageControl1Change(Sender: TObject);
begin
  TMDIChildTabSheet(PageControl1.ActivePage).MDIChild.BringToFront;
end;
nach vorne holen.

hincapie 6. Mär 2006 07:35

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
@ flocke: Super, funktioniert soweit ganz klasse, danke!! :thumb:

Jetzt habe ich aber noch ein Problem:
Wenn ich nun mit einem Mausklick ein Childfenster aktiviere, sollte auch der entsprechende TabSheet markiert werden.
D.h. irgendwas in der Richtung:
Delphi-Quellcode:
  PageControl1.ActivePage := ActiveMDIChild.Caption;
Funktioniert so natürlich nicht, aber so ähnlich müßte es doch sein, oder?
Und wo müßte die Zuweisung erfolgen, im onActivate des ChildFormulars? :?: :gruebel:

Flocke 6. Mär 2006 08:21

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Du musst ja nur das TabSheet suchen, dass sich auf ActiveMDIChild bezieht:
Delphi-Quellcode:
for c := 0 to tMDIChildTabSheet.PageCount - 1 do
  if TMDIChildTabSheet(tMDIChildTabSheet.Pages[c]).MDIChild = ActiveMDIChild then
    tMDIChildTabSheet.ActivePageIndex := c;

hincapie 6. Mär 2006 09:16

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Hallo flocke:
meinst Du etwa so: :wink:
Delphi-Quellcode:
  for c := 0 to MDIChildCount - 1 do
  if TMDIChildTabSheet(PageControl1.Pages[c]).MDIChild = ActiveMDIChild  then
    PageControl1.ActivePageIndex := c;
Im OnActivate des ChildFensters eingebunden funzt es!! :thumb: :thumb:
Vielen Dank nochmal!! :wink:

Flocke 6. Mär 2006 11:00

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von hincapie
Hallo flocke:
meinst Du etwa so: :wink:

Ja -räusper- genau so ... hatte ich doch auch geschrieben, oder? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz