Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Eigenes TabSheet mit PageControl als Owner
GerhardS - Mi 26.02.14 02:31
Titel: Eigenes TabSheet mit PageControl als Owner
Ich möchte ein selbst erzeugtes TabSheet (mit einem CloseButton) zusammen mit einem Standard-PageControl benutzen.
Allerdings erzeugt dieser Code den Fehler "Deklaration von Create unterscheidet sich von vorheriger Deklaration". Leider gibt's an dieser Stelle (direkt unter der Uses-Klausel) kein "vorherig".
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TCloseTabSheet=class(TTabSheet) private protected FCloseButtonRect: TRect; FOnClose: TNotifyEvent; procedure DoClose; virtual; public constructor Create(AOwner:TPageControl); override; destructor Destroy; override; property OnClose:TNotifyEvent read FOnClose write FOnClose; end; |
Ich brauche aber TPageControl als Owner, um später mit dieser Funktion zu arbeiten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function TForm1.CreateBrowserOnTab(pc: TPageControl): TCloseTabSheet; var wb: TWebBrowser; begin Result := pc.ActivePage; ... |
Gibt es eine Möglichkeit, TPageControl mit zwei verschiedenen TabSheets zu verbinden?
jaenicke - Mi 26.02.14 06:46
Schau dir einmal an wie du einen Typ in einen anderen castest. Dafür brauchst du is und as als Operatoren:
http://docwiki.embarcadero.com/RADStudio/XE5/de/Klassenreferenzen#Der_Operator_is
Der Konstruktor von TTabSheet hat als Owner den übergeordneten Typ TComponent. Da du den überschreibst, kannst du den Typ dort auch nicht ändern. Du kannst aber jederzeit mit as auf TPageControl casten.
Und genauso kannst du auch ActivePage auf TCloseTabSheet casten.
Leider habe ich im Moment nicht die Zeit das genauer zu erklären. Schau dir am besten einmal die Grundlagen objektorientierter Programmierung an. Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var a: TAuto; begin a := TMercedes.Create; ShowMessage((a as TMercedes).SternGröße); |
Sprich TMercedes ist von TAuto abgeleitet und die Instanz von TMercedes wird in TAuto gelegt. Dann kann man allgemein als TAuto (wie bei dir mit TTabSheet) damit arbeiten. Braucht man dann Eigenschaften von TMercedes, muss man auf den Typ casten.
GerhardS - Mi 26.02.14 19:41
Scheint doch nicht so ganz trivial zu sein. Jedenfalls akzeptiert der Compiler keine der folgenden Zeilen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| Result := (TPageControl as TCloseTabSheet).Create(PageControl1); Result := (TCloseTabSheet as pc).ActivePage; Result := (TCloseTabSheet as TTabSheet).ActivePage; Result := (pc as TPageControl).ActivePage; Result := (TCloseTabSheet as TTabSheet).PageControl.ActivePage; |
jaenicke - Mi 26.02.14 19:51
Überleg doch mal...
Du möchtest doch nur den Rückgabewert casten, sonst nichts. Du castest aber das Objekt vorne, mit dem du arbeitest, oder eine Klasse in eine andere (noch dazu das PageControl statt des TabSheets)...
Also:
Delphi-Quelltext
1:
| Result := pc.ActivePage as TCloseTabSheet; |
GerhardS - Mi 26.02.14 22:09
Danke.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!