![]() |
Komplexe Objekte vergleichen
Hallo zusammen,
wie kann ich komplexe Objekte vergleichen?
Delphi-Quellcode:
Muss ich dafür eine Prozedur schreiben? a.compareto(b)??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 thx baeuerle |
Re: Komplexe Objekte vergleichen
Zitat:
|
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. |
Re: Komplexe Objekte vergleichen
Die Frage ist ja noch, wann ist ein Button gleich einem anderen?
|
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.
|
Re: Komplexe Objekte vergleichen
Zitat:
|
Re: Komplexe Objekte vergleichen
Ein Schuss ins Blaue (aus Uralt-Source) :
Delphi-Quellcode:
Glaube fast nicht, dass das heute noch geht. Wenn man die reinen Daten allerdings aus den Objekten rausziehen könnte ? :gruebel:
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; |
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:
Hier ist a = b.
var a, b: TTest;
a:=TTest.Create; b:=a; 2. gleiche Klasse aber unterschiedliche Objecte.
Delphi-Quellcode:
Hier gilt:
var a, b: TTest;
a:=TTest.Create; a.name:='Hallo Welt'; b:=TTest.Create; b.name:='Hallo Welt';
Delphi-Quellcode:
ergibt True. Also beide Objecte der gleichen Klasse.
if (a is TTest) and (b is TTest)
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:
Sollte bei den enthalten Klassen dies alles auch in den Propertys identisch sein, so sehe ich schwarz.
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; 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 03:18 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-2025 by Thomas Breitkreuz