Re: Resourcestring laden
Ich finde diese Lösung mit den Strings zu kompliziert. Ich würde entweder eine virtuelle Methode nehmen, die beim Erstellen aufgerufen wird, oder alle als published deklarierten Methoden durchgehen, die in der Form-Klasse definiert werden, und nach 'Create' oder Ähnlichem suchen.
|
Re: Resourcestring laden
oder kann man nicht Klassenmethoden nehmen?
|
Re: Resourcestring laden
Hier mal ein neuer Vorschlag...
Delphi-Quellcode:
Aufruf...
type
TMyCustomForm = class(TForm) private FOnCreate:TNotifyEvent; public class procedure addOnCreate(EventName:string); constructor create(AParent: TControl); reintroduce; end; implementation var FOnCreateEventName:string; { TMyForm } class procedure TMyCustomForm.addOnCreate(EventName: string); begin FOnCreateEventName := EventName; end; constructor TMyCustomForm.create(AParent: TControl); var _Create: TMethod; begin _Create.Code := MethodAddress(FOnCreateEventName); _Create.Data := Self; if assigned(_Create.Code) then FOnCreate := TNotifyEvent(_Create) else FOnCreate := nil; if assigned(FOnCreate) then FOnCreate(Self); end;
Delphi-Quellcode:
Bei dieser Vorgehensweise könnte man die Übergabe auch über den Konstruktor machen? oder nicht, weil dann das Application.CreateForm nicht geht?
type
TMyForm = class(TMyCustomForm) published procedure FormCreate(Sender: TObject); end; : begin MyForm.addOnCreate('FormCreate'); MyForm:=TMyForm.create(Self); end; procedure TMyForm.FormCreate(Sender: TObject); begin end; Ich wollte dir eigentlich konkreter helfen, mit deinem Quellcode. Aber ich finde hier leider nirgends mal einen zusammenhängenden Quellcode von dir und dein Demo ist nur eine EXE. Vermutlich bin ich einfach nur blind. Naja, egal. Ich vermute mal das dir das sowieso wieder nicht gefällt. Wir drehen uns hier sowieso im Kreis. Du willst das nicht übergeben aber irgendwo must du das definieren. Ob nun in einer externen Datei oder direkt beim initialisieren. Gruss Thorsten |
Re: Resourcestring laden
Mir kommt gerade noch eine andere Idee: Eine Funktion schreiben, die für Form-Variablen Create-Handler registriert. Im Konstruktor wird dann geprüft, ob das Self das gleiche ist, was in einer der registrierten Variablen steht, wenn ja, dann wird der Handler aufgerufen. Das setzt aber voraus, das immer schön mit
Delphi-Quellcode:
gearbeitet wird, sonst ist die Variable noch nicht zugewiesen.
FormVar := FormClass.NewInstance;
FormVar.Create; |
Re: Resourcestring laden
Zitat:
Also zu deinem Vorschlag: Bei deinem ursprünglichen Vorschlag ist das Problem, das ich ein Problem bekomme, wenn es mehr als nur eine TNVCLForm-Klasse gibt (Mit unterschiedlich benannten OnCreate Methoden). Die Idee mit dem Konstruktor hatte ich auch schon aber, tut mir Leid, auch die gefällt mir irgendwie nicht so ganz :mrgreen: Abgesehn davon das die Forms ja durch Application.CreateForm erstellt werden und Application.CreateForm ruft ja erst den Konstruktor der Form auf. Von daher kann der "Benutzer" da auch nicht viel steuern, außer man übergibt dem Application.CreateForm diesen String. Aber mhh.. ich weiß nicht. Ich finde das irgendwie unschön. Also ich wills nochmal betonen. Ich lehne hier keine Vorschläge aus Prinzip ab! Die bisherigen sind meiner Meinung nach einfach zu unbefriedigend. :stupid: Gruß Neutral General EDIT: Da kam kein roter kasten -.- Zitat:
|
Re: Resourcestring laden
Zitat:
Wenn ich mir dann mal andere nonVCL-Beispiele ansehe, kann ich das nicht mit deinem Quellcode vereinbaren. Du benutzt immer noch TApplication? Dafür benötigst du dann die Unit Forms diese enthält dann die Units SysUtils, Classes. Ich dachte auf diese könnte man dann verzichten und erhält somit eine kleinere EXE? Wo liegt denn jetzt genau der Unterschied zwischen der VCL- und deiner nonVCL-Geschichte? Ich frage deshalb, weil ich sonst den Vorschlag hätte das Application-Objekt abzuleiten und um eine eigene CreateForm-Methode zu erweitern. Aber wenn du doch alles vom Delphieditor automatisch erstellen lassen möchtest, dann geht das natürlich nicht. Das verwirrt mich bzw. verstehe ich einfach immer noch nicht, sorry. Gruss Thorsten |
Re: Resourcestring laden
Hi,
Also omata: Application ist eine eigene Klasse ;) Ich binde natürlich nicht die VCL-Unit Forms ein, das würde mein Projekt ja total in totale Sinnlosigkeit stürzen^^ Also ich habe die Sache jetzt gelöst. Im TNVCLForm constructor:
Delphi-Quellcode:
Hab mir ne eigene RTTI Unit gebaut und damit + {$MethodInfo ON} funktioniert es. Also es wird die erstbeste Methode der Klasse genommen, die ein TCreateEvent ist.
begin
Methods := GetMethods(ClassType); // Alle Methoden auflisten n := -1; for i:= 0 to High(Methods) do if (Methods[i].ParamCount = 1) and (Methods[i].Params[0].Typ = 'TNVCLForm') then begin // Wenn eine Methode nur ein Parameter hat und der vom Typ TNVCLForm ist // Sprich: die Methode ein TCreateEvent ist, _Create.Code := MethodAddress(Methods[i].Name); _Create.Data := Self; FOnCreate := TCreateEvent(_Create); //... dann wird sie dem OnCreate zugewiesen break; end; Ich werde in absehbarer Zeit eine Alpha-Version meiner VCL hochladen, und dann könnt ihr sie selbst mal ausprobieren. Dann wird das ganze vielleicht (wenn auch im Nachhinein^^) klarer ;) Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz