Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komplexe Objekte vergleichen (https://www.delphipraxis.net/115134-komplexe-objekte-vergleichen.html)

Baeuerle 6. Jun 2008 13:37


Komplexe Objekte vergleichen
 
Hallo zusammen,

wie kann ich komplexe Objekte vergleichen?

Delphi-Quellcode:

type
 TTest = class(TObject)
 private
  FList: TStringList;
  FName: String;
  FBoll: Boolean;
  FButton: TButton;
 public
  constructor Create;
  property List: TStringList read FList write FList;
  property Name: String read FName write FName;
 end;


var a, b: TTest;

a:=TTest.Create;
a.name:='Hallo Welt';
b:=TTest.Create;
b.name:='Hallo Welt';

if comparemem(a,b,a.InstanceSize) then
 showmessage('identisch'); // geht nicht -> ich denke wegen unterschiedlicher Adressen von TStringList

if a=b then
 showmessage('identisch'); // geht auch nicht
Muss ich dafür eine Prozedur schreiben? a.compareto(b)??

thx
baeuerle

Bernhard Geyer 6. Jun 2008 13:41

Re: Komplexe Objekte vergleichen
 
Zitat:

Zitat von Baeuerle
Muss ich dafür eine Prozedur schreiben? a.compareto(b)??

Wird dir nichts andere übrig bleiben.

mschaefer 6. Jun 2008 13:46

Re: Komplexe Objekte vergleichen
 
Vielleicht kann beide in einen String Streamen und dann einfach einen Stringvergleich durchführen.
Bringt aber nur gleich oder ungleich und ist sicherlich eher langsam, aber universell.

sirius 6. Jun 2008 13:47

Re: Komplexe Objekte vergleichen
 
Die Frage ist ja noch, wann ist ein Button gleich einem anderen?

Medium 6. Jun 2008 13:49

Re: Komplexe Objekte vergleichen
 
Einen String würde ich nicht nehmen... Lass mal eine Property den Wert 0 haben, und der erste Unterschied liegt dahinter.

everdream 7. Jun 2008 15:49

Re: Komplexe Objekte vergleichen
 
Zitat:

Zitat von Baeuerle
Delphi-Quellcode:
if a=b then
 showmessage('identisch'); // geht auch nicht

Das vergleicht soweit ich weiß die Adressen der Instanzen. Es prüft also nicht ob es die Instanzen gleich sind, sondern ob es sich um die selbe Instanz handelt.

Hansa 7. Jun 2008 16:08

Re: Komplexe Objekte vergleichen
 
Ein Schuss ins Blaue (aus Uralt-Source) :

Delphi-Quellcode:
Function Comp_Stru ( Var s1, s2; groesse : word ) : boolean;
  Var
    a1 : Array [1..$FFFF] Of Byte Absolute s1;
    a2 : Array [1..$FFFF] Of Byte Absolute s2;
    i : Integer;
    c : integer;
  Begin
    c := 0;
    For i := 1 To groesse Do Begin
      If a1[i]<a2[i] Then Begin
        c := -1;
      End;
      If a1 [i] > a2 [i] Then Begin
        c := 1;
      End;
      Comp_Stru := c <> 0;
    End;
  End;
Glaube fast nicht, dass das heute noch geht. Wenn man die reinen Daten allerdings aus den Objekten rausziehen könnte ? :gruebel:

oki 7. Jun 2008 16:11

Re: Komplexe Objekte vergleichen
 
Hi,

wenn du a und b vergleichst, dann sind die definitiv unterschiedlich. A und b sind jeweils ein eingenes Object deiner Klasse. Die Frage ist jetzt was du vergleichen willst. Da bietet sich folgendes an:

1. gleiches Object dessen Adresse in unterschiedlichen Variablen gespeichet wurde.
Delphi-Quellcode:
var a, b: TTest;

a:=TTest.Create;
b:=a;
Hier ist a = b.

2. gleiche Klasse aber unterschiedliche Objecte.
Delphi-Quellcode:
var a, b: TTest;

a:=TTest.Create;
a.name:='Hallo Welt';
b:=TTest.Create;
b.name:='Hallo Welt';
Hier gilt:
Delphi-Quellcode:
if (a is TTest) and (b is TTest)
ergibt True. Also beide Objecte der gleichen Klasse.

3. Gleiche Klasse, unterschiedliche Objecte gleicher Inhalt.
Ich nehme mal an, darauf willst du hinaus. Imho sehe ich da eine eigene Function, wie Assign, nur mit Vergleich und nicht mit Zuweisung. Das ist dann leider Schreibarbeit. Du mußt wirklich alle Eigneschaften vergleichen. Zum Glück aber nich mehr.
Delphi-Quellcode:
type
TTest = class(TObject)
private
  FList: TStringList;
  FName: String;
  FBoll: Boolean;
  FButton: TButton;
public
  constructor Create;
  Function Compare(Source : TTest) : Boolean;
  property List: TStringList read FList write FList;
  property Name: String read FName write FName;
end;

Function TTest.Compare(Source : TTest) : Boolean;
begin
  Result := True;
  // die einzelnen Einträge der Liste incl. Objekte in Objects vergleichen; Im Notfall auf gleiche Instanz, sonnst eine eigene Compare Methode
  // alle Eigenschaften vergleichen wie FName ....
end;
Sollte bei den enthalten Klassen dies alles auch in den Propertys identisch sein, so sehe ich schwarz.

Imho würde ich dann anders herum ran gehen. Nicht prüfen, ob die identisch sind, sondern schauen ob sie identisch sein sollen. Wenn ja, mit Assign zuweisen. Dann sind sie identisch. imho brauch TTest dann natürlich auch eine eigene Assign-Methode.

Wozu brauchst du das eigentlich?

Gruß oki

Ach menne, ich gebs auf heute. Schon wieder roter Kasten. :cry:


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