AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit Vererbung

Ein Thema von xZise · begonnen am 1. Okt 2007 · letzter Beitrag vom 3. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
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
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Problem mit Vererbung

  Alt 1. Okt 2007, 18:13
Zitat von xZise:
Nun habe ich auch eine Liste:
Delphi-Quellcode:
TTabs = class(TObject)
private
  FTabs : array of TTab;
end;
Das ist keine Liste. Nimm doch TObjectList aus Unit contnrs!
Andreas
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

Re: Problem mit Vererbung

  Alt 1. Okt 2007, 18:30
außerdem hats du in TTab bereits FTabs deklariert, vielleicht kommt da was durcheinander?
Karl-Heinz
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

Re: Problem mit Vererbung

  Alt 1. Okt 2007, 20:33
Zitat von shmia:
Zitat von xZise:
Nun habe ich auch eine Liste:
Delphi-Quellcode:
TTabs = class(TObject)
private
  FTabs : array of TTab;
end;
Das ist keine Liste. Nimm doch TObjectList aus Unit contnrs!
OOPs ^^ Nein Es ist ja gerade eine ObjectListe

Zitat von Progman:
außerdem hats du in TTab bereits FTabs deklariert, vielleicht kommt da was durcheinander?
Genau dieses FTabs will ich haben
Damit der Tab nachher "weis" in welcher Liste der gehört, um selber für die Tabliste Tabs zu erzeugen.

Hier ist nochmal TTabs ^^
Delphi-Quellcode:
TTabs = class(TObject)
private
  FTabs : TObjectList;
  FIcons : TIconList; // wird nicht verwendet
  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
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Problem mit Vererbung

  Alt 2. Okt 2007, 10:21
Zitat von xZise:
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.
Nur, wenn du eine TTab Instanz übergibst anstatt z.B. einer TExplorerTab Instanz.

Zitat von xZise:
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;
Wird denn im Constructor von TTab auch ordentlich FSheet entsprechend belegt mit auch der Instanz wo du die Caption Änderung erwartest?

Das vergessene Override beim Destruktor hast du ja nun schon ergänzt...
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

Re: Problem mit Vererbung

  Alt 2. Okt 2007, 13:56
Hi,
Zitat von Muetze1:
Zitat von xZise:
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.
Nur, wenn du eine TTab Instanz übergibst anstatt z.B. einer TExplorerTab Instanz.
Aber warum funktioniert das denn nicht? TExplorerTab ist do ein Nachfahre von TTab? Müsste ich also die Funktio überladen?
Weil bei TStrings funktionierts ja auch
Delphi-Quellcode:
var
  sl : TStrings;
begin
  {...}
  sl := TStringList.Create;
  ini.ReadSections(sl);
  {...}
end;
Zitat von Muetze1:
Zitat von xZise:
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;
Wird denn im Constructor von TTab auch ordentlich FSheet entsprechend belegt mit auch der Instanz wo du die Caption Änderung erwartest?
Nein, aber der Konstruktor von TExplorer/MemoTab, welche ich ja ausschließlich übergebe.

Zitat von Muetze1:
Das vergessene Override beim Destruktor hast du ja nun schon ergänzt...
Selbst wenn würde es keinen Fehler verursachen, da Explizit nirgends .Free aufgerufen wird.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Problem mit Vererbung

  Alt 2. Okt 2007, 15:04
Zitat von xZise:
Aber warum funktioniert das denn nicht? TExplorerTab ist do ein Nachfahre von TTab? Müsste ich also die Funktio überladen?
Die Exception wird geschmissen, wenn es auch nur eine noch abstracte Methode in der Klasse gibt. Also: hast du wirklich alle abstracte Methoden überschrieben (und implementiert)?

Zitat von xZise:
Nein, aber der Konstruktor von TExplorer/MemoTab, welche ich ja ausschließlich übergebe.
Wenn du eine AV bekommst, dann schau im Debugger nach, was den nil ist. Also ob fSheet wirklich assigned ist etc. Auch kannst du bei unklarer Gesamtlage mit Debug-DCUs dein Projekt neu erstellen und dann in die VCL debuggen um zu schauen wo die Exception herkommt.

Zitat von xZise:
Selbst wenn würde es keinen Fehler verursachen, da Explizit nirgends .Free aufgerufen wird.
Kein Fehler, nur (ein) Speicherleck(s)...
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

Re: Problem mit Vererbung

  Alt 2. Okt 2007, 15:11
Zitat von Muetze1:
Zitat von xZise:
Aber warum funktioniert das denn nicht? TExplorerTab ist do ein Nachfahre von TTab? Müsste ich also die Funktio überladen?
Die Exception wird geschmissen, wenn es auch nur eine noch abstracte Methode in der Klasse gibt. Also: hast du wirklich alle abstracte Methoden überschrieben (und implementiert)?
Das Hauptproblem ist selbst ohne abstrakten Methoden funktioniert das nicht Oder müssen die nun abstrakt sein, damit er auch die richtige Methode aufruft?

Zitat von Muetze1:
Zitat von xZise:
Nein, aber der Konstruktor von TExplorer/MemoTab, welche ich ja ausschließlich übergebe.
Wenn du eine AV bekommst, dann schau im Debugger nach, was den nil ist. Also ob fSheet wirklich assigned ist etc. Auch kannst du bei unklarer Gesamtlage mit Debug-DCUs dein Projekt neu erstellen und dann in die VCL debuggen um zu schauen wo die Exception herkommt.
Laut Debugger ist in der AddFunktion "FSheets" und ehm "FTabs" nil

Zitat von Muetze1:
Zitat von xZise:
Selbst wenn würde es keinen Fehler verursachen, da Explizit nirgends .Free aufgerufen wird.
Kein Fehler, nur (ein) Speicherleck(s)...
Achso Naja die Speicherlecks kann man nur beheben, wenn es funktioniert xD

So ! Ich habe jetzt TTab komplett "deabstrahiert" xD und die Add Methode überladen (mit TMemoTab und TExplorerTab)
So funktionierts, aber das war nicht der Zweck des Vererben

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Problem mit Vererbung

  Alt 2. Okt 2007, 15:20
Zitat von xZise:
Das Hauptproblem ist selbst ohne abstrakten Methoden funktioniert das nicht Oder müssen die nun abstrakt sein, damit er auch die richtige Methode aufruft?
Was bedeutet dabei nun "funktioniert nicht"? Wenn ich wieder auf die alte Aussage schliesse (abstrakter Fehler), dann kann dies in dem Falle nicht mehr sein.

Zitat von xZise:
Laut Debugger ist in der AddFunktion "FSheets" und ehm "FTabs" nil
Dann wird nicht der richtige Constructor aufgerufen. Somit ist die Frage von inherited etc. gegeben. Schonmal den Konstruktoraufruf im Add() debuggt? Wenn du in die Zeile mit F7 hineinstoperst, dann solltest du durch den entsprechenden Konstruktor (nach dem die Ermittlung der Parameter abgehandelt wurde) kommen, welcher dann nach deinem Quellcode und Aussagen doch eigentlich FSheets und FTabs initialisiert. Wenn dem nicht so ist, dann ist das nicht der Constructor. (wobei ich die Konstruktoren von den beiden abgeleiteten Klassen nicht kenne)

Zitat von xZise:
So ! Ich habe jetzt TTab komplett "deabstrahiert" xD und die Add Methode überladen (mit TMemoTab und TExplorerTab)
So funktionierts, aber das war nicht der Zweck des Vererben
Das ist auch nicht das gewollte und dein vorgestelltes Konzept klappt auch 100%ig so wie du es vorhast. Es ist ein anderes Problem. Diese Lösung musst du nicht weiter verfolgen/benutzen.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#10

Re: Problem mit Vererbung

  Alt 2. Okt 2007, 15:28
Meine Glaskugel meint, es könnten n paar override; fehlen...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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