Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 2 TPoint vergleichen


Ironwulf - Mo 22.12.08 01:10
Titel: 2 TPoint vergleichen
hy,

ist es möglich die 2 Koordinaten (x und y) von TPoint zu vergleichen? also z.b. so

Delphi-Quelltext
1:
If Point1 = Point2 Then ...                    


oder muss ich das immer so machen:

Delphi-Quelltext
1:
If (Point1.X = Point2.X) And (Point1.Y = Point2.X) Then ...                    


zweiteres fänd ich umständlich und würde in meinem Programm um einiges unübersichtlicher ausfallen


JayEff - Mo 22.12.08 01:13

Schonmal ausprobiert? :nixweiss:
Edit: Grade getestet, scheint nicht zu gehen. Definier dir doch einfach eine istgleich relation auf das TPoint Objekt:

Delphi-Quelltext
1:
2:
3:
4:
function equal(a, b : TPoint): Boolean;
begin
  result := (a.x = b.x) and (a.y = b.y);
end;


Xentar - Mo 22.12.08 01:18

Schreib dir halt ne Funktion CompareTPoint oder so..

Edit: Jo, genau sowas meinte ich ;)


jakobwenzel - Mo 22.12.08 01:19

Bei neueren Delphiversionen gibts class operator, die genau dafür gemacht sind:

Delphi-Quelltext
1:
2:
3:
4:
  TPointCompare = record
    x,y:Integer;
    class operator Equal(p1,p2:TPointCompare):Boolean;
  end;

Leider kriegt man das aber nicht mehr nachträglich in TPoint rein.


JayEff - Mo 22.12.08 01:22

user profile iconjakobwenzel hat folgendes geschrieben Zum zitierten Posting springen:
Bei neueren Delphiversionen
:!: :shock: Da merke ich auf, das vermisse ich unter anderem bei Delphi, was ich sonst nur von Ada kenne. Was sind "neuere" Versionen? D3, D5, D7, D8, D2005?


jakobwenzel - Mo 22.12.08 01:23

IIRC 2006, vielleicht auch seit 2005 :wink:


Tilman - Mo 22.12.08 01:23

Würde glaub ich auch so gehen (nicht ausgetestet, auf eigene Gefahr)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TMyPoint = packed record
    case Boolean of
    true: (X,Y: Longint);
    false: (vergleich: Int64);
  end;

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
  var
    a,b: TMyPoint;
begin
  a.X := StrToInt(edit1.Text);
  a.Y := StrToInt(edit2.Text);

  b.X := StrToInt(edit3.Text);
  b.Y := StrToInt(edit4.Text);

  if a.vergleich = b.vergleich then caption := 'Gleich'
                               else caption := 'Ungleich';
end;


Ironwulf - Mo 22.12.08 01:42

danke für die vielen antworten, aber irgendwie schade das man sich sowas "umständlich" zusammenschreiben muss


Hidden - Mo 22.12.08 09:10

user profile iconjakobwenzel hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
  TPointCompare = record
    x,y:Integer;
    class operator Equal(p1,p2:TPointCompare):Boolean;
  end;
Eindeutig die beste Lösung: In eine Unit packen, die Unit einbinden und die punkte statt als TPoint als TPointCompare deklarieren. Dann kann überall sonst mit "if Point1 = Point2 then .." gearbeitet werden.

Du könntest natürlich auch deine Version von TPoint in der von Borland mitgelieferten Unit anpassen, aber das ist wohl leider nicht ganz unbedenklich, zumal dein Programm mit jeder anderen Version von Delphi dann ncihtmehr ohne weiteres compillierbar wäre.

mfG,