AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Design mit (fast) gleichen Tabsheets vereinfachen
Thema durchsuchen
Ansicht
Themen-Optionen

Design mit (fast) gleichen Tabsheets vereinfachen

Ein Thema von Dalai · begonnen am 25. Okt 2023 · letzter Beitrag vom 1. Nov 2023
Antwort Antwort
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#1

Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 25. Okt 2023, 17:01
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
Miniaturansicht angehängter Grafiken
dp_tabsheet_listviews-splitter.png  
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 25. Okt 2023, 17:11
Frames sind genau dafür gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 25. Okt 2023, 17:28
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
353 Beiträge
 
#4

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 25. Okt 2023, 18:17
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
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
353 Beiträge
 
#5

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 25. Okt 2023, 18:22
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.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 25. Okt 2023, 18:40
Einfacher ... nicht wirklich. (fast gleich aufwändig)

Aber dafür sind Forms problematischer, vor allem was die Fokus-Steuerung betrifft.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#7

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 28. Okt 2023, 15:31
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 .

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 28. Okt 2023, 15:54
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#9

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 28. Okt 2023, 17:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Design mit (fast) gleichen Tabsheets vereinfachen

  Alt 1. Nov 2023, 07:17
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.
Peter
  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 21:49 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