Ressourcen-DLLs dynamisch wechseln



  • Hallo miteinander,

    ich habe ein Problem beim dynamischen Zuordnen von resourcen dll's. Auf Seite 16-13 des deutschen BCC V6 C++ Buider Entwicklerhandbuches ist der Vorgang zwar beschrieben, aber irgendwas läuft schief.

    Der Reihe nach:

    1.) Eine Stringliste über 'resourcestringlist ... ...' wurde erstellt.

    2.) Die unit 'reinit.pas' wurde, wie im Handbuch beschrieben, eingebunden. Die unit ist unter '..\Examples\Apps\RichEdit' zu finden.

    3.) Mit dem Ressource DLL-Experte wurden dll's für ENU, FRA und DEU angelegt, dabei das resourcen script xxx.drc (für stringlists) mit eingebunden.

    4.) In der Applikation wie folgt die Ressource geladen und angezeigt (genau wie im Handbuch beschrieben)
    //---------------------------------------------------------------------------
    void __fastcall TMainForm::Button1Click(TObject *Sender)
    {
    const FRENCH = (SUBLANG_FRENCH << 10) | LANG_FRENCH;

    if ( LoadNewResourceModule(FRENCH) )
    {
    ReinitializeForms();
    AnsiString asTest = LoadStr(_asTest.id);
    stb_StatusBar->Panels->Items[0]->Text = asTest;
    }
    }
    //---------------------------------------------------------------------------
    das hat bis hier einwandfrei funktioniert!! Das Form wurde up(ge)dated und asText enthielt den richtigen String.

    Aber, sobald ich das gleiche für ENU bzw. DEU machen will, z.B. wie folgt
    //---------------------------------------------------------------------------
    void __fastcall TMainForm::Button2Click(TObject *Sender)
    {
    const ENGLISH = (SUBLANG_ENGLISH_US << 10) | LANG_ENGLISH;

    if ( LoadNewResourceModule(ENGLISH))
    {
    ReinitializeForms();

    AnsiString asTest = LoadStr(_asTest.id);
    stb_StatusBar->Panels->Items[0]->Text = asTest;
    }
    }
    //---------------------------------------------------------------------------
    bekomme ich irgendwelche wilde Strings in asText zurückgeliefert.
    Kennst sich da jemand aus? Bin für jede Hilfe dankbar.

    Gruss vom nebligen Bodensee, Hermann



  • Du musst die unterliegenden Projekte compilieren, dann bekommste dlls, die dfm forms beinhalten. ich nehme mal an, du hast erst nur richedit compiliert, schau mal in die anderen order in diesem verzeichnis.



  • Hallo David,
    danke für deine prompte Antwort. Inzwischen habe ich herausgefunden,
    dass zwar die Formdaten (*.dfm) in das Ressource-Modul (DLL) übernommen werden, aber nicht die *.RC Daten der Anwendung. Es wird durch das Ressource-Modul-Projekt zwar eine *.RES mit den gewünschten Daten erstellt, aber irgendwie wird das nicht in das Ressource-Modul (DLL) übernommen. Im Moment versuche ich herauszufinden, ob das überhaupt erforderlich ist, oder ob das Ressource-Modul bei der Ausführung erst auf die *.RES zugreift.
    Also wenn jemand das schon einmal gemacht hat, wäre ich für ein kurzes Kochrezept sehr dankbar. Die Details finde ich dann schon heraus.
    Gruss Hermann



  • Hallo,
    ich habe auch ein Problem mit den Resourcen-DLLS.
    Sobald ich eine DLL für eine Fremdspache erstelle, im Translation-Manager die gewünschten Übersetzung vornehme (unter anderem auch System-Strings für z.B Standard Messageboxen), diese dann kompiliere und aktiviere erscheint in den Messageboxen kein Text mehr.

    Kann mir da irgendwer helfen?

    Gruß
    gofrm

    Edit:
    Zitate bitte nur wenn unbedingt nötig und dann so kurz wie möglich. Danke!

    [ Dieser Beitrag wurde am 20.02.2003 um 16:46 Uhr von Jansen editiert. ]



  • ... jo, genau dieses Problem beschäftigt mich jetzt schon seit 3 Tagen. Ich habe die Sache zwar zum laufen bekommen, ganz verstanden warum es jetzt funktioniert, habe ich allerdings noch nicht. Da scheint mindestens ein Bug in der IDE Projekterstellung zu sein.

    Hier ein paar Tips:

    1.)Nach erstellen des Sprach-Dll Projektes in der neu erstellten Directory (z.B. ..\FRA) prüfen, ob es eine ProjektName_DRC.RC und eine ProjektName_DRC.RES gibt.

    Mit einem Hexeditor prüfen, ob in der ProjektName_DRC.RES auch die übersetzten Strings drinstehen.
    Anm.: ProjektName_DRC.RC/RES ergeben sich nur, wenn mit der Pascal Unit die Ressource Strings erzeugt wurden, sonst IrgendEinName.RC/RES erstellen.

    2.)Prüfen, ob in der Projektverwaltung neben dem Hauptprojekt auch alle Sprach-DLL Projekte eingetragen sind. Ganz wichtig, in den einzelnen Sprach-DLL Projekten muss die ProjektName_DRC.RC vorhanden sein. Wenn diese nicht vorhanden ist, muss sie aus dem zugehörigen Directory (z.B. ..\FRA) mittels Projektmanager hinzugefügt werden. Die IDE hatte das bei mir nicht automatisch gemacht, ich musste sie händisch zufügen. Dies, obwohl ich dem Ressourcen DLL-Experten das mitgegeben hatte.

    3.) Alle Projekte neu erstellen. Ich musste feststellen, dass das nicht immer funktioniert hat. Am besten Du löscht, so schon vorhanden, die vorher erzeugten Sprach-Dlls (z.B. ProjektName.FRA). Dann kannst du leichter feststellen ob's geklappt hat. Wenn ich zuerst 'Alle Projekte erzeugen' und dann an sich unlogisch, 'Alle Projekte aktualisieren' aufgerufen habe, hatte es funktioniert. Zudem musste ich es mehrfach machen, jedesmal wurde dann die nächst Sprache generiert. Klingt blöde, ist es aber auch.

    4.) Der Aufruf in der Arbeitsroutine sieht dann wie folgt aus:

    #include "reinit.hpp"
    ...
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ButtonFranzoesischClick(TObject *Sender)
    {
    AnsiString as = "ButtonFranzoesischClick";
    const FRENCH = (SUBLANG_FRENCH << 10) | LANG_FRENCH;

    if ( LoadNewResourceModule(FRENCH) )
    {
    ReinitializeForms();
    Edit1->Text = Unit2_PascalString1;

    }
    }
    //---------------------------------------------------------------------------

    Wobei vorher die Strings in einer Pascal Unit angelegt werden müssen:
    //---------------------------------------------------------------------------
    unit Unit2;
    interface

    resourcestring PascalString1 = 'PASCAL String-Ressourcen.';
    resourcestring PascalString2 = 'PASCAL String-Ressourcen.';

    implementation
    begin
    end.
    //---------------------------------------------------------------------------

    Ich kann dir gerne mein Übungsprogramm schicken, es ist momentan noch sehr chaotisch. Lass mich deine Adresse wissen.
    Gruss Hermann



  • ein beispiel-programm wird übrigens im builder mitgeliefert:

    C:\Programme\Borland\CBuilder5\Examples\Apps\RichEdit



  • ..ja das stimmt, hat mir allerdings nur eingeschränkt weitergeholfen. Auch mit der Info im Entwicklerhandbuch kam ich nicht klar. Ich hatte massive Problem mit der IDE (Ressorce-DLL-Experten) und der Erstellung (build) der Sprachmodule. Das lief einfach nicht so wie von mir erwartet, hab' lange gebraucht das zu bemerken. Drum mein Tip die Module erst zu löschen, dann merkt man sofort, wenn's nicht geklappt hat.
    Hermann


Anmelden zum Antworten