Re: Resourcestring laden
Zitat:
Also pass auf: 1. Kann man ResourceStrings generell mit LoadString laden ohne das die Strings irgendwie irgendwo inner Unit verankert sind, also nichts soo außergewöhnliches 2. Stell dir vor du bindest meine NonVCL Units in dein Programm ein. So und jetzt willst du natürlich das auch das OnCreate der Form funktioniert. Dann hast du bisher nur die möglichkeit dir ne .rc Datei zu schreiben, diese zu compilieren und ins Projekt einzufügen. Das ist natürlich ätzend und nervig. In dieser Resourcedatei würde dann z.B. drinstehn Zitat:
Delphi-Quellcode:
statt
unit Unit1;
interface uses NVCLForms; type TForm1 = class(TNVCLForm) procedure FormCreate(Sender: TObject); private public end; resourcestring TForm1OnCreate = 'FormCreate'; implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin // Code end; end. Zitat:
Delphi-Quellcode:
Gruß
unit Unit1;
interface uses NVCLForms; type TForm1 = class(TNVCLForm) procedure FormCreate(Sender: TObject); private public end; {$R FormCreate.res} implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin // Code end; end. Neutral General |
Re: Resourcestring laden
Ja, das ist ja alles sehr schön.
Nur was soll mir das jetzt sagen? In deinem ersten Beispiel ging es um eine zweite Unit, jetzt hast du nur noch eine. Naja, du wirst das schon hinbekommen. Ich bin vermutlich einfach zu blöd, um das zu verstehen. Gruss Thorsten |
Re: Resourcestring laden
Hi^^
Also eine Unit:
Delphi-Quellcode:
andere Unit:
unit Unit1;
interface uses NVCLForms; type TForm1 = class(TNVCLForm) procedure FormCreate(Sender: TObject); private public end; {$R FormCreate.res} implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin // Code end; end.
Delphi-Quellcode:
Und weil das wie gesagt mit ner .rc/.res Datei zu nervig ist wollte ichs so machen:
unit NVCLForms;
//... constructor TNVCLForm.Create(AParent: TNVCLControl); var resStr: String; begin // resourcestring laden // bisher so: SetLength(resStr,High(Byte)); LoadString(hInstance,0,@resStr[1],255); // String wird geladen, geht aber nur mit .res datei Trim(resStr); end; // ... end.
Delphi-Quellcode:
unit Unit1;
interface uses NVCLForms; type TForm1 = class(TNVCLForm) procedure FormCreate(Sender: TObject); private public end; resourcestring FormCreate = 'FormCreate'; implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin // Code end; end.
Delphi-Quellcode:
Gruß
unit NVCLForms;
//... constructor TNVCLForm.Create(AParent: TNVCLControl); var resStr: String; begin // resourcestring laden -->???????<-- end; // ... end. Neutral General |
Re: Resourcestring laden
Kannst du diesen String nicht im Konstruktor mit übergeben?
|
Re: Resourcestring laden
Könnte ich, aber würde dir das gefallen als Benutzer?
|
Re: Resourcestring laden
Welchen Inhalt enthält der Ressourcenstring den? Wofür ist dieser genau da?
|
Re: Resourcestring laden
Zitat:
|
Re: Resourcestring laden
Zitat:
Leider gibt es ja keine Antwort mehr von Neutral General, der ja die ganze Zeit online ist. Wir sind vermutlich nicht die richtigen Gesprächteilnehmer oder das Problem ist nicht oder nur mit sehr viel Aufwand zu erklären. Wie auch immer keine Antwort ist auch eine. (zumindest für mich) |
Re: Resourcestring laden
Sorry, es wird ne Antwort geben, keine Angst ;)
Die Muhkuh ist es gerade persönlich am testen und versucht mich zu verstehn^^ werde mich aber spätestens morgen mittag nochmal hier melden, entweder mit Lösung oder einer ausführlichen Erklärung ;) Gruß Neutral General |
Re: Resourcestring laden
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: :arrow: Man kann Ereignisse nur zuweisen, wenn die Klasse bereits erstellt ist :arrow: :arrow: Dann ist es aber für OnCreate zu spät. Soweit klar? Beispiel:
Delphi-Quellcode:
Bisher habe ich es ähnlich gelöst wie die VCL. In der Exe wird ein Resoucestring gespeichert
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; (per {$R a.res} ). Hier der ganze Weg: FormCreate.rc Zitat:
Unit1:
Delphi-Quellcode:
Project1
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.
Delphi-Quellcode:
:arrow:
program Project1;
uses NVCLForms, Unit1 in 'Unit1.pas'; begin Application.CreateForm(Form1,TForm1); // Form1 wird erstellt... Application.Run; end.
Delphi-Quellcode:
:arrow: Mein Fenster erhält WM_CREATE:
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 // [...]
Delphi-Quellcode:
:arrow:
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:
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.
unit Unit1;
// [...] implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin // Code wird ausgeführt! end; end. 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:
Das Problem taucht dann aber hier auf:
resourcestring
FormCreate = 'FormCreate';
Delphi-Quellcode:
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).
SetLength(resStr,255);
LoadString(hInstance,Index,@resStr[1],255); // Index unbekannt von 'FormCreate' MyTrim(resStr); Verstanden ? :? Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 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