Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf Privates Feld des Vorgängers zugreifen (https://www.delphipraxis.net/151845-auf-privates-feld-des-vorgaengers-zugreifen.html)

BenjaminH 3. Jun 2010 16:24


Auf Privates Feld des Vorgängers zugreifen
 
Hallo,
TControl hat die private Procedure SetColor.
Mein Nachfahre davon soll auf eine Änderung der Farbe reagieren. Also habe ich SetColor überschrieben.
Gibt es eine Möglichkeit die Procedure von TControl aufzurufen, obwohl sie als private deklariert ist? Oder ist mein Weg falsch? Wie geht das geschickter?
Vielen Dank,
Benjamin

himitsu 3. Jun 2010 16:27

Re: Auf Privates Feld des Vorgängers zugreifen
 
Private gehört nur der Klasse.
Was nicht als virtual oder dynamic deklariert ist, kann nicht überschrieben (override) werden.

Innerhalb der selben Unit kann man aber von extern auf private Felder/Methoden zugreifen/aufrufen (solange sie nicht "strict private" sind.


Schau doch einfach mal, welche Message bei einer Änderung im Control rumgeschieckt wird und reagiere darauf.

Uwe Raabe 3. Jun 2010 17:12

Re: Auf Privates Feld des Vorgängers zugreifen
 
Zitat:

Zitat von BenjaminH
TControl hat die private Procedure SetColor.
Mein Nachfahre davon soll auf eine Änderung der Farbe reagieren. Also habe ich SetColor überschrieben.

Das kann schiefgehen, da ein Schreibzugriff auf Color in diesem Fall wohl nicht deine Methode erreicht.

Zitat:

Zitat von BenjaminH
Gibt es eine Möglichkeit die Procedure von TControl aufzurufen, obwohl sie als private deklariert ist?

Keinen, den ich die empfehlen würde.

Zitat:

Zitat von BenjaminH
Oder ist mein Weg falsch? Wie geht das geschickter?

Ja, dein Weg ist falsch. Besser ist folgender: SetColor setzt am Ende eine Message CM_COLORCHANGED ab, die du mit einer Message-Methode abfangen kannst, obwohl die originale Methode private ist.

Delphi-Quellcode:
type
  TMyControl = class(TControl)
  private
    procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
  public
  end;

procedure TMyControl.CMColorChanged(var Message: TMessage);
begin
  inherited;
  // tue was immer nötig ist
end;

BenjaminH 3. Jun 2010 19:18

Re: Auf Privates Feld des Vorgängers zugreifen
 
Vielen Dank!
die Methode mit der Message gefällt mir sehr gut, ich hoffe daran erinnere ich mich das nächste Mal wieder.


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