AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Create wird nicht aufgerufen bei Klassen-Chaos
Thema durchsuchen
Ansicht
Themen-Optionen

Create wird nicht aufgerufen bei Klassen-Chaos

Ein Thema von glkgereon · begonnen am 13. Jan 2006 · letzter Beitrag vom 14. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 19:20
Hi

ich schreibe grade an einer Importer-Klasse...
Diese soll möglichst einfach erweiterbar sein, daher habe ich mir folgendes Konzept ausgedacht:
Eine virtuelle Basisklasse, und mehrere Klassen, die diese Implementieren, für jeden Datentyp einen.

Code:
Delphi-Quellcode:
type
  TImport_Virtual = class(TObject)
  private //Basisklasse für ImportTyp
    FFileName: String;
    FFileExt: String;
  public
    FData: TDataArray;
    function OpenFile(var Err: String):Boolean; virtual; abstract;
    function CloseFile(var Err: String):Boolean; virtual; abstract;
    function Analyse(var Err: String):Boolean; virtual; abstract;
    function GetData(var Dat: TDataArray):Boolean;
    property FileName: String read FFileName write FFileName;
  end;

  TImportClassType = class of TImport_Virtual;

  TDBFImport = class(TImport_Virtual)
  private //Import aus DBF-Datei
    FDBF: TDBFFile;
  public
    constructor Create;
    destructor Destroy;
    function OpenFile(var Err: String):Boolean; override;
    function CloseFile(var Err: String):Boolean; override;
    function Analyse(var Err: String):Boolean; override;
  end;


type
  TImport = TImport_Virtual;
Als erstes die Basisklasse, dann eine Implementation für ein DBF-File.

So rufe ich das ganze auf:
Delphi-Quellcode:
Typ:=GetImportType(Edt_FileName_Man.FileName);
    if Typ=nil then
      begin
      Log('Importer laden',True,cEFileExt);
      Exit;
      end
    else
      Log('Importer laden',False,'');

    Import:=Typ.Create;
GetImportType gibt den zu der Endung passenden Importer zurück...das klapp auch. in Classname steht auch TDBFImport drin!
Delphi-Quellcode:
  TImportType = record //Import-Typ
    Import: TImportClassType;
    FileExt: String;
    Description: String;
  end;

  TImportArray = array[0..0] of TImportType;

const //Import-Typen
  cImports: TImportArray = (
  (Import: TDBFImport; FileExt: '.dbf'; Description: 'DBF-Datei')
  );

function GetImportType(FileName: String): TImportClassType;
var Ext: String;
    i, ID:Integer;
begin
  Ext:=LowerCase(ExtractFileExt(FileName));
  ID:=-1;
  for i:=0 to Length(cImports)-1 do
    if LowerCase(cImports[i].FileExt)=Ext then ID:=i;
  if ID=-1 then
    Result:=nil
  else
    Result:=cImports[ID].Import;
end;
Nun setze ich im OnCreate der Implementation FFileExt auf die jeweilige Endung (hier '.dbf')
Allerdings wird dieses Create nie aufgerufen!

hat irgendeiner eine Idee warum das so ist?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 19:40
Ich habe keine Ahnung was du da machst, aber wäre ein override beim Konstruktor vielleicht hilfreich?

Edit: Oh, beim Destruktor auf jeden Fall!

MfG
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 19:47
Genau. Aus diesem Grund ist auch der Konstruktor von TComponent virtuell.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:07
Geht nicht.

[Fehler] UImport.pas(36): E2170 Eine nichtvirtuelle Methode kann nicht überschrieben werden

und wenn ich in der Basisklasse auch ein virtual; abstract; Create einfüge, so kommt ein Abstrakter Fehler...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:15
Ganz sicher, dass in der Variable eine Klasse ungleich der Basisklasse ist und deren Konstruktor mit override markiert ist?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#6

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:17
Ja.

Typ.ClassName ist eindeutig TDBFImport.
Import.ClassName übrigens auch
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:21
Du hast mich so verunsichert, dass ich es selbst ausprobiert habe ^^ .
Delphi-Quellcode:
type
  TBase = class
  public
    constructor Create; virtual; abstract;
  end;

  TDescendant = class(TBase)
  public
    constructor Create; override;
  end;

  TBaseClass = class of TBase;
  
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  c: TBaseClass;
begin
  c := TDescendant;
  c.Create;
end;
Funktioniert wie erwartet .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:23
Oh, habe mich oben verschrieben. (ist jetzt korrigiert)
Ich meinte natürlich beim EDIT den Destruktor!

MfG
Thorsten
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:41
Es muss vor allem nur ein virtueller Constructor Create definiert werden in der TImport_Virtual - kein abstrakter!

Die Ableitungen müssen ihn überschreiben und dann wird dieser auch aufgerufen...
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#10

Re: Create wird nicht aufgerufen bei Klassen-Chaos

  Alt 13. Jan 2006, 20:47
Zitat von Muetze1:
Es muss vor allem nur ein virtueller Constructor Create definiert werden in der TImport_Virtual - kein abstrakter!

Die Ableitungen müssen ihn überschreiben und dann wird dieser auch aufgerufen...
Genau! Die Variable "Import" ist ja wohl vom Typ TImport_Virtual. Da TImport_Virtual den Construktor von TObject nicht überschreiben kann, ihn aber auch nicht verdeckt, wird halt TObject.Create aufgerufen.
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  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 16:24 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