AGB  ·  Datenschutz  ·  Impressum  







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

Komplexe Objekte vergleichen

Ein Thema von Baeuerle · begonnen am 6. Jun 2008 · letzter Beitrag vom 7. Jun 2008
Antwort Antwort
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#1

Komplexe Objekte vergleichen

  Alt 6. Jun 2008, 13:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Komplexe Objekte vergleichen

  Alt 6. Jun 2008, 13:41
Zitat von Baeuerle:
Muss ich dafür eine Prozedur schreiben? a.compareto(b)??
Wird dir nichts andere übrig bleiben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#3

Re: Komplexe Objekte vergleichen

  Alt 6. Jun 2008, 13:46
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.
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Komplexe Objekte vergleichen

  Alt 6. Jun 2008, 13:47
Die Frage ist ja noch, wann ist ein Button gleich einem anderen?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Komplexe Objekte vergleichen

  Alt 6. Jun 2008, 13:49
Einen String würde ich nicht nehmen... Lass mal eine Property den Wert 0 haben, und der erste Unterschied liegt dahinter.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Komplexe Objekte vergleichen

  Alt 7. Jun 2008, 15:49
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.
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Komplexe Objekte vergleichen

  Alt 7. Jun 2008, 16:08
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Komplexe Objekte vergleichen

  Alt 7. Jun 2008, 16:11
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:
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.
42
  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 00:20 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