Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record mit dyn. Strings duplizieren (https://www.delphipraxis.net/121879-record-mit-dyn-strings-duplizieren.html)

Zacherl 6. Okt 2008 12:48


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

Apollonius 6. Okt 2008 12:53

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?

Zacherl 6. Okt 2008 12:54

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:

Zacherl 6. Okt 2008 13:11

Re: Record mit dyn. Strings duplizieren
 
Hier mal bisschen Code:

Delphi-Quellcode:
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;
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.

Apollonius 6. Okt 2008 13:13

Re: Record mit dyn. Strings duplizieren
 
Die Exception kommt nach der letzten Zeile? Zeig mal in der CPU-Ansicht die Stelle.

Zacherl 6. Okt 2008 13:21

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 23:57 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