Hallo,
Habe ein Programm geschrieben mit sehr vielen Formularen, da ich die Formulare ab und an ändern muß nervt es immer wieder alle User aus dem Programm zu schmeissen nur damit man die Exe Updaten kann, zudem ist die Exe schon 10MB groß.
Ich dachte ich baue es dann zu einem Modularen System um. Habe es mir wohl etwas leichter vorgestellt und stehe natürlich vor einem Problem. Ich lade beim Starten des Programmes Benutzer, Kunden, Artikel jeweils vor über ein Objekt in eine Objectlist.
Delphi-Quellcode:
type
TArtikel = class(TObject)
private
FArtikel: Integer;
FKey: Integer;
FName: String;
FFirma: Integer;
FMandant: Integer;
FName2: String;
FHersteller: String;
FLagerort: String;
FGebinde: String;
procedure SetKey(const Value: Integer);
procedure SetName(const Value: String);
procedure SetArtikel(const Value: Integer);
procedure SetFirma(const Value: Integer);
procedure SetMandant(const Value: Integer);
procedure SetName2(const Value: String);
procedure SetHersteller(const Value: String);
procedure SetLagerort(const Value: String);
procedure SetGebinde(const Value: String);
public
property Artikel: Integer read FArtikel write SetArtikel;
property Name: String read FName write SetName;
property Name2: String read FName2 write SetName2;
property Firma: Integer read FFirma write SetFirma;
property Mandant: Integer read FMandant write SetMandant;
property Hersteller: String read FHersteller write SetHersteller;
property Lagerort: String read FLagerort write SetLagerort;
property Gebinde: String read FGebinde write SetGebinde;
property Key: Integer read FKey write SetKey;
end;
type
TWWArtikel = class(TObject)
private
FList: TObjectList;
function GetArtikel(Index: Integer): TArtikel;
public
constructor Create(Conn: TZConnection);
destructor Destroy; override;
function Count: Integer;
property Artikel[Index: Integer]: TArtikel read GetArtikel;
function FindArtikel(ArtikelNr: Integer; var Index: Integer): Boolean;
end;
...
function TWWArtikel.GetArtikel(Index: Integer): TArtikel;
begin
Result := (FList.Items[Index]) as TArtikel;
end;
Ich nutze FastMM und übergebe eine Instanz TWWArtikel an die
DLL, Das übergeben ansicht funktioniert auch ich kann z.B. auf den Count zugreifen aber sobald ich versuche einen Eintrag aus der Liste zu holen gibt es eine
Exception "Ungültige Typenumwandlung"
Gibt es eine Möglichkeit das ich das Überhaupt so nutzen kann in DLLs oder hat es doch eher wenig Sinn?
Definition
Delphi-Quellcode:
type
TPluginType = (ptDevelop, ptFinal, ptTesting);
type
TPluginInfo = record
Name: PChar;
Author: PChar;
SDescription: PChar;
PluginType: TPluginType;
end;
type
TPluginGetInfo = function: TPluginInfo; stdcall;
TPluginMenuCaption = function: PChar; stdcall;
TPluginNumMainOptions = function: Integer; stdcall;
TPluginNumOptions = function: Integer; stdcall;
TPluginGetOption = function(N: Integer): PChar; stdcall;
//TPluginExecute = procedure(Datum: TDate; Customers: TPCustomers; DBUsers: TPDBUsers; WWArtikel: TPWWArtikel); stdcall;
TPluginExecute = procedure(Datum: TDate; Customers: TCustomers; DBUsers: TDBUsers; WWArtikel: TWWArtikel); stdcall;
TPluginInit = function(FW_Data: TZConnection; Unix: TZConnection;
PTV: TZConnection): boolean; stdcall;
Ausführen des Moduls
Delphi-Quellcode:
procedure TPluginManager.ClickEvent(Sender: TObject);
var
Index: Integer;
Lib: Thandle;
APlugin: TPlugin;
APluginExecute: TPluginExecute;
APluginInit: TPluginInit;
begin
Index := (Sender as TCustomAdvPanel).Tag;
APlugin := (Self.Plugin(Index));
if not FileExists(Self.FPluginDir + APlugin.Filename) then begin
Self.FErrorEventForm.SetErrorEX(Self, 'Frachtverwaltung - Modulmanager', 'Modul ist nicht mehr vorhanden');
Exit;
end;
Lib := LoadLibrary(PChar(Self.FPluginDir + APlugin.Filename));
if Lib = 0 then begin
Self.FErrorEventForm.SetErrorEX(Self, 'Frachtverwaltung - Modulmanager', 'Modul konnte nicht geladen werden');
Exit;
end;
@APluginInit := GetProcAddress(Lib, 'Init');
@APluginExecute := GetProcAddress(Lib, 'Execute');
if (@APluginInit = nil) or (@APluginExecute = nil) then begin
Self.FErrorEventForm.SetErrorEX(Self, 'Frachtverwaltung - Modulmanager', 'Moduladressen wurden nicht gefunden');
Exit;
end;
if not APluginInit(Self.FFW_Data, Self.FUnix, Self.FPTV) then begin
Self.FErrorEventForm.SetErrorEX(Self, 'Frachtverwaltung - Modulmanager', 'Initialisierung des Moduls nicht möglich');
Exit;
end;
try
APluginExecute(Self.FDatum, FCustomers, FDBUsers, FWWArtikel);
except
Self.FErrorEventForm.SetErrorEX(Self, 'Frachtverwaltung - Modulmanager', 'Beim starten des moduls trat ein Fehler auf');
end;
FreeLibrary(Lib);
end;
Execute in der
DLL
Delphi-Quellcode:
procedure Execute(Datum: TDate; Customers: TCustomers; DBUsers: TDBUsers; WWArtikel: TWWArtikel); stdcall;
begin
ShowMessage(Customers.Customer[10].KdNr);
FDatum := Datum;
try
Frachtauftraege_Frm := TFrachtauftraege_Frm.Create(Frachtauftraege_Frm);
Frachtauftraege_Frm.ZQry.Connection := FFW_Data;
Frachtauftraege_Frm.ZQuery2.Connection := FFW_Data;
Frachtauftraege_Frm.ZQuery3.Connection := FFW_Data;
Frachtauftraege_Frm.Anzeigen(FDatum, FCustomers);
except
Frachtauftraege_Frm.Free;
end;
end;
Gerade das Laden der Artikel im vorraus erspart mir natürlich so einiges an Arbeit in den einzelnen Formularen und vorallem Zeit, da ich nicht sändig die Datenbank durchsuchen muss.
Vielleicht kann mir hier jemand bei meinem Problem helfen
Gruß
Cyberaxx