AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VCL Komponente unterschiedlich ableiten

Ein Thema von Ralle1 · begonnen am 24. Mär 2014 · letzter Beitrag vom 26. Mär 2014
Antwort Antwort
Ralle1

Registriert seit: 2. Nov 2011
49 Beiträge
 
Delphi XE3 Professional
 
#1

VCL Komponente unterschiedlich ableiten

  Alt 24. Mär 2014, 15:38
Hallo,

Ich plane in einer größeren Anwendung grafische Elemente wie z.B. TPageControl durch modern wirkende Komponenten aus dem Hause TMS auszutauschen.
Der Austausch soll dabei möglichst zentral passieren. Im 1. Schritt habe ich eine leere Komponente erstellt: TMyPageControl 1:1 abgeleitet von TPageControl.
Dies habe ich zentral ausgetauscht und könnte diese nun im nächsten Schritt anderweitig ableiten (von TAdvOfficePager).

Um dies zentral zu steuern und erst nach kompletter Fertigstellung zu aktivieren, habe ich es mit einer bedingten Compilierung geschaltet. Sieht etwas so:
Delphi-Quellcode:
type
  {$IFDEF CLASSIC_CONTROL}
  TMyPageControl = class(TPageControl)
  {$ELSE}
  TMyPageControl = class(TAdvOfficePager)
  {$ENDIF}
    { Private-Deklarationen }
    //...
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy;
  end;
Nun meine Frage:
Kann man dies auch irgendwie zur Laufzeit ohne Compilerschalter hinbekommen?
Also praktisch ein PageControl dass sowohl TPageControl als auch TAdvOfficePager darstellen kann. Wie wäre Euer Ansatz zu dieser Lösung?

Besten Dank schonmal für eure Anregungen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: VCL Komponente unterschiedlich ableiten

  Alt 24. Mär 2014, 16:03
Kann man dies auch irgendwie zur Laufzeit ohne Compilerschalter hinbekommen?
Jain.
Man kann eine Container-Typen erstellen, welcher dann intern den gewünschten Typen erstellt ... siehe z.B. TPicture (im TImage), welches in seinem .Graphic entweder ein TBitmap, TJpegImage, TPngImage oder sonstwas behandeln kann.


Zur Laufzeit brauchst du beide Typen (vollständig als eigene Typen deklariert)
und da könntest du dann beim Erstellen entscheiden von welchem Typ erstellt werden soll. (also der Container, wo dann das Gewünschte reingemacht wird)

Oder man nutzt ein Designtime-Package mit dem einem Typ und für's Kompilieren einen Quellcode mit dem anderen Typ, bzw. den anderen Typ in einem Runtime-Package.



Warum nicht direkt gleich den gewollten Typen verwenden?
Man kann natürlich mit einem Typen entwickeln und den später austauschen, aber auch nur, wenn die Property kompatibel sind.
Denn wenn die DFMs z.B. mit deim einem Typen erstellt wurden, dann knallt es, wenn man Diese dann mit dem anderem Typen versucht zu laden und er eines der Property nicht kennt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Mär 2014 um 16:13 Uhr)
  Mit Zitat antworten Zitat
Ralle1

Registriert seit: 2. Nov 2011
49 Beiträge
 
Delphi XE3 Professional
 
#3

AW: VCL Komponente unterschiedlich ableiten

  Alt 25. Mär 2014, 09:56
Das sind so ziemlich genau auch meine Gedankengänge gewesen, nur hatte ich gehofft, dass mich jemand auf einen neuen Ansatz bringt.
Leiten wir also von dem gewünschten Typen ab, in meinem Beispiel also:
Delphi-Quellcode:
type
  TMyPageControl = class(TAdvOfficePager)
Nun noch eine Frage:
Komponente wie diese AdvOfficePager liefern eine Fülle an speziellen Properties.
Sollte ich irgendwann auf die Idee kommen, nun doch von einem Pagecontrol eines anderen Anbieters abzuleiten, habe ich den ganzen Kram in meinen dfm's verteilt.
Gibt es eine elegante Möglichkeit sicherzustellen, dass TMyPageControl auch nur die Properties verfügbar macht, die ich wirklich benutzen möchte und auch anderen Entwicklern am Projekt zur Nutzung erlauben möchte?

Ich möchte also in meiner Ableitung eine property unsichtbar machen, die im Vorfahr bereits als "published" veröffentlicht wurde.
Ein einfaches erneutes Definieren im private Bereich hilft leider nicht. Geht das?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: VCL Komponente unterschiedlich ableiten

  Alt 25. Mär 2014, 10:01
Man kann Sichtbarkeiten nur erhöhen, verringern geht nicht. Das ist auch der Grund für die vielen TCustomXXX-Klassen in der VCL. Dort sind viele Eigenschaften protected deklariert, die abgeleiteten Klassen erhöhen die Sichtbarkeit dann zu public/published.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: VCL Komponente unterschiedlich ableiten

  Alt 25. Mär 2014, 16:51
In der Praxis hättest du mit deinem Ansatz mehr Arbeit als wenn du nur Formular für Formular die Standardkomponente durch deine neue Komponente ersetzt.
Wenn Delphi einen Macroprozessor wie z.B. LISP hätte dann liese sich sicher etwas machen.
So aber ist das direkte Ersetzen der Komponente der beste Weg.
fork me on Github
  Mit Zitat antworten Zitat
Ralle1

Registriert seit: 2. Nov 2011
49 Beiträge
 
Delphi XE3 Professional
 
#6

AW: VCL Komponente unterschiedlich ableiten

  Alt 26. Mär 2014, 15:57
Dem stimme ich komplett zu.

Wenn aber doch nur das Verringern von Sichtbarkeiten möglich wäre, könnte ich meine Komponente wesentlich kompakter machen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#7

AW: VCL Komponente unterschiedlich ableiten

  Alt 26. Mär 2014, 16:09
TCustomPageControl und eventuell gibt's auch einen passenden Vorfahren von TAdvOfficePager.

PS: stored False


[edit]
TCustomPageControl gibt es nicht.
Dafür zwar ein TCustomTabControl, als direkter Vorfahre von TPageControl, aber dort fehlen noch viele Eigenschaften und Methoden, welche erst direkt in TPageControl implementiert wurden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Mär 2014 um 16:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:48 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