![]() |
Probleme mit Data (Pointer)
Hallo zusammen!
Ich habe folgendes Problem ich habe ein ListItem, jetzte würde ich gerne in Data was ja einen Pointer erwartet einen String abspeichern. Also einfach in OnShow oder so abspeichern und irgendwann im Programm in einer anderen Funktion wieder rausholen. Leider jedoch klappt das gar nicht. Kleiner Code Ausschnitt:
Delphi-Quellcode:
wieder abrufen versuche ich folgendermaßen
tmp := FieldByName('Test1').AsString + FieldByName('Test2').AsString;
ListItem.Data := Pointer(tmp);
Delphi-Quellcode:
Wobei tmp in beiden Fällen eine String-Variable ist.
tmp := String(ListItem.data);
Ich habe auch schon verschiedene Kombination mit den ^ und dem @ operatoren versucht. Leider bis jetzt ohne Erfolg Vielleicht könnte mir kurz mal jemand helfen Danke lg ranftl |
Re: Probleme mit Data (Pointer)
Hi ranftl!
Bei deinem Code existiert der String deiner Wünsche nur so lange, wie du in der Prozedur bleibst, in der dieser Code ausgeführt wird. Probier es lieber mal so (aus dem Kopf):
Delphi-Quellcode:
Und wenn du mal Zeit hast, lies mal 1-2 Tutorials über Pointer. ;)
procedure TuWas;
var LText : PString; begin New(LText); LText^:=FieldByName('Test1').AsString + FieldByName('Test2').AsString; ListItem.Data := Pointer(tmp); end; procedure HolDenText; var LText : PString; begin Ltext:=ListItem.Data; Self.Caption:=LText^; end; //und irgendwann noch den Text freigeben // Dispose(PString(ListItem.Data)); |
Re: Probleme mit Data (Pointer)
Hallo chaosben!
Danke für deine schnelle Antwort! Klappt super! Schönen Tag noch! ranftl |
Re: Probleme mit Data (Pointer)
Muss ich Dispose auch machen wenn ich das ListItem lösche oder ListView.Clear mache oder ist es dann unnötig?
Un sollte nicht auch LText freigegeben werden? |
Re: Probleme mit Data (Pointer)
Bevor du eine ListView.Clear machst (oder ein Item löschst), musst du natürlich alle Strings freigeben ... und das eben mit dem von dir angeführten Dispose.
Delphi-Quellcode:
Dispose(PString(ListItem.Data));
|
Re: Probleme mit Data (Pointer)
Also muss ich vor dem Clear sämtliche ListItems durchlaufen?
Was passirt wenn ich das Programm ohne Dispose beende? Wird der Speicher dann freigegeben oder muss ich mich da auch drum kümmern? Sorry hab noch nich so viel mit Pointern gemacht. |
Re: Probleme mit Data (Pointer)
Ja, vor dem Clear müsstest du alle Items durchlaufen ... es sei denn, es gibt ein Ereigniss beim Freigeben eines Items (á la VirtualTree).
Und wenn du es nicht tust, sollte eigentlich Memoryleaks übrigbleiben. Am besten kann man das ab BDS4 mit dem Befehl
Delphi-Quellcode:
testen.
ReportMemoryLeaksOnShutdown:=true;
|
Re: Probleme mit Data (Pointer)
Woher weis ich ob dem Itemw as ich löschen will ein Pointer hinterlegt ist?
Wenns keinen gibt kommt nämlich eine Zugriffsverletzung. Oder einfach zwischen try except schreiben? |
Re: Probleme mit Data (Pointer)
Moin Marcel,
bevor Du etwas freigibst, musst Du nur prüfen, ob etwas enthalten ist:
Delphi-Quellcode:
if Assigned(ListItem.Data) then
|
Re: Probleme mit Data (Pointer)
... was vorraussetzt, dass der pointer vor allocation / nach disposal ordentlcih genillt wird. Merke: Wilder Pointer gefährlicher als nil-Pointer! ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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