![]() |
AW: Integer in ListItem eines ListViews speichern
Bin mir nicht sicher, seit welcher Version, aber TListView hat nen sehr praktischen Event, der das Erweitern von TListItem um eigene Daten komfortabel und ohne Trickserei ermöglicht:
Delphi-Quellcode:
type
TMyListItem = class(TListItem) MyNumber: integer; end; procedure TForm1.lvCreateItemClass(Sender: TCustomListView; var ItemClass: TListItemClass); begin ItemClass := TMyListItem; end; |
AW: Integer in ListItem eines ListViews speichern
Das ist doch mal eine nützliche Erweiterung. Unter Delphi 2007 gibt es das Event noch nicht, unter XE aber schon, es muss also irgendwann dazwischen eingeführt worden sein.
|
AW: Integer in ListItem eines ListViews speichern
Zitat:
In meiner TListView lege ich Dateinamen nebst Größe etc. an. Auf die Größe muss ich immer wieder zugreifen und damit rechnen und es nervt, wenn ich das von String nach
Delphi-Quellcode:
und zurück umwandeln muss. Daher such(t)e ich nach einer Möglichkeit, den Zahlenwert mit unterzubringen.
Int64
Immerhin heißt das Thema ja auch "Integer in ListItem eines ListViews speichern" - von Konstanten steht dort nichts. Das kommt dann erst im Beispielcode. Meine Frage rührt ![]() Ich glaube es jetzt auch verstanden zu haben: Pointer speichert (numerisch) die Adresse zu einem Objekt und wird im Beispielcode von DennisHB de facto als direkter Speicher einer Zahl selbst missbraucht. Und genau aus diesem Grunde dürfte mein Plan damit nicht aufgehen. Denn Pointer hat eine Größe von 4 Byte, kann damit also maximal auch 4 Bytes aufnehmen, während ich Int64 brauche, was aber 8 Bytes benötigt. Es wäre auch zu schön gewesen. Leider arbeite ich aus Kostengründen noch mit TurboDelphi. Ich bin reiner Hobbyprogrammierer und kann/will mir daher die € 1.000,- für eine sinnvolle Delphi-Lizenz nicht leisten. Aus diesem Grunde dürfte der von CCRDude vorgschlagene Code mir nichts bringen. Gruß und Dank, Alex |
AW: Integer in ListItem eines ListViews speichern
Nochmal zum Unterschied: im Beispielcode wurde wie gesagt der Pointer dazu missbraucht, eine 4-Byte-Zahl zu hinterlegen, der Pointer an sich zeigte aber nirgends hin. Du kannst aber natürlich einen echten Pointer dort ablegen, der auch auf echte Daten zeigt, ob da nun 8 oder 2.000.000 Bytes dahinterstecken, spielt keine Rolle. Zum Freigeben dieser Daten dürfte dann das OnDeletion-Ereignis der ListView die richtige Stelle sein, wenn ich nicht irre.
|
AW: Integer in ListItem eines ListViews speichern
Richtiger wäre also so etwas in der Art:
Delphi-Quellcode:
Interface
Type TInt64Obj = Class(TObject) Private FValue : Int64; Public Constructor Create(Const Value: Int64); Property Value: Int64 Read FValue Write FValue; End; Implementation Constructor TInt64Obj.Create(Const Value: Int64); Begin Inherited Create; FValue:=Value; End; Procedure ErzeugeEintrag(Value: Int64); Begin With MyListView.Items.Add Do Begin Caption:=FormatFloat('0,', FileSize); // Data:=Pointer(FileSize); // <- reicht nicht aus, wie festgestellt wurde. // // Wie bekomme ich mein Int64 in das Item? // // Es gibt im Gegensatz zu z.B. TCheckListBox kein Items.AddObject(); // in TCheckListBox hatte ich z.B. mal neben dem Eintrag weitere Strings gespeichert... SubItems.Add(FileName); End; End; Function LiesEintrag(Index: Integer): Int64; Begin Result:=TInt64Obj(MyListView.Items[Index].Data).Value; End; |
AW: Integer in ListItem eines ListViews speichern
Delphi-Quellcode:
Procedure ErzeugeEintrag(Value: Int64);
var Int64Obj: TInt64Obj; Begin Int64Obj := TInt64Obj.Create(value); With MyListView.Items.Add Do Begin Caption:=FormatFloat('0,', FileSize); Data := Int64Obj; SubItems.Add(FileName); End; End; |
AW: Integer in ListItem eines ListViews speichern
So klappt es - tausend Dank.
Ich habe den Code im Beitrag davor auch noch bereinigt, was das
Delphi-Quellcode:
anbelangt.
LiesEintrag;
|
AW: Integer in ListItem eines ListViews speichern
Man könnte in LiesEintrag auch noch auf Assigned abfragen, bevor man auf die Properties zugreift ;) Und wie vorher schon gesagt: im OnDeletion der ListView das Objekt in Data wieder freigeben, das sollte IMO passen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 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