![]() |
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 |
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 |
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 |
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! |
AW: Objekte in einer Liste anzeigen
Wenn ich solche Objekte aus der Liste lösche, werden die da nur in der Liste gelöscht oder auch imSpeicher, das heißt, werden dann die Objekte frei gegeben oder nur die Listeneinträge während die Objekte an sich im Speicher verbleiben?
Wenn sie aus dem Speicher radikal entfernt werden, wie lassen sich die Objekte dann dür spätere Widerverwendung zwichenspeichern? |
AW: Objekte in einer Liste anzeigen
Ich kenne die neusten Versionen von Delphi nicht, deshalb ist meine Antwort nur bedingt zu beachten.
Also, zumindest früher, war das so, dass du dich selbst um die Freigabe kümmern musstest. Wenn du also TStringList klassisch nutzt, also an ein Item ein Objekt dranhängst, musst du es auch vor dem löschen des Items freigeben. Anders sieht es bei TObjectList. Hier wir das Objekt beim löschen des Items automatisch gelöscht. |
AW: Objekte in einer Liste anzeigen
Zitat:
|
AW: Objekte in einer Liste anzeigen
Ich weiß nicht, woher plötzlich die TStringList kommt. Die ist in dem Zusammenhang kaum sinnvoll, seit es generische Listen gibt.
Eine Möglichkeit hier sind Frames. Der Vorteil ist, dass man einen Frame visuell editieren kann. Dann erstellt man für jeden Listeneintrag einen solchen Frame und packt diese Frames in die schon genannte TScrollbox. Hier kommt das vermutlich aufgrund der Controls nicht in Frage, aber ich habe damals zur Demonstration, wie man so etwas selbst zeichnen kann, ein Periodensystem geschrieben: ![]() Das ist nun 16 Jahre her und heute würde ich das sicher anders schreiben, aber man lernt dazu. Vielleicht ist es ja trotzdem interessant. |
AW: Objekte in einer Liste anzeigen
Ah, alles klar, Danke Euch beiden, da werde ich meinen Code darauf anpassen :wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 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