Hallo Gemeinde,
Intention:
Ich versuche ein Programm zu schreiben, welches mir PlugIns (
BPL-Packages) einbindet. Dadurch kann ich alle Funktionen in einzelne Packages auslagern und nur die gemeinsame Steuerung (
TNA-Symbol, Mainform, Hotkeys usw. usf.) durch das Hauptform erledigen lassen. Dies stelle ich mir so vor: der User möchte das ein .bpl eingebunden wird (also ein entsprechender Eintrag in der Inidatei vorhanden ist). Dann wird aus der
Package mit (z.B.) dem Namen 'PlugIn.bpl' automatisch der Frame 'TPlugInFrame' durch GetClass angefordert und in ein dynamisch erstellte TTabControl eingebettet. Hier nun soll der Bneutzer damit arbeiten können.
Ich bin soweit, das ich ohne Probleme eine Form einbinden kann, darstellen und mit dieser Arbeiten kann. -> SplashScreen (mit Stringliste, welche den Fortschritt anzeigt)
Auch das Frame klappt, aber nicht zu 100%: es wird geladen, eine TTabSheet erzeugt und das Frame dort hineinplatziert. Auch ein möglicher Button reagiert auf Benutzereingaben -> MessageBox 'OK' erscheint.
Wenn ich aber versuche vom Frame zur Form.OnCreate auf den Owner zuzugreifen dann habe ich Probleme (hier mal ein Ausschnitt ausm Code)
Source befindet sich in der EXE:
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var
Preferences: TAEJPrefSection;
PlugInList: TStringList;
i: Integer;
aClass: TPersistentClass;
aSheet: TTabSheet;
aFrame: TFrame;
p: procedure (Sender: TObject; Sheet: TTabSheet);
function GenFrameClassName (Name: String): String;
begin
Result := 'T' + ChangeFileExt (ExtractFileName (Name), 'Frame');
end;
begin
// SIT: Identifikation
// * Die Übernahme des gemeinsam benutzen ProgrammNamens erfolgt, damit beim
// erneuten Starten des Programms das Prog./Formular gefunden werden kann!
Application.Title := cProgrammName;
// Erstellen der Zugriffsseite
Preferences := CommonData.RegisterPrefSection ('General');
PlugInList := TStringList.Create;
Preferences.ReadStringList ('PlugIn', PlugInList);
// PlugIn (PI): Laden aller PlugIns
// * die zu Ladenden PlugIns sind in der IniFile-Sektion 'General' gelistet
// * jedes PlugIn hat einen Frame
for i := 0 to PlugInList.Count - 1 do begin
aClass := CommonData.GetClassOfModule (GenFrameClassName (PlugInList.Strings[i]), PlugInLIst.Strings[i]);
if (aClass <> nil) then begin
aSheet := TTabSheet.Create (tpcMain);
aFrame := TComponentClass(aClass).create (aSheet) as TFrame;
aSheet.InsertControl (aFrame);
aSheet.PageControl := tpcMain;
p := aFrame.MethodAddress ('InitPlugIn');
if Assigned (p) then
p (self, aSheet);
end;
end;
PlugInList.Free;
end;
Source der
Package:
Delphi-Quellcode:
unit uAbout;
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, uCommon;
type
TAboutFrame =
class(TFrame)
Button1: TButton;
procedure InitPlugIn (Sender: TObject; Sheet: TTabSheet);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
implementation
{$R *.dfm}
procedure TAboutFrame.InitPlugIn (Sender: TObject; Sheet: TTabSheet);
begin
if (Sheet <>
nil)
then begin
Sheet.Caption := '
About Dialog';
end;
end;
procedure TAboutFrame.Button1Click(Sender: TObject);
begin
if (Owner
is TTabSheet)
then (Owner
as TTabSheet).Caption := '
About Dialog';
end;
initialization
RegisterClass (TAboutFrame);
finalization
UnregisterClass (TAboutFrame);
end.
Ich habe schon vom Owner gewechselt auf Sheet durch Erweiterung der Prozedur:
p: procedure (Sender: TObject; Sheet: TTabSheet);
aber auch hier bekomme ich Fehler wenn ich auf Sheet.Caption zugreife --> NICHTS PASSIERT, da Sheet = nil
Wenn ich zur "interaktiven Laufzeit" (nach Form.OnCreate) auf Owner zugreife passiert das Erwartete...
Ich hoffe ich konnte begreiflich machen, wo mein Problem liegt.
Kann mir jemand damit helfen - oder gehe ich gar den falschen Weg,
Alex