Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kann Klasse von Record erben? (https://www.delphipraxis.net/144756-kann-klasse-von-record-erben.html)

MisterNiceGuy 15. Dez 2009 22:57


Kann Klasse von Record erben?
 
Hi, ich würde gerne TRect als Grundgerüst für eine neue Klasse verwenden. Geht das irgendwie?
Auf dem herkömmlichen Weg hab ich keinen Erfolg:
Delphi-Quellcode:
type TMyRect = class(TRect)
...
end;

omata 15. Dez 2009 23:05

Re: Kann Klasse von Record erben?
 
Da TRect ein Record ist kannst du nicht davon ableiten. Aber du könntest den Typ TRect überschreiben.
Fragt sich nur was das soll? Sinnvoll ist das auf jedenfall nicht.

semo 16. Dez 2009 06:07

Re: Kann Klasse von Record erben?
 
Am einfachsten erstellst du dir eine Klasse TMyRect mit den Feldern von TRect und kannst wunderbar damit arbeiten und auch davon ableiten.

himitsu 16. Dez 2009 08:09

Re: Kann Klasse von Record erben?
 
Was willst du denn erreichen?

Also ableiten geht nicht, da Records und Objekte etwas unterschiedlich sind, auch wenn Objekte in Wirklichkeit ja auch Record-Pointer darstellen, also Pointer (die Objektvariable) welche auf einen record zeigen.
Allerdings mit ein paar zusätzlichen "unsichtbaren" Feldern vor den eigenen "Daten" und noch ein paar mehr RTTI-Records/Arrays im Hinterdrund.

Seit Delphi 2006 / Turbo Delphi kann man Records auch mit Funktionen, Prozeduren und Properties ausstatten. (es bleibt aber von der Speicherverwaltung her ein Record)

MisterNiceGuy 16. Dez 2009 17:05

Re: Kann Klasse von Record erben?
 
Ich will eine TRect-Klasse haben weil ich diese, falls sie nicht gefüllt ist auf = nil überprüfen kann, bzw ihr einen weiteren Parameter verpassen kann der sagt ob sie initialisiert ist oder nicht.

Leider ist das mit dem "kopieren" aus dem Record nicht so leicht. Folgendes bringt eine Fehlermeldung "end erwarter aber case gefunden"

Delphi-Quellcode:
type TjfRect = class
  case Integer of
    0: (Left, Top, Right, Bottom: Integer);
    1: (TopLeft, BottomRight: TPoint);
end;

Neutral General 16. Dez 2009 17:22

Re: Kann Klasse von Record erben?
 
Zitat:

Zitat von MisterNiceGuy
Ich will eine TRect-Klasse haben weil ich diese, falls sie nicht gefüllt ist auf = nil überprüfen kann, bzw ihr einen weiteren Parameter verpassen kann der sagt ob sie initialisiert ist oder nicht.

Leider ist das mit dem "kopieren" aus dem Record nicht so leicht. Folgendes bringt eine Fehlermeldung "end erwarter aber case gefunden"

Delphi-Quellcode:
type TjfRect = class
  case Integer of
    0: (Left, Top, Right, Bottom: Integer);
    1: (TopLeft, BottomRight: TPoint);
end;

Kein Problem wenn man ein bisschen überlegt :P

Delphi-Quellcode:
TjfRect = class
private
  FLeft, FTop, FRight, FBottom: Integer;
public
  property Left: Integer read FLeft write FLeft;
  property Top: Integer read FTop write FTop;
  property Right: Integer read FRight write FRight;
  property Bottom: Integer read FBottom write FBottom;
 
  property TopLeft: TPoint read GetTopLeft write SetTopLeft;
  property BottomRight: TPoint read GetBottomRight write SetBottomRight;
end;

function TjfRect.GetBottomRight: TPoint;
begin
  Result := Point(FRight,FBottom);
end;

function TjfRect.GetTopLeft: TPoint;
begin
  Result := Point(FLeft,FTop);
end;

procedure TjfRect.SetBottomRight(const Value: TPoint);
begin
  FRight := Value.X;
  FBottom := Value.Y;
end;

procedure TjfRect.SetTopLeft(const Value: TPoint);
begin
  FLeft := Value.X;
  FTop := Value.Y;
end;

himitsu 16. Dez 2009 17:44

Re: Kann Klasse von Record erben?
 
warum nimmst du nicht einfach PRect?

MisterNiceGuy 16. Dez 2009 17:53

Re: Kann Klasse von Record erben?
 
Es... es gibt ein PRect? :snowball:

himitsu 16. Dez 2009 18:06

Re: Kann Klasse von Record erben?
 
ähhhh ja :lol:


ansonsten ginge noch sowas:
Delphi-Quellcode:
type
  TMyRefRect = record
  private
    Data: PRect;
    function GetLeft:    LongInt;
    procedure SetLeft (i: LongInt);  // hier dafür sorgen,
    function GetTop:     LongInt;
    procedure SetTop  (i: LongInt);  // das in Data Speicher
    function GetRight:   LongInt;
    procedure SetRight (i: LongInt);  // reserviert ist
    function GetBottom:  LongInt;
    procedure SetBottom(i: LongInt);  // und dann eventuell
    function GetTopLeft:    PPoint; // die empfangenen
    function GetBottomRight: PPoint; // Daten eintragen
  public
    class operator Implicit(      Rec: TMyRefRect): TRect;
    class operator Implicit(Const Data: TRect):     TMyRefRect;

    property Left:  LongInt read GetLeft  write SetLeft;
    property Top:   LongInt read GetTop   write SetTop;
    property Right: LongInt read GetRight write SetRight;
    property Bottom: LongInt read GetBottom write SetBottom;

    property TopLeft:    PPoint read GetTopLeft;
    property BottomRight: PPoint read GetBottomRight;

    Procedure Clear;
    Function isSet: Boolean;
  end;
Wobei ich hier von der Speicherverwaltung her eher ein Interface statt des interen PRect verwenden
oder einen String (also einfach irgendwas mit Referenzzählung) mißbrauchen würde.


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