Beispiel für RecourcenDll Experte in Codegear 2009



  • Ich habe das Beispiel in den Dateien des Builders 6 gefunden und mit diesem geöffnet, compiliert und gestartet.

    Aber die Sprache kann ich nicht umstellen:

    void __fastcall TMainForm::US1Click(TObject *Sender)
    {
      AnsiString Name;
      int Size;
    
      if(LoadNewResourceModule(dynamic_cast<TComponent*>(Sender)->Tag) != 0)
      {
        Name = FontName->Text;
        Size = StrToInt(FontSize->Text);
        ReinitializeForms();
        US1->Checked = US1 == Sender;
        German1->Checked  = German1 == Sender;
        French1->Checked  = French1 == Sender;
    
        CurrText()->Name = Name;
        CurrText()->Size = Size;
        SelectionChange(this);
        FontName->SelLength = 0;
    
        SetupRuler();
        RichEdit1->SetFocus();
      }
    }
    

    Der rennt nie in das if rein. Muß ich beim compilieren irgendwas beachten?

    MfG



  • Destiniy schrieb:

    irgendwie finde ich das Beispiel nicht wo liegt das genau?

    Scheint nicht dabei zu sein.

    Ich habe mal die alte Demo aus C++Builder 6 auf Unicode portiert (AnsiString durch String ersetzt, alle sprintf()-Statements durch String().sprintf() ersetzt sowie ein paar triviale Kleinigkeiten) und hier hochgeladen. Einmal die ganze Projektgruppe erzeugen (Projekt|Alle Projekte erzeugen...), dann läufts.

    Man beachte aber, daß das Wechseln der Sprache zur Laufzeit in dieser Weise gefährlich ist, da nicht nur die lokalisierten, sondern alle Formulareigenschaften erneut aus der DFM gelesen werden. Das manifestiert sich dann in so unschönen Nebenerscheinungen wie der stets auf einen fixen Wert zurückgesetzten Fenstergröße (sehr offensichtlich) oder etwa der weniger offenbaren Tatsache, daß Richedit1->Modified wieder auf "false" zurückgesetzt wird, so daß nach einem Sprachwechsel kein "Vor Beenden speichern?"-Dialog mehr erscheint.

    Bessere Unterstützung für das Wechseln von Sprachen zur Laufzeit hat etwa dxgettext sowie die meisten 3rd-Party-Tools.



  • danke erstmal werds mir mal anschauen



  • Also ich hab es jetzt mal einfach probiert

    Ich habe ein DLL Projekt erzeugt, in dem ich eine Recource Test.rc hinzugefügt habe.

    STRINGTABLE
    BEGIN
    0 "test1";
    1 "test2";
    2 "Проверка";
    END
    

    bei 2 steht ein russiches Wort das will er hier nicht darstellen.

    Diese Datei mit dem Notpad als Unicode erstellt. Dann das Projekt erstellt.

    Jetzt bringt er den Fehler:

    expecting recource or recource type name

    Warum kann der die Recource nicht erzeugen?



  • Also wenn ich kurz in das Recourcenfile reingehe und z.B.: bei STRINGTABLE das S durch ein S erstze und nicht speichere läßt es sich kompilieren.

    Leider stimmen die russichen Zeichen dann in dem .res File nicht mit den in derm .rc File überein. Wo liegt der Fehler?

    MfG



  • nachdem ich das Recource File mit dem ander Recource Compiler übersetzt habe funktionierts.

    Irgendiwe erscheint mir die Richedit Methode aber besser muß die mir nochmal genauer anschauen.



  • Das laden der Recourcen funtkioniert dort ja über die Funktionen:

    LoadNewResourceModule() und ReinitializeForms() gibt es da auch Funktionen um nur einzelne Steuerelemente zu laden?

    MfG



  • Nein.
    Es wäre denkbar, die Funktionen entsprechend anzupassen; der Quelltext liegt ja bei. Aber wozu brauchst du das?



  • meine Frage zielt dahin die Nachteile zu umgehen.

    Man beachte aber, daß das Wechseln der Sprache zur Laufzeit in dieser Weise gefährlich ist, da nicht nur die lokalisierten, sondern alle Formulareigenschaften erneut aus der DFM gelesen werden. Das manifestiert sich dann in so unschönen Nebenerscheinungen wie der stets auf einen fixen Wert zurückgesetzten Fenstergröße (sehr offensichtlich) oder etwa der weniger offenbaren Tatsache, daß Richedit1->Modified wieder auf "false" zurückgesetzt wird, so daß nach einem Sprachwechsel kein "Vor Beenden speichern?"-Dialog mehr erscheint.



  • Falls du wirklich die Sprache zur Laufzeit wechseln willst, mußt du entweder a) die Implementation von ReinitializeForms() entsprechend anpassen, b) dxgettext benutzen oder c) eine 3rd-Party-Lösung kaufen. Ich persönlich empfehle b).


Anmelden zum Antworten