Warum versteht mich denn keiner?
Vielleicht bin ich zu Detailverliebt.
Ok, vergessen wir es. Mir ist heute etwas eingefallen, wie ich es vielleicht einfacher angehen könnte.
Jetzt mal rein hypothetisch:
- Datei > Neu > Anwendung = Form1
- Form1 + MyComponent
- Datei > Neu > Form = Form2
- Form2 + btnOK + btnCancel + txtUser + txtPass
- Im
OI unter Events von MyComponent ein doppelklick auf onInit
Unit MyComponent
Code:
...
type
TFormClass = class of TForm;
TInitEvent = procedure(Sender: TObject; DlgFormClass: TFormClass) of Object;
TMyComponent1 = class
private
FDlgFormClass: TFormClass;
FDialog: TForm;
FOnInit: TInitEvent;
procedure setAnmeldeDlg(value: TFormClass);
function getAnmeldeDlg: TFormClass;
public
constructor create;
destructor destroy;
procedure Init(Sender: TObject; DlgFormClass: TFormClass);
procedure Test;
published
property AnmeldeDlg: TFormClass read FDlgFormClass write FDlgFormClass;
property OnInit: TInitEvent read FOnInit write FOnInit;
end;
...
constructor TMyComponent1.create;
begin
inherited;
OnInit := self.Init;
end;
destructor TMyComponent1.destroy;
begin
if assigned(FDialog) then
FreeAndNil(FDialog);
inherited;
end;
procedure TMyComponent1.setAnmeldeDlg(value: TFormClass);
begin
FDlgFormClass := value;
end;
function TMyComponent1.getAnmeldeDlg: TFormClass;
begin
result := FDlgFormClass;
end;
procedure TMyComponent1.Init(Sender: TObject; DlgFormClass: TFormClass);
begin
...
self.setAnmeldeDlg(DlgFormClass);
...
end;
procedure TMyComponent1.Test;
begin
freeAndNil(FDialog);
try
if not Assigned(FDialog) then
begin
FDialog := FDlgFormClass.Create(application);
if assigned(FDialog) then
begin
FDialog.ShowModal;
end;
end;
Except
showMessage('error');
end;
end;
Unit Clientform
Code:
procedure TForm1.FormShow(Sender: TObject);
var
obj: TMyComponent1;
begin
obj := nil;
if not assigned(obj) then
obj := TMyComponent1.create;
if assigned(obj) then
begin
// Aufruf der Objekt Methode Init und übergabe der Parameter Sender und TForm3 als Klassenreferenz an die Komponente.
// Die anschliessende Instanzierung von TForm3 geschieht in der Komponente durch die Methode Test.
obj.Init(self, Tform3);
obj.Test;
obj.destroy;
end;
end;
Ich übergebe hier an die Komponente eine Klassenreferenz einer Form, damit der Nutzer dieser Komponente Gestaltungsfreiheit für den
Dialog zur Benutzerauthentifizerung hat.
Innerhalb der Komponente kann dann durch gekapselte Methoden auf die Form zugegriffen bzw. angezeigt werden. Das wollte ich eigentlich erreichen.