AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GUID an ListView anhängen

Ein Thema von mumu · begonnen am 6. Mai 2005 · letzter Beitrag vom 6. Mai 2005
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

GUID an ListView anhängen

  Alt 6. Mai 2005, 11:29
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:
guid := TGUID(listview1.Items[0].Data^); funktioniert aber nicht, erhalte nen ganz anderen guid, jemand ne idee woran das liegen kann?

danke schonmal
Gruß
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#2

Re: GUID an ListView anhängen

  Alt 6. Mai 2005, 11:54
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?
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#3

Re: GUID an ListView anhängen

  Alt 6. Mai 2005, 11:54
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:
guid := PGUID(listview1.Items[0].Data)^; Achtung: irgendwann (spätestens vor dem Entfernen des Items) solltest Du den Speicherplatz mittels Dispose(PGUID(listview1.Items[0].Data)); wieder freigeben, sonst produzierst Du ein Memory-Leak....
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#4

Re: GUID an ListView anhängen

  Alt 6. Mai 2005, 12:37
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?
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#5

Re: GUID an ListView anhängen

  Alt 6. Mai 2005, 13:34
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 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:
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....
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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