Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Resourcestring laden (https://www.delphipraxis.net/110254-resourcestring-laden.html)

Apollonius 16. Mär 2008 14:40

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.

dominikkv 16. Mär 2008 14:52

Re: Resourcestring laden
 
oder kann man nicht Klassenmethoden nehmen?

omata 16. Mär 2008 16:03

Re: Resourcestring laden
 
Hier mal ein neuer Vorschlag...

Delphi-Quellcode:
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;
Aufruf...
Delphi-Quellcode:
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;
Bei dieser Vorgehensweise könnte man die Übergabe auch über den Konstruktor machen? oder nicht, weil dann das Application.CreateForm nicht geht?

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

Apollonius 16. Mär 2008 16:53

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:
FormVar := FormClass.NewInstance;
FormVar.Create;
gearbeitet wird, sonst ist die Variable noch nicht zugewiesen.

Neutral General 16. Mär 2008 17:09

Re: Resourcestring laden
 
Zitat:

Zitat von omata
Hier mal ein neuer Vorschlag...

[...]

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

Hab ich dir was getan, das bei jeder deiner Antworten mit sowas ankommst? Wieso gehst du davon aus das es mir nicht gefällt? Und glaubst du mir gefällt das irgendwie aus Prinzip nicht weils von dir ist oder was? Wenn mir was nicht gefällt, dann habe ich einen anständigen Grund dazu.

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:

Zitat von Apollonius
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:
FormVar := FormClass.NewInstance;
FormVar.Create;
gearbeitet wird, sonst ist die Variable noch nicht zugewiesen.

Ich werde mir deine Idee mal durchn Kopf gehn lassen ;)

omata 16. Mär 2008 18:35

Re: Resourcestring laden
 
Zitat:

Zitat von Neutral General
Hab ich dir was getan...

Nein, ich war nur etwas genervt. Ich wollte das mal mit einem konkreten Beispiel ausprobieren. Ich finde aber kein vollständiges, um es mal mit deinen Quellcode-Schnipseln testen zu können.
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

Neutral General 18. Mär 2008 11:56

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:
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;
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.

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.
Seite 3 von 3     123   

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