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 GUID an ListView anhängen (https://www.delphipraxis.net/45434-guid-listview-anhaengen.html)

mumu 6. Mai 2005 10:29


GUID an ListView anhängen
 
ich möchte in die listview.items[0].data eigenschaft einen guid speichern.

zum Speichern:
Delphi-Quellcode:
var guid: TGUID;
CoCreateGuid(Guid);
listview1.Items[0].Data := @guid;
zum Auslesen:
Delphi-Quellcode:
guid := TGUID(listview1.Items[0].Data^);
funktioniert aber nicht, erhalte nen ganz anderen guid, jemand ne idee woran das liegen kann?

danke schonmal
Gruß

mumu 6. Mai 2005 10:54

Re: GUID an ListView anhängen
 
ich habe jetzt folgendes probiert:

zum Speichern:
Delphi-Quellcode:
var str : pchar;
str := PChar(GuidToString(guid));
listview1.items[0].Data := str;
zum Auslesen:
Delphi-Quellcode:
var str : pchar;
str := listview1.Items[0].Data;
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?

Basilikum 6. Mai 2005 10:54

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:
var guid: PGUID;
begin
  New(guid);
  CoCreateGuid(Guid^);
  listview1.Items[0].Data := guid;
zum Auslesen:
Delphi-Quellcode:
guid := PGUID(listview1.Items[0].Data)^;
Achtung: irgendwann (spätestens vor dem Entfernen des Items) solltest Du den Speicherplatz mittels
Delphi-Quellcode:
Dispose(PGUID(listview1.Items[0].Data));
wieder freigeben, sonst produzierst Du ein Memory-Leak....

mumu 6. Mai 2005 11:37

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:

so verpackst Du lediglich einen Pointer auf eine Speicherstelle auf dem Stack ins Item... die Daten an dieser Stelle wurden aber inzwischen geändert....
ok, das ist mir klar, das hab ich mir auch gedacht


nur was macht das hier anders?
Delphi-Quellcode:
var guid: PGUID;
listview1.Items[0].Data := guid;
ich hab immer gedacht, dass PGUID ein Pointer auf ein TGUID Objekt ist.
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?

Basilikum 6. Mai 2005 12:34

Re: GUID an ListView anhängen
 
Zitat:

Zitat von mumu
nur was macht das hier anders?
Delphi-Quellcode:
var guid: PGUID;
listview1.Items[0].Data := guid;
ich hab immer gedacht, dass PGUID ein Pointer auf ein TGUID Objekt ist.
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?

New reserviert auf dem Heap (nicht Stack) Speicher (Grösse gemäss dem Variablen-Typ).
Kopiert wird allerdings nichts, lediglich reserviert, und je nach Variablen-Typen initialisiert (sprich: meist genullt).

Nach
Delphi-Quellcode:
var guid: PGUID;
begin
  New(guid);
ist guid ein Pointer auf eine Speicherstelle im Heap, mit der Grösse SizeOf(TGUID).

und beim Aufruf
Delphi-Quellcode:
CoCreateGuid(Guid^);
wird dieser Pointer dereferenziert (^), so dass sich die Operation auf den effektiven Speicherbereich auf dem Heap bezieht.

übrigens: TGUID ist ein record

ev. hilft dies für das Verständnis:
Delphi-Quellcode:
New(guid);
könnte man durch dies ersetzen:
Delphi-Quellcode:
guid:=AllocMem(SizeOf(TGUID));
ZeroMemory(guid); // dies ist lediglich sinngemäss (new macht mehr)
ich hoffe, dies erklärt die Sache etwas.... :-)


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