Wie werden Objekte verglichen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Wie werden Objekte verglichen?

Beitrag von RSE »

Hallo!

Wie vergleicht FreePascal eigentlich Objekte?

Code: Alles auswählen

var
  Obj1, Obj2: TObject;
...
 
if Obj1 = Obj2 then begin
   ...
end;


Wann genau wird dieser Ausdruck wahr? Wenn beide Variablen (Obj1 und Obj2) auf die gleiche Speicheradresse verweisen (Die Startadresse der Instanz)? Oder wenn alle Felder beider Objekte die gleichen Belegungen haben? Oder gar noch etwas anderes?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie werden Objekte verglichen?

Beitrag von theo »

Soviel ich weiss nur als Pointer (Adresse), d.h. ob es sich um das gleiche Objekt handelt.

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

TFont z.b. macht das so

Code: Alles auswählen

function TFont.IsEqual(AFont: TFont): boolean;
begin
  if (AFont = Self) then Exit(true);
  if (AFont=nil)
  or (CharSet<>AFont.CharSet)
  or (Color<>AFont.Color)
  or (PixelsPerInch<>AFont.PixelsPerInch)
  or (Size<>AFont.Size)
  or (Height<>AFont.Height)
  or (Name<>AFont.Name)
  or (Pitch<>AFont.Pitch)
  or (Style<>AFont.Style) then
    Result := False
  else
    Result := True;
end;


Wenn du dir noch mal hierzu die ObjectListe anschaust, wirst du sehen, die machen das genau so wie in deinen Beispiel.
MFG
Michael Springwald

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Beitrag von RSE »

Danke, dann ist es so, wie ich gedacht hatte ;-)

TFont.IsEqual ist ja dann eher ein spezieller Vergleich, ob die beiden Instanzen das gleiche repräsentieren (oder es sich gar um das selbe Objekt handelt = die selbe Instanz).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

man könnte auch = operator überladen und dann deine eigene Überprüfung durchführen

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

EugenE hat geschrieben:man könnte auch = operator überladen und dann deine eigene Überprüfung durchführen


Cool - das Überladen geht sogar mit dem = Operator?

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ja ! müsste gehen, ich weiß nur nicht genau wie, in den Lazarus Soruce findest du aber reichlich beispiele dazu...
MFG
Michael Springwald

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

hmmm würde mich auch interessieren für records. Wenn jemand es weiß wie, bitte reinschreiben!
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Code: Alles auswählen

operator = (a,b : TRecordName) : Boolean;
begin
    Result := true;
end;


ich weiß nicht ob es funktioniert, kannst es ja mal ausprobieren ^^

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Beitrag von marcov »

[Language=Kohle-Deutsch]

Fuer overloading mit Records, sieh den Ucomplex unit (im rtl/inc Verzeichnis).

[/language]

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

WOW. Sehr cool. Danke.
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Beitrag von Hitman »

Für Objekte wird das allerdings nicht gehen. Operatoren können/dürfen nicht für Pointer überladen werden - und das schließt Objekte mit ein.

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

hmmm ah klar. logisch.
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re:

Beitrag von marcov »

Hitman hat geschrieben:Für Objekte wird das allerdings nicht gehen. Operatoren können/dürfen nicht für Pointer überladen werden - und das schließt Objekte mit ein.


Teilweise Falsch. Es funktioniert fuer Objekte (TP), aber nicht fuer Classes (Delphi) :D

Antworten