![]() |
Record mit dyn. Strings duplizieren
Hey,
wie kann ich möglichst einfach einen Record duplizieren, welcher dynamische Strings enthält. Das Problem ist ja, dass nur die Pointer kopiert werden, wenn ich CopyMemory() verwende, die dann im nächsten Moment schon ungültig sind. Als Lösung kam mir in den Sinn die Strings nach dem CopyMemory() nochmal extra zuzuweisen, aber ich wollte mal hören, obs noch eine bessere Möglichkeit gibt. Gruß Zacherl |
Re: Record mit dyn. Strings duplizieren
Wenn du Records direkt zuweist, wird System.@CopyRecord aufgerufen. Dort werden die relevanten Felder anhand der Typinformation dann gesondert behandelt.
Ich verstehe allerdings nicht ganz, was du tun willst. Warum verwendest du nicht Record2 := Record1 und lässt die Compilermagic den Rest machen? |
Re: Record mit dyn. Strings duplizieren
So hatte ich es anfangs gelöst. Das führte aber zu "Invalid Pointer" Exceptions im weiteren Verlauf des Programmes. Im Debugger habe ich dann auch gesehen, dass die dynamischen Strings falsche Inhalte aus dem Nirvana des Arbeitsspeichers enthielten :mrgreen:
|
Re: Record mit dyn. Strings duplizieren
Hier mal bisschen Code:
Delphi-Quellcode:
Beim ersten Mal wenn ich diese Funktion aufrufe funktioniert alles perfekt wie gewünscht. Beim zweiten mal aber bekomme ich eine EInvalidPointer Exception, aber die komischerweise erst nach Result := Length(List). Die Strings in den Records der Liste sind korrekt. Auch die Strings in den Records von FOnlineList stimmen noch.
function IntGetBuddyList(var List: TdxICQBuddyList; ItemType: Word): Integer;
var I, J: Integer; begin FreeBuddyList(List); for I := low(FSSIList) to high(FSSIList) do begin if (FSSIList[I].ItemType = ItemType) then begin SetLength(List, Length(List) + 1); ClearBuddyInfo(List[high(List)]); if (ItemType = SSI_BUDDY) then begin J := GetOnlineBuddy(FSSIList[I].ItemName); if (J <> -1) then begin List[high(List)] := FOnlineList[J]; end; end; List[high(List)].General.UIN := FSSIList[I].ItemName; List[high(List)].SSIInfo.ItemID := FSSIList[I].ItemID; List[high(List)].SSIInfo.GroupID := FSSIList[I].GroupID; FillBuddyInfo(List[high(List)], FSSIList[I].TLVList); end; end; Result := Length(List); end; |
Re: Record mit dyn. Strings duplizieren
Die Exception kommt nach der letzten Zeile? Zeig mal in der CPU-Ansicht die Stelle.
|
Re: Record mit dyn. Strings duplizieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hier .. Aber ich debugge das mal noch weiter .. In der CPU Ansicht kommt der Fehler erst nach dem RET, also schon wieder in der Hauptcoderoutine, in der ich die Rückgabe der Funktion auswerte. Da kracht es komischerweise irgendwie.
€: Okay, es liegt nicht an der Funktion selbst, sondern an FreeBuddyList, welches ich später nochmal aufrufe. Die Liste die ich zurückgebe enthält Records, von denen jeder wieder ein dyn. Array enthält. Dieses Array enthält Objekte. Mit FreeBuddyList zerstöre ich die Objekte mittels Free. Nachdem der Destruktor aufgerufen wurde kommt die Exception. Ich poste später mal die CPU Ansicht nach dem Destructor. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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