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?