AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi class(TPersistent) - Zugriff auf "höhere" Prozeduren
Thema durchsuchen
Ansicht
Themen-Optionen

class(TPersistent) - Zugriff auf "höhere" Prozeduren

Ein Thema von Merlin1988 · begonnen am 20. Aug 2005 · letzter Beitrag vom 20. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Merlin1988
Merlin1988

Registriert seit: 10. Aug 2005
33 Beiträge
 
Delphi 6 Enterprise
 
#1

class(TPersistent) - Zugriff auf "höhere" Prozedur

  Alt 20. Aug 2005, 12:43
Hi

Ich habe eine eigene Komponente, welche eine Hauptklasse beinhaltet (abgeleitet von TPaintbox)
und mehrere Unterklassen (abgeleitet von TPersistent), die zum Teil wiederum einige Unterklassen, abgeleitet von Tpersistent, beinhalten. Dies dient dazu im Objektinspektor eine Art "Treeview" darzustellen. [Vielleicht blöd ausgedrückt ^^], also wie "Font".
Jetzt möchte ich bei einer Änderung einer Property bzw. Subproperty eine Procedure / Function der Hauptklasse aufrufen. Das Problem ist nur das die Unterklasse, wo die Änderung geschieht, nichts von der Hauptklasse und deren Procedures weiss. (Es kann sein, dass die Änderung zum Beispiel in der 5. Unterklasse einer Hauptklasse geschieht.)

Wie kann ich also von einer Unterklasse die Procedures und Functions der Hauptklasse aufrufen (Beweggrund: die Hauptklasse kennt alle Variablen die in der Komponente/Hauptklasse vorkommen, was zum Zeichnen der Kopmonente wichtig ist) ???
Use the Source, Luke.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 12:49
Ich würde in den Unterklassen ein Event auslösen und dieses in der Hauptklasse dann verarbeiten. Das hat den Vorteil, dass die Unterklasse keine Informationen von der übergeordneten Klasse benötigt.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Merlin1988
Merlin1988

Registriert seit: 10. Aug 2005
33 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 12:50
und wie würde das dann aussehen. Quelltext technisch
Use the Source, Luke.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 12:52
wenn du beim Create der unterclassen (TComponent) den Owner angegeben hast könntest du dich anhand dessen nach oben durchhangeln.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Merlin1988
Merlin1988

Registriert seit: 10. Aug 2005
33 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 13:20
funktioniert das auch wenn die Unterklassen von TPersistent abgeleitet sind ???
Use the Source, Luke.
  Mit Zitat antworten Zitat
Benutzerbild von Merlin1988
Merlin1988

Registriert seit: 10. Aug 2005
33 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 13:25
1. Wie würde der Constructor dann aussehen ??
2. Kann ich mich über "Owner" hochangeln ??
Use the Source, Luke.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 13:30
Für dieses Projekt habe ich beide Varianten benutzt:
Für das OffScreenBitmap und andere untergeordnete Klassen hat die Ereignis-Variante genügt, zur Vereinfachung habe ich noch eine gemeinsame Basisklasse geschrieben:
Delphi-Quellcode:
TNotifyingPersistent = class(TPersistent)
  private
    FOnChange: TNotifyEvent;
  protected
    procedure Change; virtual;
  public
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

[...]

{ TNotifyingPersistent }

procedure TNotifyingPersistent.Change;
begin
  if Assigned(FOnChange) then
    FOnChange(Self);
end;
Die Implementierung in die Basisklasse sah dann so aus:
Delphi-Quellcode:
TMathImage = class(TCustomControl)
  private
    [...]
    FBit: TMathBitmap;
    procedure SomeEventhandler(Sender: TObject);
  published
    [...]
    property MathBitmap: TMathBitmap read FBit write SetBit;
  end;

procedure TMathImage.SomeEventhandler(Sender: TObject);
begin
  Redraw;
end;

constructor TMathImage.Create;
begin
  inherited;
  [...]

  FBit := TMathBitmap.Create;
  FBit.OnChange := SomeEventhandler;
end;
Für die View-Property habe ich aber Zugriff auf das Image gebraucht, deshalb muss hier zusätzlich zum Ereignis der Owner angegeben werden:
Delphi-Quellcode:
  TMathImage = class; // Forward-Deklaration
  TMathFloatRectClass = class(TNotifyingPersistent)
  private
    FOwner: TMathImage;
    [...]
  public
    constructor Create(AOwner: TMathImage);
    procedure NormalizeRect;
  end;

{ TMathFloatRectClass }

constructor TMathFloatRectClass.Create;
begin
  inherited Create;
  FOwner := AOwner;
  TestRect;
end;

procedure TMathFloatRectClass.NormalizeRect;
var
  yRel, yCenter: MathFloat;
begin
  // xAbs / yAbs = xRel / yRel
  // yRel = yAbs / xAbs * xRel
  if Assigned(FOwner) and (FOwner.Height <> 0) and (FOwner.Width <> 0) then
    with FRect do
    begin
      yRel := FOwner.Height / FOwner.Width * (Right - Left);
      yCenter := (Top + Bottom) / 2;
      Top := yCenter + yRel / 2 * (Ord(Top > yCenter) * 2 - 1);
      Bottom := yCenter + yRel / 2 * (Ord(Bottom > yCenter) * 2 - 1);
      Change;
    end;
end;
Der Zugriff ist also problemlos über FOwner möglich (wobei hier ein FOwner: TCustomControl ohne Forward-Deklaration gereicht hätte).
Endergebnis:
http://img388.imageshack.us/img388/9939/oi2ce.png
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Merlin1988
Merlin1988

Registriert seit: 10. Aug 2005
33 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 17:08
ich hab das jetzt so versucht zu lösen, indem ich den Owner bei Create übergebe und in einer Variable speichere.
Jetzt weiss ich nur nicht von welchem Typ der Owner sein muss ??
Das Problem ist, wenn der Owner den Typ der Hauptklasse hat, muss diese vorher deklariert sein. Dann kann aber die Hauptklasse keine Variable vom Typ der Unterklasse haben, weil diese noch nicht bekannt ist.
Use the Source, Luke.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#9

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 17:34
Zitat von Khabarakh:
Ich würde in den Unterklassen ein Event auslösen und dieses in der Hauptklasse dann verarbeiten. Das hat den Vorteil, dass die Unterklasse keine Informationen von der übergeordneten Klasse benötigt.
Dafür würde ich auch meine Stimme abgeben.
Auf die Art kann man die Klassen auch schön entkoppeln, da nicht zwangsläufig eine Dorfstraßen-Kommune entstehen muss, in der jede Klasse jede andere kennt.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: class(TPersistent) - Zugriff auf "höhere" Proz

  Alt 20. Aug 2005, 17:38
Zitat von Merlin1988:
Das Problem ist, wenn der Owner den Typ der Hauptklasse hat, muss diese vorher deklariert sein. Dann kann aber die Hauptklasse keine Variable vom Typ der Unterklasse haben, weil diese noch nicht bekannt ist.
Wenn du alles unter ein type schreibst, dann kannst du die Klasse "forward" deklarieren:
Delphi-Quellcode:
type
  TX = class; //<-- das ist die "forward" Deklaration

  TY = class(...)
  private
    FOwner: TX;
  public
    constructor Create(AOwner: TX);
    property Owner: TX read FOwner;
  end;

  TX = class(...)
  private
    FChild: TY;
  public
    property Child: TY read FChild;
  end;
//EDIT: bisschen nachgebessert...
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:42 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