AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MDI Child Tabsheetleiste

Offene Frage von "robroy85"
Ein Thema von robroy85 · begonnen am 6. Apr 2006 · letzter Beitrag vom 6. Apr 2006
Antwort Antwort
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#1

MDI Child Tabsheetleiste

  Alt 6. Apr 2006, 11:04
Hallo allerseits!

Ich möchte in meiner MDI-Anwendung gerne, sobald meine MDi-Childs maximiert sind eine Tabsheet-ähnliche Leiste anzeigen, damit man zwischen den Client-Fenstern springen kann.
Mir fällt gerade auf, dass zB mein FireFox Browser mit den "Tabs", die man dort alternativ zu einem neuen Windowsfenster öffnen kann, genau das optisch anzeigt, was ich als Lösung suche!

Meine bisherigen Ansätze:

1. Pagecontrol und Tabsheet erstellen und MDI-Client per Parent dort reinverschieben -> geht nicht, wie ich mittlerweile auch schon mehrfach gelesen habe.

2. Pagecontrol und Tabsheet auf dem Hauptform soweit in der Höhe verkleinern bis nur noch die Reiter zu sehen sind und die Tabsheets dynamisch mit der Erstellung der Clients erstellen. Leider sieht das Ganze optisch meiner Meinung nach nicht besonders aus!

Da das Thema wohl nicht neu ist, habe ich einiges dazu in der Suche gefunden, leider keine Ansätze die mir geholfen hätten.


MDI Form auf Tabsheet?
In diesem Post schrieb urs.liska folgendes:
Zitat:
Die Möglichkeit kann ich Dir nicht erläutern, aber ich glaube, Du könntest die MDI-Formulare "andocken", denn eine der Optionen beim anDocken ist, die gedockten Formulare als PageControl anzuzeigen. Wenn das ginge, hast Du für jedes Dokument ein eigenes Fenster.
Stimmt diese Aussage? Ich habe nichts darüber in der Hilfe gefunden. Es entspricht aber exakt dem, was ich erreichen möchte!

Kann mir jemand mit Ideen weiterhelfen?


Schönen Gruss


Robert
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#2

Re: MDI Child Tabsheetleiste

  Alt 6. Apr 2006, 13:23
Mein Vorschlag:
TabSheet mit alTop ins MDIMain;
Wenn die Childs nicht maximiert, dann hat das TS die Höhe null, ansonsten die Höhe der Buttonleiste.
Sobald ein Child dazukommt, fügst Du einen neuen Tab dazu, wenn eins wegfällt, löschst Du den Tab, de dazugehört.
Jetzt kannst Du beim TabChange des TS das entsprechende MDI-Child nach vorne bringen.
Das ganze noch ein bisschen objektorientiert und auf Windows-Nachrichten des Hauptformulars lauschen (Warteschlange umbiegen, sobald ein MDI-Main Parent vom TS wird) und Du musst weder am Haupt- noch am Child was ändern.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#3

Re: MDI Child Tabsheetleiste

  Alt 6. Apr 2006, 15:02
Hm, deine Lösung entspricht wohl meiner Erstidee.

Zitat:
TabSheet mit alTop ins MDIMain;
Meinst du nicht PageControl anstatt Tabsheet?


Leider habe ich auf der linken Seite ein Navigationspanel, wenn ich num dem PageControl 'alTop' zuweise schiebt es sich antürlich auf ide ganze Breite und nicht auf die ganze Breite abzüglich der der Navi-breite.

Mit dem 'Lauschen' bin ich leider nicht vertraut. Wäre die Aktion Hauptformular.OnPaint eine passende Lauschaktion?

Zitat:
(Warteschlange umbiegen, sobald ein MDI-Main Parent vom TS wird)
Das MDI-Main ist doch sowieso die ganze Zeit Parent vom Tabsheet bzw PageControl!?!

Gruss Robert
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#4

Re: MDI Child Tabsheetleiste

  Alt 6. Apr 2006, 15:27
Natürlich Page Control.
Wenn Dein NaviPanel alLeft ist und vor dem PageControl erstellt wird, sollte eigentlich das PageControl nicht auf die ganze Breite gehen.....
[edit] hast Recht .. das PageControl zieht über die ganze Breite. Das ist unschön, weil ohne Align klappt das ganze nicht, da sich dann der Clientbereich des Hauptformulars nicht reduziert[\edit]
Wenn Du Dir einen Nachfolger vom PageControl machst, musst Du im SetParent schauen, ob der zukünftige Parent einTForm ist unf FormStyle auf MDIForm steht. Wenn ja, lässt Du Dir von diesem Form die Routine für die Windowsnachrichten geben lassen. Die merkst Du Dir dann und ersetztt sie durch eine eigene. Damit erreichst Du, dass alle Windowsnachrichten zuerst beim PageControl ankommen. Wenn dann eine Nachricht, wie maximieren kommt, die als Ziel eines der MDI Children hat, dann musst Du dein Pagecontrol vergrössern und die Nachricht weitergeben, indem Du die gemerkte originale Routine des Main Formular aufrufst.
Hört sich erstmal kompliziert an, isses aber garnicht.
Delphi-Quellcode:
    
    oParentForm:=_oParentForm;
    ParentWindProc:=oParentForm.WindowProc; //!< Save Parents WindowProc
    oParentForm.WindowProc:=ParWndProc; //!< Write ParWndProc to parent windowProc
ParWndProc ist eine Variable vom Typ TWndMethod, ParentWindProc ist die eigene Windowprozedur, in der Du dann die Nachrichten abfangen kannst.
Aber dabei aufpassen: das musst Du wieder ordentlich zurückbauen, wenn der Parent wieder flöten geht.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#5

Re: MDI Child Tabsheetleiste

  Alt 6. Apr 2006, 16:14
Uffff...
Damit die nächsten Posts nicht so aussehen
{
robroy85: Kannst du das nochmal erklären?
Sidorion: was?
robroy85: alles!
}
werde ich jetzt meine Fragen höflich einzeln formulieren, auch wenn sie doch einen Großteil deiner Antwort beinhalten:

Wie erstelle ich etwas "vor" etwas anderem, wenn ich die Komponenten nicht dynamisch, sondern zur Entwurfszeit per Drag&Drop erstellt habe. Ich habe solche verschachtelten Layouts bisher mit Panels gelöst. Das geht aber wohl in diesem Fall nicht, da MDIChildren ja immer optisch hinter den Panels des Hauptformulars liegen.

Was meinst du mit "Nachfolger vom PageControl machen". Soll ich das PageControl erst zur Laufzeit erstellen und damit dynamisch erstellen?

Wie lasse ich mir Routinen für die Windowsnachrichten geben?

Wenn ich das richtig verstanden habe, dann dient das dazu, dass das PageControl einen Status wie wie "MDIChildren[i].WindowState" auswertet?

Wieso muss ich das PageControl vergrössern? Ich bin bisher davon ausgegangen, dass man MDIChilds nicht in anderen Komponenten darstellen kann?


Sry, für die vielen Fragen, doch dein Vorschlag schneidet leider einige Themenbereiche mit denen ich mich bisher noch nicht befasst habe. Ich habe bisher nur "einspurige" Anwendungen programmiert, das hat für Anfänger den Vorteil, dass man die Benutzerinteraktionen ziemlich genau vorhersehen kann und vieles durch If-Schleifen o.Ä. löst. Leider hat das auch den Nachteil, dass man wenig über Objekt-orientiertes Programmieren lernt.
Ich hoffe also, ich kann neben "Augen-Rollen" auch ein bisschen Verständnis für die Flut meiner Fragen ernten.



Gruss Robert
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#6

Re: MDI Child Tabsheetleiste

  Alt 6. Apr 2006, 17:17
@1: das mit dem 'vor' erstellen fällt weg, da alTop grundsätzlich(leider) vor alLeft ausgewertet wird. Trotzdem eine Antwort hierauf: Beim Erstelen eines designten Formulars wertet Delphi das .dfm file aus. Hier stehen alle Komponenten ind der Reihenfolge drin, in der Du sie auf dem Formular platziert hast(zeitlich), inclusive aller Verschachtelungen. Damit ist gewährleistet, dass a) die Komponenten immer in der selben Reihenfolge erstellt werden und b) die Parents schon da sind, wenn childs erstellt werden. Im übrigen macht Delphi beim Erstellen aus einem .dfm nichts anderes, was Du auch im FormCreate machen würdest, wenn Du eine Komponente dazubringen willst, also Instanz kreieren und alle Properties zuweisen, die sich von defaultwerten unterscheiden (also auch den Parent).
Die MDI Childs liegen im Client-Bereich des Hauptformulars, und eben dieser wird verkleinert, wenn eine 'normale' Komponente mit alIrgendwas auf dem Hauptformular liegt, d.h. sie liegen nur dahinter, denn die Komponente kein align hat.
@2: Mit Nachfolger machen meine ich, die Klasse TCustPageControl oder so überschreiben. Wenn Du das in einem Package machst, kannst Du das auch in die IDE integrieren, aber erstmal genügt es eine Instanz davon im FormCreate des Hauptformulars zu erstellen usw.
@3: wie beschrieben:
property WindowProc: TWndMethod read FWindowProc write FWindowProc; ist eine public property von TControl und zeigt auf die zu benutzende Prozedur, die Delphi ruft, falls eine Windowsnachricht ankommt. Wenn Du Dir diese Prozedur merkst und eine eigene dieser Property zuweist, wird ab dann diese gerufen. Jetzt kannst Du in Deiner Eigenen Prozedur auf alle Windows-Nachrichten reagieren, die eigentlich für das Hauptformular bestimmt sind und da diese Parent von den MDIChilds ist auch alle Nachrichrten an diese. Nachdem Du reagiert hast (z.B.: neuen Tab erstellen), solltest Du aber die Nachricht an die originale(gemerkte) Prozedur weiterleiten und das hauptformular reagiert normal darauf.
@4: nicht direkt. Du kanns aber die Windowsnachricht auswerten, die dafür sorgt, dass MDIChildren[i].WindowState gerufen wird.
@5: Der Trick dabei ist der, dass die Children nach wie Vor als Parent das Hauptform haben und die Größenanderung sorgt nur dafür, das Dein Pagecontrol unsichtbar wird, wenn die Children nicht maximiert sind. Du kannst auch Visible auf false setzen, ich weiss allerdings nicht, ob das den Clientbereich des Hauptforms beeinflusst.

p.s.: Augen rolle ich nur, wenn sich jemand dumm stellt. Du versuchst, etwas zu lernen und das kann man nur gutheissen
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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