Autor Beitrag
GerhardS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: Mi 26.02.14 02:31 
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".
ausblenden 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:TComponent); override; <-- kein Fehler
    constructor Create(AOwner:TPageControl); override//<-- Fehlermeldung
    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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function TForm1.CreateBrowserOnTab(pc: TPageControl): TCloseTabSheet;
var
  wb: TWebBrowser;
begin
   Result := pc.ActivePage; //ergibt: [DCC Fehler] Unit1.pas(202): E2010 Inkompatible Typen: 'TCloseTabSheet' und 'TTabSheet'
...

Gibt es eine Möglichkeit, TPageControl mit zwei verschiedenen TabSheets zu verbinden?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19325
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
docwiki.embarcadero....nzen#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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: Mi 26.02.14 19:41 
Scheint doch nicht so ganz trivial zu sein. Jedenfalls akzeptiert der Compiler keine der folgenden Zeilen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19325
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
Result := pc.ActivePage as TCloseTabSheet;					
GerhardS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: Mi 26.02.14 22:09 
Danke.