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 Abgeleitetes TListitem zufügen (https://www.delphipraxis.net/58669-abgeleitetes-tlistitem-zufuegen.html)

tigerman33 10. Dez 2005 14:14


Abgeleitetes TListitem zufügen
 
Schönen Samstag euch allen, :-D

ich habe eine von TListItem abgeleitete Klasse geschrieben, die ein bestimmtes Interface implementiert, mit dem sie über Änderungen an ihrem Daten-Objekt informiert wird.
Das Problem ist nun, diese in die Items des entsprechenden ListViews einzufügen, denn alle standardmäßig hierfür zur Verfügung gestellten Methoden erzeugen jeweils ein eigenes Item und führen dann anschließend maximal noch ein Assign mit dem als Parameter übergebenen Listitem aus (siehe z.B. TListItems.AddItem).
Genau das will ich aber ja nicht, denn dann wäre ja meine eigene Klasse wieder außen vor und würde über die angesprochenen Änderungen nicht benachrichtigt werden.

Hat vielleicht jemand eine Idee, was ich da machen könnte?

marabu 10. Dez 2005 19:09

Re: Abgeleitetes TListitem zufügen
 
Hallo Christian,

ich glaube du zäumst das Pferd von hinten auf. Die ListView ist in erster Linie ein Instrument zur Visualisierung. Deine Daten solltest du in einer nicht visuellen Komponente halten. Wenn deine ListView virtuell ist, dann kann dein Datenobjekt die ListView zum Neuzeichnen auffordern und du kannst auf eventuelle Zustandsänderungen im jeweiligen event handler reagieren. Das mit den eigenen Items kann nicht funktionieren, da die Items vom common control intern verwaltet werden - und dort kennt man keine Delphi Objekte.

Grüße vom marabu

tigerman33 10. Dez 2005 19:23

Re: Abgeleitetes TListitem zufügen
 
Hi,

was meinst du mit das Pferd von hinten aufzäumen? Also meine Daten liegen nicht direkt im Listitem, sondern in einer Extra-Klasse, die über ein Interface mit diversen Beobachtern, u.a. auch dem Listitem kommunizieren soll:
Delphi-Quellcode:
type TObservantLVItem = class(TListItem, ITaskObserver)
     protected
       function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
       function _AddRef: integer; stdcall;
       function _Release: integer; stdcall;
     public
       procedure TaskActed(Task: TTask; AnAction: TTaskAction);
       procedure TaskPropertyChanged(Task: TTask; AProp: TTaskProperty);
     end;
Aber wie du sagst, wird das ja wohl nicht funktionieren. :(
Zum virtuellen Listview habe ich in der OH nichts gefunden, kann mich aber erinnern das schon mal irgendwo gesehen zu haben (Alzheimer schlägt wieder zu) :? Hat jemand einen Tipp, nach welchen Stichwörtern ich da suchen muss?

marabu 10. Dez 2005 20:08

Re: Abgeleitetes TListitem zufügen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Von hinten oder am falschen Ende - ein ListItem ist kein aktives Objekt und du kannst es auch nicht zu einem solchen machen. Alle Aktivität geht von der View als Container aus, das Item selbst ist völlig passiv. Deshalb kannst du es auch nicht zu einem Observer machen.

Der virtuellen ListView fügst du keine Items zu, sondern setzt einfach OwnerData auf TRUE und ListItems.Count auf die gewünschte Anzahl - alles andere geht ereignis-gesteuert. Das prominenteste Ereignis ist ListView.OnData, aber was schreibe ich - schau dir doch die kleine Demo an.

Grüße vom marabu

tigerman33 11. Dez 2005 09:43

Re: Abgeleitetes TListitem zufügen
 
Vielen, vielen Dank. :dancer:

Jetzt hab ich auch verstanden was du meinst! :) Die virtuelle Listview macht ja eigentlich genau das, was ich will.
Eine Frage dazu hab ich aber noch: Muss ich durch die zusätzlichen Event-Aufrufe mit größeren Geschwindigkeits-Einbußen rechnen?

BTW: Hattest du die Demo schon irgendwo rumliegen, oder hast du das jetzt extra geschrieben? Das ist ja viel mehr als nur eine Demo, das ist ja sogar richtig nützlich. :thumb:

marabu 11. Dez 2005 10:00

Re: Abgeleitetes TListitem zufügen
 
Hi Christian,

ich denke es wird bei ListItems.Count einen sehr niedrig liegenden break even point geben. Über diesem Wert solltest du deutliche Geschwindigkeitsvorteile bemerken. Ich habe mir nie die Mühe gemacht das genau zu untersuchen, da für mich die virtuelle ListView die natürliche Form ihrer Anwendung ist.

Die Demo habe ich nicht zwischen 20:23 und 21:08 Uhr geschrieben, aber der Zeitaufwand lag in dieser Größenordnung. Wenn sie dir etwas gebracht hat, dann freue ich mich.

Grüße vom marabu

bennle 25. Feb 2007 14:51

Re: Abgeleitetes TListitem zufügen
 
Hallo,
Supi, ich glaube das kann ich verwerten, allerdings verstehe ich noch nicht ganz wie der Seperator festgelegt wird. Bei meiner Datei funktioniert dies nämlich nicht richtig und ich wollte dies mal überprüfen.
Kannst du mir auf die Sprünge helfen?

Gruß
Benny

marabu 20. Jul 2007 18:11

Re: Abgeleitetes TListitem zufügen
 
Hallo Benny,

tut mir sehr leid, aber ich habe deinen Beitrag erst jetzt und nur zufällig entdeckt.

Der Delimiter wird beim Ereignis OnCreate() der Form als Semikolon festgelegt. Wäre es keine Demo, dann sollte man den Delimiter bei jeder Datei-Operation (Neu, Öffnen, Speichern) angeben können.

Verlegene Grüße


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