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 vergleichen (https://www.delphipraxis.net/11459-record-vergleichen.html)

StTüff 7. Nov 2003 07:35


record vergleichen
 
Guten Morgen!

Ich hätte da noch eine Frage:

Angenommen ich habe folgendes:
Delphi-Quellcode:
TRecDaten = record
    Messwert : TStuetzpunkt;
    Saved : boolean;
  end;
ich kann dann den Inhalt einer Variblen a vom Typ TRecDaten einer
Variablen b vom Typ TRecDaten sehr einfach zuweisen:
Delphi-Quellcode:
 b := a;
wenn ich aber vergleichen möchte, ob der Inhalt identisch ist,
Delphi-Quellcode:
 if a=b then...
so bekomme ich:
[Fehler] ttt.pas(310): Inkompatible Typen

Muss ich die einzelnen Elemente vergleichen (was ja richtig viele
sein können), oder geht's auch auf eine andere Art?

Vielen Dank schon mal,

StTüff

APP 7. Nov 2003 08:12

Re: record vergleichen
 
Hallo StTüff,

Records als Packed deklarieren:
Delphi-Quellcode:
TRecDaten = packed record
    Messwert : TStuetzpunkt;
    Saved : boolean;
  end;
Delphi-Quellcode:
  IF CompareMem(@a, @b, sizeof(a)) THEN
     // sind gleich
sollte funktionieren.

StTüff 7. Nov 2003 08:31

Re: record vergleichen
 
Das wollte ich hören!

Vielen Dank!

StTüff :-D

sakura 7. Nov 2003 08:53

Re: record vergleichen
 
Ich möchte darauf hinweisen, das die Methode CompareMem nur genutzt werden kann, wenn im Rekord keine Pointer enthalten sind (z.B. Objektbezüge, Strings :!: o.a.)

...:cat:...

StTüff 7. Nov 2003 09:03

Re: record vergleichen
 
Hallo sakura!

Das ist in diesem Fall zum Glück nicht so, hast Du einen
Vorschlag wie es in dem von Dir beschriebenen Fall zu
realisieren wäre?

Vielen Dank für den Hinweis.

StTüff

Motzi 7. Nov 2003 11:25

Re: record vergleichen
 
In diesem Fall würde ich eine eigene "CompareRecord"-Funktion schreiben, denn in diesem Fall musst du wirklich jedes Feld einzeln vergleichen...

choose 7. Nov 2003 12:27

Re: record vergleichen
 
Wenn Du statt Records Klassen verwenden würdest und statt der Felder published Properties, könntest Du mithilfe der RTTI (Runtime Type Information, siehe OH) selbst bei Referenzierten (Pointer als Recordfelder) oder Aggregierten (Unterrecords als Recordfelder) Objekten (dann Rekursiv) einen "tiefen Vergleich" durchführen.

Die Problematik entspricht im Wesentlichen dem Problem der der Bei Google suchenshallow copy und der Bei Google suchendeep copy.
Wenn Dich dieser Ansatz interssiert, mache einen neuen Thread auf und wir könnten den Vergleich von Objekten mithilfe der RTTI diskutieren (leider erst heute nach Feierabend).

StTüff 10. Nov 2003 06:00

Re: record vergleichen
 
Hallo!

Vielen Dank für den Hinweis.

Leider habe ich momentan keine Zeit, so "tief" einzusteigen.
Grundsätzlich interessiere ich mich natürlich für alles, was
ich noch nicht kenne.

Vielleicht komme ich noch mal auf Dein Angebot zurück, wenn's
bei mir zeitlich besser passt.

Gruß und noch mal besten Dank an alle!

StTüff


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 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