Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Klasse in Klasse (https://www.delphipraxis.net/46933-klasse-klasse.html)

LoL 3. Jun 2005 10:11


Klasse in Klasse
 
hi

Ich habe eine Klasse die ich von TLineSeries abgeleitet habe. Als eigenschaft habe ich eine andere Klasse asl Eigenschafts-kontainer von TPersistent abgeleitet. Wie kann ich nun in einer Funktion der Klasse von TPersistent auf die Funktionen der Übergeorneten Klasse zugreifen?

Delphi-Quellcode:
type
  TProcessDescription = class(TPersistent)
  private
    {eigenschaften}
  public
    procedure machwas;
  end;

  TdddLineSeries = class(TLineSeries)
  private
    { Private declarations }
    FProzDesc : TProcessDescription;
    procedure SetProzDesc(Value : TProcessDescription);
  protected
    { Protected declarations }
  public
    { Public declarations }
    property ProzDesc : TProcessDescription read FProzDesc write SetProzDesc;

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
  end;

procedure TProcessDescription.machwas;
begin
  //auf TdddLineSeries zugreifen?
end;
//////////////////////////////////////////////////////////////////////////////
procedure TdddLineSeries.SetProzDesc(Value : TProcessDescription);
begin
  if not(CompareMem(@Value, @FProzDesc, sizeof(Value))) then
    FProzDesc := Value;
end;

shmia 3. Jun 2005 10:25

Re: Klasse in Klasse
 
Hi,

Dir fehlen irgendwie die Grundlagen zur objekt-orientierten Programmierung.
Lies mal: http://www.dsdt.info/grundlagen/sprache/oo3.php
Thema Vererbung, weiterlesen bis virtuelle Methoden.

Der Konstruktor von TdddLineSeries ist übrigens nicht richtig; nur Klassen, die von TComponent
abgeleitet wurden haben den Übergabeparameter AOwner.

ste_ett 3. Jun 2005 10:32

Re: Klasse in Klasse
 
TdddLineSeries kennt TProcessDescription, weil das da deklariert wird.

TProcessDescription kennt TdddLineSeries allerdings nicht, da TdddLineSeries eine erbende Klasse von TProcessDescription ist. Eine Klasse kennt immer nur die Methoden/Variablen/etc. der übergeordneten Klasse.

Flogo 3. Jun 2005 10:49

Re: Klasse in Klasse
 
Du könntest beim Erstellen von FProzDesc eine Referenz auf das TdddLineSeries-Objekts mitgeben und im FProzDesc speichern. Dann kannst du auf die öffentlichen Methoden des TdddLineSeries-Objekts zugreifen.
Ob das aber so besonders sinnvoll ist wage ich zu bezweifeln. Das Ganze führt auf Dauer doch nur zu Chaos und hebelt irgendwie die OOP aus.

LoL 3. Jun 2005 12:35

Re: Klasse in Klasse
 
Hmm nun wie macht man das denn dann eigentlich grunsätzlich wenn man in ne Komponente eine Property unterbringen will die wiederrum untereigenschaften enthält die ovn unterschiedlichen typen sind? Das dient ja im Prinzip nur zur übersihtlichkeit da man die eigenschaften die zusammengehören gruppiert. Das sind doch dann auch Klassen oeder wie wird das gemacht?

Flogo 3. Jun 2005 12:43

Re: Klasse in Klasse
 
Ich bin nicht sicher ob ich dich hier richtig verstehe, aber wenn du nur Eigenschaften gruppieren willst, würde sich doch auch ein Record anbieten

Jens Schumann 3. Jun 2005 12:44

Re: Klasse in Klasse
 
Hallo
flogo hat den richtigen Ansatz geliefert.
So wird der Ansatz umgesetzt:
Delphi-Quellcode:
type
  TdddLineSeries = class; // forward Deklaration von TdddLineSeries

  TProcessDescription = class(TPersistent)
  private
    {eigenschaften} 
    FParent : TdddLineSeries;
  public
    constructor Create(aParent : TdddLineSeries);
    procedure machwas;
  end;

  ...

  TdddLineSeries = class(TLineSeries)

  constructor TProcessDescription .Create(aParent : TdddLineSeries);
  begin
  ...
    FParent:=aParent;
  ...
  end;

  ...
  constructor TdddLineSeries.Create(...);
  begin
  ...
  FProcessDescription:=TProcessDescription.Create(Self);
  ...
  end;

LoL 3. Jun 2005 13:02

Re: Klasse in Klasse
 
Danke sehr! :thumb:
funktioniert wunderbar

barf00s 3. Jun 2005 13:18

Re: Klasse in Klasse
 
Zitat:

Zitat von LoL
hi

Ich habe eine Klasse die ich von TLineSeries abgeleitet habe. Als eigenschaft habe ich eine andere Klasse asl Eigenschafts-kontainer von TPersistent abgeleitet. Wie kann ich nun in einer Funktion der Klasse von TPersistent auf die Funktionen der Übergeorneten Klasse zugreifen?

Delphi-Quellcode:

procedure TdddLineSeries.SetProzDesc(Value : TProcessDescription);
begin
  if not(CompareMem(@Value, @FProzDesc, sizeof(Value))) then
    FProzDesc := Value;
end;

darauf kannst auch verzichten ... ein einfaches

Delphi-Quellcode:
if FProzDesc <> Value then
  FProzDesc := Value;
tuts auch.
achja und "sizeof(value)" wäre ja "sizeof(classinstance)" klassen sind pointer und die größe von pointern wäre 4 - also würdest du WENN du das schon mit dem comperemem so machst nur die ersten 4 bytes vergleichen

mael 3. Jun 2005 14:02

Re: Klasse in Klasse
 
Zitat:

Zitat von barf00s
achja und "sizeof(value)" wäre ja "sizeof(classinstance)" klassen sind pointer und die größe von pointern wäre 4 - also würdest du WENN du das schon mit dem comperemem so machst nur die ersten 4 bytes vergleichen

Nur der Genauigkeit wegen: Es gibt Objektinstanzen(TObject.Create) und Klasseninstanzen (TClass.Create), beides mal wird ein Pointer zurückgeliefert, aber TClass.Create.Create macht erst das was TObject.Create macht, nämlich ein Objekt erzeugen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 Uhr.
Seite 1 von 2  1 2      

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