Thema: Delphi Problem mit Vererbung

Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Problem mit Vererbung

  Alt 1. Okt 2007, 17:20
Ich wollte folgende Grundkronstruktion verwenden:
Delphi-Quellcode:
TTab = class(TObject)
private
  FSheet: TTabSheet;
  FTabs : TTabs;

  procedure SetSheet(const Value: TTabSheet);
published
  property Sheet : TTabSheet read FSheet write SetSheet;
  property Tabs : TTabs read FTabs;
public
  constructor Create(const APageControl : TPageControl);
  destructor Destroy;
end;
Nun soll es davon 2 verschiedene Tabtypen geben:
Delphi-Quellcode:
TMemoTab = class(TTab)

end;

TExplorerTab = class(TTab)

end;
Funktioniert soweit.
Nun habe ich auch eine Liste:
Delphi-Quellcode:
TTabs = class(TObject)
private
  FTabs : TObjectList;
end;
Nun soll TTab keine Funktionen haben.
Also habe ich alle Funktionen als "virtual; abstract;" bezeichnet.

Wenn ich nun der Tabliste ein Tab hinzufüge mit folgender Funktion:
Delphi-Quellcode:
procedure TTabs.Add(const ATab: TTab);
begin
  FTabs.Add(ATab);
  ATab.FTabs := self;
end;
Dann gibt es dort einen Abstrakten Fehler.

Wenn ich nun die nicht als abstrakt bezeichne und "Quasileerfunktionen" einsetze, dann habe ich das Problem in der Add-Funktion, ATab nicht mehr "aktuell" ist.
Folgender Aufruf (Tabs : TTabs):
Tabs.Add(TExplorerTab.Create(pcTabs, CreatePath(Node))); Alles wunderbar... Jedenfalls scheint es so.
Wenn ich jetzt in der Add-Methode die Caption des TabSheets ändere, dann hat es keine Auswirkungen:
Delphi-Quellcode:
procedure TTabs.Add(const ATab: TTab);
begin
  FTabs.Add(ATab);
  ATab.FSheet.Caption := 'BOM!';
  // Oder auch so (Die Add-Methode darüber wird entfernt):
  (FTabs.Items[FTabs.Add(ATab)] as TTab).FSheet.Caption := 'BOM!';

  ATab.FTabs := self;
end;
Wo liegt nun der Fehler?
Wenn ihr noch Informationen braucht, dann sagt bitte welche, damit ich die nachliefern kann

MfG
xZise

PS: Die TTabs Klasse:
Delphi-Quellcode:
TTabs = class(TObject)
private
  FTabs : TObjectList;
  FIcons : TIconList;
  FFileToolBar: TToolBar;
  FDirectoryToolBar: TToolBar;

  function GetTab(idx: Integer): TTab;
  procedure SetTab(idx: Integer; const Value: TTab);
public
  property Tab[idx : Integer] : TTab read GetTab write SetTab;
  property FileToolBar : TToolBar read FFileToolBar write FFileToolBar;
  property DirectoryToolBar : TToolBar read FDirectoryToolBar write FDirectoryToolBar;

  procedure Add(const ATab : TTab);
  procedure Delete(const AIndex : Integer);

  constructor Create;
  destructor Destroy; override;
end;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat