AGB  ·  Datenschutz  ·  Impressum  







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

Kopieren des Inhalt eines Record

Ein Thema von DelphiFan2008 · begonnen am 18. Okt 2013 · letzter Beitrag vom 20. Okt 2013
Antwort Antwort
DelphiFan2008

Registriert seit: 4. Dez 2008
84 Beiträge
 
Delphi XE2 Starter
 
#1

Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 21:21
Hallo Forum,

gibt es eine einfachere Möglichkeit?

Ich arbeite häufig mit TList Objekten in denen ich Records verwalte. Beispiel
Delphi-Quellcode:
type PTest = ^TTest
     TTest = record
       s1 : String;
       d1 : Double;
       i1 : Integer;
       s2 : String;
       l1 : LongInt;
       s3 : String;
       n1 : Int64;
     end;
dieser wird in der Liste über .Add( P ); // P : PTest hinzugefügt.

Wenn ich nun den Inhalt eines Records in einen neuen kopieren möchte erfolgt dies in ähnlicher Forem wie..

Delphi-Quellcode:
function MyList.CopyToNewItem( Index:Integer;APTest:PTest );
var FPTest : PTest;
begin
  FPTest := PTest( Self.Items[Index] )

  ATest^.s1 := FPTest^.s1;
  ATest^.d1 := FPTest^.d1;
  ATest^.i1 := FPTest^.i1;
  ATest^.s2 := FPTest^.s2;
  usw.
end;
Falls im Record eine Variable hinzugefügt wird muss dies immer in der Kopierroutine nachgezogen werden. Gibt es eine einfachere Möglichkeit den Inhalt eines Record in einen anderen zu kopieren als jede einzelne Variable oder Struktur einzeln?

Gruss DelphiFan2008
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 21:36
Direktes Kopieren des Speicherauszugs (Copy, CopyMemory oder sowas) geht natürlich, fällt aber schon in deinem Fall von TTest flach: Das würde die Referenzzählung des Strings zerstören - Tödlich.

Ich habe auch nie etwas besseres gefunden. Die einzige Möglichkeit ist irgendwie halt dem Record einen Konstruktor bzw. Funktion zu bauen die als Parameter einen bereits bestehenden Record nimmt und die Daten in den neuen überträgt...
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.848 Beiträge
 
Delphi 12 Athens
 
#3

AW: Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 21:53
Ich frage mich immer wieder warum man sich das Leben mit Records so schwer machen kann. Eine TObjectList<TTest> ist doch sehr viel einfacher und bequemer als die ganze Pointer- und Speicherspielerei...

Aber wie dem auch sei... zur Frage:
Delphi-Quellcode:
procedure TMyList.CopyToNewItem(Index: Integer; APTest: PTest);
begin
  APTest^ := Self.Items[Index]^;
end;
// EDIT:
Beispiel:
Delphi-Quellcode:
type
  PTest = ^TTest;

  TTest = record
    s1: String;
    d1: Double;
    i1: Integer;
    s2: String;
    l1: LongInt;
    s3: String;
    n1: Int64;
  end;

  TMyList = class(TList<PTest>)
  public
    procedure CopyToNewItem(Index: Integer; APTest: PTest);
  end;

procedure TMyList.CopyToNewItem(Index: Integer; APTest: PTest);
begin
  APTest^ := Self.Items[Index]^;
end;

// Test
var
  Test: TMyList;
  Current: PTest;
begin
  Test := TMyList.Create;
  try
    New(Current);
    Current.s1 := 'Test 1';
    Test.Add(Current);
    New(Current);
    Current.s1 := 'Test 2';
    Test.Add(Current);
    New(Current);
    Current.s1 := 'Nothing';
    Test.CopyToNewItem(0, Current);
    ShowMessage(Current.s1); // ergibt Test 1
  finally
    Test.Free;
  end;
end;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 21:57
Wäre eine TList<TTest> mit TTest als record in dem Fall nicht sogar noch einfacher? (Disclaimer: Habe kein Delphi mit Generics-Support)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.848 Beiträge
 
Delphi 12 Athens
 
#5

AW: Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 22:01
Wäre eine TList<TTest> mit TTest als record in dem Fall nicht sogar noch einfacher? (Disclaimer: Habe kein Delphi mit Generics-Support)
Theoretisch ja, aber dann kann man den Record in der Liste nur durch Neuzuweisung bearbeiten, nicht ein einzelnes Feld.

Deshalb wären ja Klassen auch viel sinnvoller. Nur das Kopieren ist bei Klassen nicht so einfach durch Zuweisung möglich.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 22:27
Ich frage mich immer wieder warum man sich das Leben mit Records so schwer machen kann. Eine TObjectList<TTest> ist doch sehr viel einfacher und bequemer als die ganze Pointer- und Speicherspielerei...
...
Delphi-Quellcode:
  
APTest^ := Self.Items[Index]^;
Du hast natürlich im Prinzip Recht, nur hier (Inhalte kopieren) ausnahmsweise nicht. Dessenungeachtet sind die Unterschiede bezüglich der Pointer- und Speicherspielerei zwischen Record und Klasse nicht sonderlich groß bzw. eigentlich kaum vorhanden. Hier 'New', da 'Create', hier 'Dispose', da 'Free'. Und das '^' kann man ja mittlerweile auch weglassen.

Bei der TObjectList wird die Sache natürlich anders (aufräumen und so).

Aber reden wir nicht weiter davon. Klassen sind einfach besser weil mächtiger,dafür sind Records einfacher und bla bla bla.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.848 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kopieren des Inhalt eines Record

  Alt 18. Okt 2013, 22:38
Du hast natürlich im Prinzip Recht, nur hier (Inhalte kopieren) ausnahmsweise nicht.
Habe ich ja auch geschrieben. Aber die paar Zeilen für die Implementierung von Assign sollten nicht stören.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
DelphiFan2008

Registriert seit: 4. Dez 2008
84 Beiträge
 
Delphi XE2 Starter
 
#8

AW: Kopieren des Inhalt eines Record

  Alt 20. Okt 2013, 08:17
@jaenicke,

danke für die Antworten. Frage: Wie würde denn ein alternativer Ansatz mit TObjectList<TTest> in diesem Fall aussehen. Mir fehlt die Erfahreung mit neueren Konstrukten. Arbeite noch immer vorwiegend mit Record, Pointer und den Basisklassen welche schon ab etwa Delphi3 bekannt sind und welchen Vorteil hätte ich?

Gruß DelphiFan2008
  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 22:11 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 by Thomas Breitkreuz