Delphi-PRAXiS

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/)
-   -   Properties bei Ableitung verschieben (https://www.delphipraxis.net/199964-properties-bei-ableitung-verschieben.html)

Getox 6. Mär 2019 13:04

Properties bei Ableitung verschieben
 
Moin,

kann ich beim Ableiten einer Komponente (zum Beispiel TEdit) in der Ableitung Sachen vom Published in den Public Bereich verschieben, ohne die Ursprungskomponente anzufassen? Und falls es geht, wie?

Ich möchte ein eigenes Edit implementieren, das nicht nur neue Funktionen beherrscht, sondern auch für meine Zwecke aufgeräumter ist. Dafür möchte ich gerne alles aus dem Objektinspektor verbannen, was ich ohnehin nie benutze. Zur Not kann man es ja immer noch per Code ändern oder wieder aufnehmen.

Liebe Grüße

TiGü 6. Mär 2019 13:51

AW: Properties bei Ableitung verschieben
 
Oder du leitest von TCustomEdit aus Vcl.StdCtrls ab und published nur das, was du möchtest.

DeddyH 6. Mär 2019 17:14

AW: Properties bei Ableitung verschieben
 
Exakt, genau so handhabt die VCL das intern auch.

FaTaLGuiLLoTiNe 6. Mär 2019 17:15

AW: Properties bei Ableitung verschieben
 
Man kann bei Vererbung die Sichtbarkeit von Eigenschaften nur erweitern, nicht beschränken.

DeddyH 6. Mär 2019 17:53

AW: Properties bei Ableitung verschieben
 
Deshalb ja der Trick, in den TCustomXXX-Klassen sind die meisten Properties protected deklariert, die Ableitungen implementieren oft gar keine oder nur wenige weitere Funktionalitäten, erhöhen aber die Sichtbarkeit der für sinnvoll erachteten Properties.

TurboMagic 6. Mär 2019 22:26

AW: Properties bei Ableitung verschieben
 
Zitat:

Zitat von FaTaLGuiLLoTiNe (Beitrag 1427114)
Man kann bei Vererbung die Sichtbarkeit von Eigenschaften nur erweitern, nicht beschränken.

Jein...
Ich habe auch schon mal methoden in kindklassen überschrieben die dann weniger sichtbar waren.
Nur: der Compiler warnt immer davor und da es sowieso ausversehen war hab' ich das dann auch gleich geändert.

Zumindest bei Methoden geht es also.

DeddyH 7. Mär 2019 06:16

AW: Properties bei Ableitung verschieben
 
Dann dürfte das hier aber nicht funktionieren:
Delphi-Quellcode:
type
  TParent = class
  public
    procedure TuWas; virtual;
  end;

  TChild = class(TParent)
  strict private
    procedure TuWas; override;
  end;

{ TParent }

procedure TParent.TuWas;
begin
  ShowMessage('Parent');
end;

{ TChild }

procedure TChild.TuWas;
begin
  ShowMessage('Child');
end;

procedure TFormTest.ButtonTestClick(Sender: TObject);
var
  test: TChild;
begin
  test := TChild.Create;
  try
    test.TuWas;
  finally
    test.Free;
  end;
end;

Andreas L. 7. Mär 2019 09:01

AW: Properties bei Ableitung verschieben
 
Bei manchen Eigenschaften kannst du die Sichtbarkeit verringern.

Delphi-Quellcode:
type
  TMyControl = class(TCustomPanel)
  protected
    // Ist nicht mehr im Object-Inspector zu sehen:
    property ParentFont;
    // Ist weiterhin im Object-Inspector zu sehen:
    property Left;
  end;

Schokohase 7. Mär 2019 09:09

AW: Properties bei Ableitung verschieben
 
Zitat:

Zitat von Andreas L. (Beitrag 1427167)
Bei manchen Eigenschaften kannst du die Sichtbarkeit verringern.

Delphi-Quellcode:
type
  TMyControl = class(TCustomPanel)
  protected
    // Ist nicht mehr im Object-Inspector zu sehen:
    property ParentFont;
    // Ist weiterhin im Object-Inspector zu sehen:
    property Left;
  end;

Nun ja
-
Delphi-Quellcode:
TCustomPanel.ParentFont
ist
Delphi-Quellcode:
protected
(deklariert in
Delphi-Quellcode:
TControl.ParentFont
)
-
Delphi-Quellcode:
TCustomPanel.Left
ist
Delphi-Quellcode:
published
(deklariert in
Delphi-Quellcode:
TControl.Left
)
Das wundert mich also nicht und damit stimmt die Aussage weiterhin, dass man die Sichtbarkeit nicht verringern kann.

Andreas L. 7. Mär 2019 15:24

AW: Properties bei Ableitung verschieben
 
Zitat:

Zitat von Schokohase (Beitrag 1427169)
Zitat:

Zitat von Andreas L. (Beitrag 1427167)
Bei manchen Eigenschaften kannst du die Sichtbarkeit verringern.

Delphi-Quellcode:
type
  TMyControl = class(TCustomPanel)
  protected
    // Ist nicht mehr im Object-Inspector zu sehen:
    property ParentFont;
    // Ist weiterhin im Object-Inspector zu sehen:
    property Left;
  end;

Nun ja
-
Delphi-Quellcode:
TCustomPanel.ParentFont
ist
Delphi-Quellcode:
protected
(deklariert in
Delphi-Quellcode:
TControl.ParentFont
)
-
Delphi-Quellcode:
TCustomPanel.Left
ist
Delphi-Quellcode:
published
(deklariert in
Delphi-Quellcode:
TControl.Left
)
Das wundert mich also nicht und damit stimmt die Aussage weiterhin, dass man die Sichtbarkeit nicht verringern kann.

Im Code habe ich aus versehen TCustomPanel statt TPanel geschrieben. In TPanel ist ParentFont published. Mit folgendem Code wird sie protected:

Delphi-Quellcode:
type
  TMyControl = class(TPanel)
  protected
    // Ist nicht mehr im Object-Inspector zu sehen:
    property ParentFont;
    // Ist weiterhin im Object-Inspector zu sehen:
    property Left;
  end;

DeddyH 7. Mär 2019 17:01

AW: Properties bei Ableitung verschieben
 
Man kann aus dem Code heraus trotzdem darauf zugreifen, was soll das also bringen?

TurboMagic 7. Mär 2019 17:14

AW: Properties bei Ableitung verschieben
 
Die ursprüngliche Frage war glaube ich nicht was das bringt, sondern ob das geht ;-)
Der OP wollte glabe ich alles was er nicht nutzt in seiner abgeleiteten Komponente aus dem objectinspektor raus haben.

DeddyH 7. Mär 2019 17:23

AW: Properties bei Ableitung verschieben
 
Und deshalb ist die erste Antwort auch der so ziemlich einzige gangbare Weg.

Uwe Raabe 7. Mär 2019 19:43

AW: Properties bei Ableitung verschieben
 
Zitat:

Zitat von Getox (Beitrag 1427066)
Dafür möchte ich gerne alles aus dem Objektinspektor verbannen, was ich ohnehin nie benutze. Zur Not kann man es ja immer noch per Code ändern oder wieder aufnehmen.

Du könntest im Package, das deine Komponente in der IDE installiert, eine von TSelectionEditor abgeleitetet Klasse registrieren, die das ISelectionPropertyFiler Interface implementiert und in FilterProperties die ungewünschten Properties ausfiltert.

Getox 8. Mär 2019 08:29

AW: Properties bei Ableitung verschieben
 
Ich Arbeite nun schon seit 3 Jahren mit Delphi... aber irgendwie trete ich selbst mit meiner persönlichen Entwicklung auf der Stelle. Ich mache tagtäglich eigentlich nichts anderes als vorgegebene Dinge in unserem (nicht objektorientierten) Projekt zu reparieren oder zu erweitern und dabei zu hoffen, dass ich nichts anderes dabei kaputt mache.

Ich möchte aber auch mal neue Bereiche kennen lernen... daher wollte ich mal ein wenig mit selbst abgeleiteten Komponenten und Klassen/Objekten rumspielen und lernen.

Wie auch immer... Ich habe jetzt das TCustomEdit abgeleitet und erstmal nur 3 Kleinigkeiten zum Test abgeändert (Höhe, ctl3d aus und Schriftgröße). Dann habe ich das mit einem neuen Komponentenpaket erzeugt. Was direkt auffällt ist, dass die DCUs nicht im selben Ordner erscheinen wie die PAS-Dateien, was sonst immer so ist. Aber die PAS liegt in dem Ordner wo alle unsere zusätzlichen Komponenten liegen, die zugekauft wurden und wo auch ein Suchpfad existiert.

Ich installiere das Paket und öffne ein anderes Projekt. Dort sehe ich das neue Edit auch in der Toolpalette. Dann ziehe ich es auf mein Form und im Designer erscheint es augenscheinlich auch mit den angepassten Eigenschaften. Ebenso wird in den Uses meine neue Unit eingetragen. Das ist allerdings rot unterstrichen und ich kann nicht kompilieren, weil er angeblich keine DCU findet.

Unter "C:\***\Documents\RAD Studio\Projekte\Win32\Debug" habe ich eine DCU gefunden, die den Namen meines Edits trägt und habe die in den Ordner kopiert, wo auch die PAS liegt, aber das Problem besteht weiterhin. Keine Ahnung was ich jetzt machen soll.

Edit:
Ich habe es jetzt geschafft, dass die DCU in das Verzeichnis erzeugt wird, wo auch die PAS liegt. Das ist schon mal gut. Dennoch bekomme ich die Meldung, dass der Unit-Name nicht aufgelöst werden kann und beim Erzeugen wird mir gesagt, dass die DCU nicht gefunden werden kann. Als Suchpfad habe ich in meinem Projekt aber den Überordner des Ordners angegeben, wo die DCU tatsächlich liegt... :(

Edit 2:
Habe es hinbekommen. Ich musste den Ordner auch noch mal unter Tools/Optionen in den Bibliothekspfad eingeben. Leider werden die Änderungen mit Edit-Höhe und Schriftgröße nicht übernommen... aber das bekomme ich auch noch hin :D Bis jetzt habe ich in der abgeleiteten Komponente ein Construktor angelegt und in diesem die Werte gesetzt. Eventuell muss es noch einen anderen Weg geben den Defaultwert von Properties in einer abgeleiteten Komponente zu setzen.

Getox 8. Mär 2019 12:28

AW: Properties bei Ableitung verschieben
 
Ich schreibe einfach einen neuen Post, damit das neue Anliegen nicht übersehen wird, weil es nur ein Edit gewesen wäre:

Ich habe jetzt ein Edit, dass ich von TCustomEdit abgeleitet habe. Dieses soll einfach erstmal nur 2 winzige Änderungen haben und daran scheitert es schon:
- Höhe von 24
- Ctl3D auf False

Ich habe schon vieles Versucht und es hat einfach nie Auswirkungen.

Code:
type
  TTextEdit = class(TCustomEdit)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
    property Height default 24;
    property Ctl3D default False;
  end;
Code:
type
  TTextEdit = class(TCustomEdit)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
    property Height stored True default 24;
    property Ctl3D stored True default False;
  end;
Code:
type
  TTextEdit = class(TCustomEdit)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor create(AOwner: TComponent);
  published
    { Published-Deklarationen }
    property Height default 24;
    property Ctl3D default False;
  end;

constructor TTextEdit.create(AOwner: TComponent);
begin
  inherited;
  Height := 24;
  Ctl3D := False;
end;
Code:
type
  TTextEdit = class(TCustomEdit)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor create(AOwner: TComponent);
  published
    { Published-Deklarationen }
    property Height stored True default 24;
    property Ctl3D stored True default False;
  end;

constructor TTextEdit.create(AOwner: TComponent);
begin
  inherited;
  Height := 24;
  Ctl3D := False;
end;
Wo liegt mein Fehler oder was übersehe ich?

Fritzew 8. Mär 2019 12:46

AW: Properties bei Ableitung verschieben
 
Der constructor ist virtuell. Du musst Ihn mit override deklarieren.

Eigentlich gibt Dir der Compiler dazu eine Warnung aus:

W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomEdit'

Delphi-Quellcode:
 public
    { Public-Deklarationen }
    constructor create(AOwner: TComponent); override;

Getox 8. Mär 2019 13:45

AW: Properties bei Ableitung verschieben
 
Zitat:

Zitat von Fritzew (Beitrag 1427332)
Der constructor ist virtuell. Du musst Ihn mit override deklarieren.

Eigentlich gibt Dir der Compiler dazu eine Warnung aus:

W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomEdit'

Delphi-Quellcode:
 public
    { Public-Deklarationen }
    constructor create(AOwner: TComponent); override;

Das hat tatsächlich geklappt. Ctl3D ist nun ausgeschaltet. Die Höhe ist auch nicht mehr 22 sondern 23. Aber ich habe 24 eingestellt. Das ist seltsam. Auch wenn ich das auf 25 setze ist es im Endeffekt auf 23, als sei da eine maximale Höhe gesetzt...

Edit: Klappt jetzt. Danke erstmal :D


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