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 Objekte in einer Liste anzeigen (https://www.delphipraxis.net/73831-objekte-einer-liste-anzeigen.html)

dr_gessi 24. Jul 2006 17:32


Objekte in einer Liste anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich möchte gerne beliebig viele Instanzen eines Objektes in einer Liste darstellen. Dieses Objekt kann dabei aufgebaut sein wie eine Form, beinhaltet also Felder, Buttons, etc.

Meine Frage ist nun, wie kann ich soetwas bewerkstelligen? Welche Klassen muss ich da benutzen?

Anbei ein Screen Shot eines Beispiels (Datenträgerverwaltung unter Windows), wie ich mir es vorgestellt habe. Hier sieht man rechts unten die Auflistung aller Platten. Wie macht man sowas mit Delphi?

Würde mich sehr über Hinweise freuen.

Vielen Dank,
dr_gessi

Der_Unwissende 24. Jul 2006 18:23

Re: Objekte in einer Liste anzeigen
 
Hi,
woran genau scheiterst du denn gerade?
Also an sich ist es ganz einfach. Das was du als Grundlage benötigst ist eine TScrollBox (Zusätzlich). Der Name verrät eigentlich schon grob was dieses Control leistet. Du packst x Controls in diese ScrollBox und kannst hier scrollen (wenn die Kinder größer als der sichtbare Bereich sind).
Ja, wie bei allen Controls wird mit insertControl ein neues Control eingefügt und mittels Controls[i] kannst du auf das i-te Kind des Controls zugreifen.

Was du jetzt eigentlich nur noch machen musst ist dich ein wenig um sauberer Kapselung zu bemühen. Wie gesagt, ein Control kann wieder Controlls aufnehmen. Die TScrollbox ist natürlich schon ein Control (und soll ja auch Sachen aufnehmen). Ziemlich viele der sichtbaren Komponenten sind natürlich auch Controls. Natürlich würden Formulare sich hier eher schlecht machen, was du wahrscheinlich suchst ist ein TPanel. Wie man die benutzt sollte dir grob klar sein. Falls nicht lies einfach ein Tutorial dazu.
TPanel ist ein einfacher Container. Für die Anzeige deines Objekts kannst du am einfachsten eine Klasse von TPanel ableiten. Hier legst du im Konstruktor einfach die anderen Elemente (Buttons, Labels, ...) an. Damit hast du ein Objekt, dass du einfach dyn. erzeugen kannst und da sie von TPanel erben (und damit auch von TControl) kannst du die auch direkt auf andere Controlls (z.B. eine TScrollBox) einfügen.
Um es gleich richtig zu machen solltest du allerdings die Daten gleich von dieser Anzeige trennen. Am Beispiel der Datenträgerverwaltung : Du erstellst mind. zwei Klassen. Die eine speichert nur die Werte. In der Datenträgerverwaltung entspricht dann jeder Datenträger einer Instanz dieser Klasse. Hier werden dann alle Eigenschaften des Datenträger (z.B. Füllstand, Dateisytem, ...) gespeichert.
Deine Darstellung (also der Nachfolger von TPanel) ist dann eine unabhängige Klasse davon. Unabhängig nur in dem Sinn, dass deine Datenträger nicht ihre Darstellung kennen müssen. Dein TPanel Nachfolger dient anders herum auch nur der Visualisierung irgendwelcher Werte und muss nur die Werte kennen (egal wo die herkommen und ob man dafür Datenträger abfragen muss oder nicht).
Der Vorteil liegt darin, dass du durch diese Trennung leicht deine Visualisierung verändern kannst. Du kannst aber auch gleich mehrere verschiedene Anbieten. Ein Beispiel ist wieder durch die Datenträgerverwaltung gegeben, du hast einmal oben diese ausführliche Textliste (ein TListView) und unten halt das Ding mit den eigenen Controls.

Gruß Der Unwissende

dr_gessi 24. Jul 2006 18:55

Re: Objekte in einer Liste anzeigen
 
Hallo Unwissender,

ich bedanke mich für Deine super ausführliche Antwort! Da steckt also doch ein klein bisschen mehr Arbeit drin, als ich zuvor vermutet habe. Trotzdem gefällt mir der Ansatz.

Liebe Grüße,
dr_gessi

Der_Unwissende 24. Jul 2006 20:44

Re: Objekte in einer Liste anzeigen
 
Klingt ehrlich gesagt nach mehr als es ist.
An sich ist es nur recht schwer auf Beiträge zu antworten, die so allgemein gehalten sind wie deine. Du solltest immer so konkret wie möglich dein Problem beschreiben. Bei deiner Frage ist es einfach für die anderen Leute im Forum schwer zu antworten, da du nicht sagst woran genau du eigentlich scheiterst. Wenn du etwas mehr zu dem sagst was dein Ansatz ist (oder ob du gar keinen hast) und wie gut deine Kenntnisse im jeweiligen Gebiet sind, dann hilft das in der Regel deutlich mehr Ergebnisse zu bekommen. Ist nur als Tipp für's nächste Mal zu verstehen!

Freu mich jedenfalls, wenn ich dir helfen konnte!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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