![]() |
GUID an ListView anhängen
ich möchte in die listview.items[0].data eigenschaft einen guid speichern.
zum Speichern:
Delphi-Quellcode:
zum Auslesen:
var guid: TGUID;
CoCreateGuid(Guid); listview1.Items[0].Data := @guid;
Delphi-Quellcode:
funktioniert aber nicht, erhalte nen ganz anderen guid, jemand ne idee woran das liegen kann?
guid := TGUID(listview1.Items[0].Data^);
danke schonmal Gruß |
Re: GUID an ListView anhängen
ich habe jetzt folgendes probiert:
zum Speichern:
Delphi-Quellcode:
zum Auslesen:
var str : pchar;
str := PChar(GuidToString(guid)); listview1.items[0].Data := str;
Delphi-Quellcode:
str enthält dann aber immer ganz zufällig irgendwelche strings aus meiner form, das heißt doch, dass ich irgendwie ganz sinnlos in meinem speicherbereich rumspringe. was mach ich falsch?
var str : pchar;
str := listview1.Items[0].Data; |
Re: GUID an ListView anhängen
so verpackst Du lediglich einen Pointer auf eine Speicherstelle auf dem Stack ins Item... die Daten an dieser Stelle wurden aber inzwischen geändert....
so ist besser:
Delphi-Quellcode:
zum Auslesen:
var guid: PGUID;
begin New(guid); CoCreateGuid(Guid^); listview1.Items[0].Data := guid;
Delphi-Quellcode:
Achtung: irgendwann (spätestens vor dem Entfernen des Items) solltest Du den Speicherplatz mittels
guid := PGUID(listview1.Items[0].Data)^;
Delphi-Quellcode:
wieder freigeben, sonst produzierst Du ein Memory-Leak....
Dispose(PGUID(listview1.Items[0].Data));
|
Re: GUID an ListView anhängen
funktioniert perfekt!!! vielen dank!
was mich jetzt aber noch interessieren würde, warum das so ist... ich hab da irgendwo einen verständnisfehler, weil ich den selben fehler immer wieder mache. Zitat:
nur was macht das hier anders?
Delphi-Quellcode:
ich hab immer gedacht, dass PGUID ein Pointer auf ein TGUID Objekt ist.
var guid: PGUID;
listview1.Items[0].Data := guid; wir das dann nicht genauso auf dem Stack abgelegt und ich hab das selbe wie vorher, was ist da genau der unterschied? gruß //Edit wird durch das new ein neuer Speicherplatz reserviert und sozusagen ein copy gemacht. wie würde das mit einem Record sein? wenn man hier New macht? wird dann eine komplette kopie des records angelegt, oder wie schaut das aus? |
Re: GUID an ListView anhängen
Zitat:
Kopiert wird allerdings nichts, lediglich reserviert, und je nach Variablen-Typen initialisiert (sprich: meist genullt). Nach
Delphi-Quellcode:
ist guid ein Pointer auf eine Speicherstelle im Heap, mit der Grösse SizeOf(TGUID).
var guid: PGUID;
begin New(guid); und beim Aufruf
Delphi-Quellcode:
wird dieser Pointer dereferenziert (^), so dass sich die Operation auf den effektiven Speicherbereich auf dem Heap bezieht.
CoCreateGuid(Guid^);
übrigens: TGUID ist ein record ev. hilft dies für das Verständnis:
Delphi-Quellcode:
könnte man durch dies ersetzen:
New(guid);
Delphi-Quellcode:
ich hoffe, dies erklärt die Sache etwas.... :-)
guid:=AllocMem(SizeOf(TGUID));
ZeroMemory(guid); // dies ist lediglich sinngemäss (new macht mehr) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 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