AGB  ·  Datenschutz  ·  Impressum  







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

Record mit dyn. Strings duplizieren

Ein Thema von Zacherl · begonnen am 6. Okt 2008 · letzter Beitrag vom 6. Okt 2008
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Record mit dyn. Strings duplizieren

  Alt 6. Okt 2008, 13:48
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Record mit dyn. Strings duplizieren

  Alt 6. Okt 2008, 13:53
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?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Record mit dyn. Strings duplizieren

  Alt 6. Okt 2008, 13:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Record mit dyn. Strings duplizieren

  Alt 6. Okt 2008, 14:11
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Record mit dyn. Strings duplizieren

  Alt 6. Okt 2008, 14:13
Die Exception kommt nach der letzten Zeile? Zeig mal in der CPU-Ansicht die Stelle.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Record mit dyn. Strings duplizieren

  Alt 6. Okt 2008, 14:21
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.
Miniaturansicht angehängter Grafiken
unbenannt_513.png  
  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 07:26 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