Alsooo..
Ich will meiner TNVCLForm Klasse ein OnCreate Ereignis verpassen. Das habe ich sogar schon und es funktioniert. Das OnCreate kann man aber nicht so setzen wie ein "normales" Ereignis weil:
Man kann Ereignisse nur zuweisen, wenn die Klasse bereits erstellt ist
Dann ist es aber für OnCreate zu spät.
Soweit klar? Beispiel:
Delphi-Quellcode:
var form: TNVCLForm;
begin
// 1. zu früh, wahrscheinlich AV
form.OnCreate := FormCreate;
form := TNVCLForm.Create;
// 2. zu spät
form := TNVCLForm.Create;
form.OnCreate := FormCreate;
end;
Bisher habe ich es ähnlich gelöst wie die
VCL. In der Exe wird ein Resoucestring gespeichert
(per {$R a.res} ).
Hier der ganze Weg:
FormCreate.rc
Zitat:
STRINGTABLE
{
0, "FormCreate" // Name der Create-Methode;
}
compilieren
FormCreate.res
Unit1:
Delphi-Quellcode:
unit Unit1;
interface
uses NVCLForms;
type
TForm1 =
class(TNVCLForm)
procedure FormCreate(Sender: TObject);
// Name der Methode = 'FormCreate' !
end;
{$R FromCreate.res} // <-- FormCreate.res mit 'FormCreate'-String einbinden
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
// Dieser Code soll ausgeführt werden
end;
end.
Project1
Delphi-Quellcode:
program Project1;
uses
NVCLForms,
Unit1 in 'Unit1.pas';
begin
Application.CreateForm(Form1,TForm1); // Form1 wird erstellt...
Application.Run;
end.
Delphi-Quellcode:
constructor TNVCLForm.Create(AParent: TNVCLControl);
var resStr: String;
_Create: TMethod;
begin
SetLength(resStr,255); // String wird aus der Exe geladen
LoadString(hInstance,Index,@resStr[1],255); // ...
Trim(resStr); // ... => 'FormCreate'
_Create.Code := MethodAddress(resStr); // Addresse von TForm1.FormCreate herausfinden
_Create.Data := Self; // ...
FOnCreate := TCreateEvent(_Create); // FOnCreate := TForm1.FormCreate
// [...]
Mein Fenster erhält WM_CREATE:
Delphi-Quellcode:
procedure TNVCLForm.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_CREATE: begin
if Assigned(FOnCreate) then
FOnCreate(Self); // OnCreate wird ausgeführt
end;
// [...]
end;
Delphi-Quellcode:
unit Unit1;
// [...]
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
// Code wird ausgeführt!
end;
end.
Ich hoffe das war jetzt nachvollziehbar. Der Nachteil dieser Methode ist, dass man immer erst eine .res Datei mit dem Namen der gewünschten OnCreate Methode zu erstellen, was ziemlich lästig ist.
Also dachte ich mir, wäre es für den Benutzer komfortabler wenn er nicht eine .res Datei erstellen müsste sondern nur irgendwo in sein Projekt
Delphi-Quellcode:
resourcestring
FormCreate = 'FormCreate';
Das Problem taucht dann aber hier auf:
Delphi-Quellcode:
SetLength(resStr,255);
LoadString(hInstance,Index,@resStr[1],255); // Index unbekannt von 'FormCreate'
MyTrim(resStr);
Nun war meine Frage, wie man diesen String da gezielt laden kann (oder ob jemand notfalls noch eine andere Lösung für das Problem hätte).
Verstanden ?
Gruß
Neutral General