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 Design mit (fast) gleichen Tabsheets vereinfachen (https://www.delphipraxis.net/213950-design-mit-fast-gleichen-tabsheets-vereinfachen.html)

Dalai 25. Okt 2023 16:01

Design mit (fast) gleichen Tabsheets vereinfachen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ihr.

Ich hoffe, mir kann jemand bei diesem Design-Problem helfen.

Erstmal zu den Fakten.
Gegeben ist ein PageControl, auf dem sich aktuell 7 TabSheets befinden. Jedes der TabSheets sieht ungefähr so aus wie im angehangenen Bild. Die Komponenten auf diesen TabSheets - Panel, GroupBoxen und Splitter - sind identisch. Der einzige Unterschied zwischen den TabSheets sind die in den GroupBoxen plazierten ListViews. Einige haben nur eine Spalte, andere haben zwei oder vier. Die Spaltenbreiten und deren Titel sind ebenfalls unterschiedlich. Außerdem gibt es bei den ListViews verschiedene Alignments aufgrund der Splitter: die links positionierten ListViews haben alLeft, die beiden rechts positionierten haben alClient, um den Rest des Platzes auszufüllen.

Nun zur Problemstellung.
Ein weiteres TabSheet hinzuzufügen, ist ziemlich aufwendig, weil alle Komponenten kopiert werden müssen. Das muss zwar nicht einzeln erfolgen, weil direkt auf dem TabSheet zwei Panel und ein Splitter liegen und somit nur diese "Container" kopiert werden müssen. Aber benannt werden müssen die Kopien trotzdem noch.

Nun dachte ich, man könnte das mit Frames vereinfachen. Leider funktioniert das nicht so, wie ich mir das vorstelle. Ich kann die bei meinen Tests mit Frames aufgetretenen Probleme gern genauer ausführen, aber da der Text eh schon recht lang ist, belasse ich es vorerst dabei. Aber ich weiß noch nicht so recht zu beurteilen, ob Frames überhaupt der richtige oder geeignete Weg sind.

Wie würdet ihr das angehen? ListViews, bzw. generell Komponenten, zur Laufzeit erzeugen will ich wegen des Aufwands aufgrund der unterschiedlichen Eigenschaften (Anzahl+Breite+Titel der Spalten, Alignment etc.) vermeiden.

Grüße
Dalai

Der schöne Günther 25. Okt 2023 16:11

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Frames sind genau dafür gemacht.

dummzeuch 25. Okt 2023 16:28

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Tabs dynamisch erzeugen und jeweils einen Frame dort einblenden. Diese Frames können ggf. identisch sein und nur mit unterschiedlichen Parametern initialisiert werden oder sie können von einem Basis-Frame abgeleitet werden, der alles enthält, was die Frames gemeinsam haben. Ich bin persönlich kein großer Fan von visueller Vererbung und würde deshalb versuchen, mit nur einem Frame auszukommen und die unterschiedliche Verhaltensweise mittels Callbacks oder Events implementieren, aber das ist größtenteils Geschmacksache.

Hinweis: Falls Du dieselbe Frame-Klasse mehrfach erzeugst, musst Du danach entweder deren Namen auf '' oder auf einen eindeutigen String setzen, sonst mosert die VCL was von doppelten Controlnamen.

Kas Ob. 25. Okt 2023 17:17

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Hi,

I did the following many times:
1) You need two frames, one have everything except the difference which in this case your ListView, the other frame will have all your ListViews, these ListViews should not have alClient and it doesn't matter how they are positioned on that frame, TTabTampleteFrame and TListViewsFrame.
2) Don't inherit the frame TTabTampleteFrame, just register its class and create it at runtime, so you don't need to waste time with naming.
3) The frame with ListViews (TListViewsFrame) can be created any time you want, you need one copy of it, and you will change the parent for each ListView to its according TabSheet/Frame, and set the alignment, position, etc..
4) It is easier and more usable to have variables declared as the first frame TTabTampleteFrame or the tab inside it if you want, then just put with only ":=" the created frame to it (or tabsheet or even the listview.. it depends on your code and what you need), and continue to use it as you have them designed separately.
5) The point of variables is to remove the need to use any indexing, so double think what are you will need to access in them in specific as variables will give you that, other controls in the template frame will be a little harder to access.

Hope that help, and hope it was clear.

Kas Ob. 25. Okt 2023 17:22

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Small adjustment:
you can have a form instead of a frame for your ListViews, and let it being auto created the project, that is simpler.

himitsu 25. Okt 2023 17:40

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Einfacher ... nicht wirklich. (fast gleich aufwändig)

Aber dafür sind Forms problematischer, vor allem was die Fokus-Steuerung betrifft.

Dalai 28. Okt 2023 14:31

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Sieht so aus, als müsste ich doch erklären, welche Probleme ich mit den Frames hatte. Meine Annahme war, dass auf den Frame nur diejenigen Komponenten gepackt werden sollen, die auf allen Tabs identisch sind. Also fügte ich die Panels, GroupBoxen und einen Splitter auf den Frame hinzu, plazierte diesen dann auf dem TabSheet und wollte anschließend die ListViews direkt ergänzen.

Das Ergebnis war, dass sich das Alignment und die Anchors des ListViews nach dem TabSheet richten statt nach der auf dem Frame plazierten GroupBox (siehe Screenshot im OP). Das ListView lag also nicht auf einer der Komponenten des Frame sondern über dem Frame. Das ist natürlich nicht Sinn der Sache.

Offenbar kann man die ListViews (ohne Spalten) auch direkt auf eine GroupBox des Frame packen und dann die Spalten in der konkreten "Ableitung" des ListViews auf dem jeweiligen Tab ergänzen. Dummerweise hat Delphi 5 dabei einen Bug. Die Spalten lassen sich hinzufügen, werden auch gespeichert (sieht man in der DFM), aber beim erneuten Laden des Projekts sind sie weg. Daher musste ich das Hinzufügen der Spalten doch umstellen, so dass es nun zur Laufzeit erfolgt.

Ich habe nun einen einzelnen Frame mit den entsprechenden Komponenten gebaut, inkl. aller 4 ListViews, und habe diesen auf jeden Tab des PageControl hinzugefügt. Das vereinfacht die Sache ungemein, vor allem für weitere Tabs in der Zukunft.

Danke an alle für die Bestärkung, mir die Frames nochmal anzuschauen :dp:.

Grüße
Dalai

himitsu 28. Okt 2023 14:54

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Zitat:

Das Ergebnis war, dass sich das Alignment und die Anchors des ListViews nach dem TabSheet richten statt nach der ...
Bezüglich dem Alignment und der Anchors, ist es eigentlich vollkommen egal.
Im Prinzip verhält sich das Frame wie ein rahmenloses TPanel.


Aber, wie ich vor 'ner Stunde bemerkte, hat Emba bei den Anchors mal wieder was kaputt gemacht. (D11.3)
* mehrmals Alt+F12 und es verschiebt es sich immer weiter
* auch nach speichern/laden der Unit hat sich was verschoeben


Bei Frames gibt es dann noch zwei Varianten der Einbindung.
* als registrierte Komponente
* oder als inline mit vererbung, also direkten änderungen/erweiterungen im FormDesigner

Dalai 28. Okt 2023 16:54

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Zitat:

Zitat von himitsu (Beitrag 1528686)
Bezüglich dem Alignment und der Anchors, ist es eigentlich vollkommen egal.

Aufgrund des Splitters zwischen den ListViews brauche ich ein Alignment (für das linke alLeft, für das rechte alClient). Der Parent des auf diese Weise plazierten ListViews ist offenbar das TabSheet, es muss aber stattdessen die GroupBox sein (bzw. ein darin befindliches Panel). Wenn das ListView den Frame überlagert - d.h. darauf befindliche Komponenten verdeckt - hilft mir das nicht weiter.

Ich hoffe, man versteht, was ich meine.

Zitat:

Im Prinzip verhält sich das Frame wie ein rahmenloses TPanel.
Es geht nicht um das Alignment und die Anchors des Frame sondern die des ListViews.

Grüße
Dalai

Jasocul 1. Nov 2023 06:17

AW: Design mit (fast) gleichen Tabsheets vereinfachen
 
Zitat:

Zitat von Dalai (Beitrag 1528691)
Zitat:

Zitat von himitsu (Beitrag 1528686)
Bezüglich dem Alignment und der Anchors, ist es eigentlich vollkommen egal.

Der Parent des auf diese Weise plazierten ListViews ist offenbar das TabSheet, es muss aber stattdessen die GroupBox sein (bzw. ein darin befindliches Panel).

Dann setze das Parent doch zur Laufzeit aut die richte Komponente. In diesem Fall das Panel in der Groupbox.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr.

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