Конференция "Основная" » Проблемы с локализацей TListView из ресурсных DLL [D7]
 
  • kotyara (17.03.17 20:37) [0]
    Доброго времени, уважаемые!

    Делаю локализацию приложения, написанного на D7. "Стандартным" способом, как в демке RichEdit.

    Создал ресурсные DLL с переведенными строками. При загрузке программы - все ОК.
    А при смене языка "на лету" - проблемы с TListView. Они "не читаются" из RC_DATA. Все остальные компоненты успешно переводятся, а ListView - нет.

    В "тестовом" приложении, когда TListView лежит на самой форме - все работает. А в основном - их несколько, и все они расположены на разных страницах PageControl. И все. Тупо игнорируются...

    Причем проверил, считал RC_DATA не в форму, а в текстовый файл - свойства нужных мне TListView там есть! Но сами TListView их игнорируют.
    Целый день бьюсь, не могу понять - почему так. И куда копать...

    Может кто сталкивался?
  • Кто б сомневался © (17.03.17 21:04) [1]
    Честно говоря никогда не использовал этот предложенный вариант. Всегда свой писал , он и быстрее работает и на лету меняет.
    А сейчас делать локализацию через dll - вообще не актуально, в связи с мултиплатформенностью Delphi.
  • Германн © (18.03.17 01:20) [2]

    > В "тестовом" приложении, когда TListView лежит на самой
    > форме - все работает. А в основном - их несколько, и все
    > они расположены на разных страницах PageControl. И все.
    > Тупо игнорируются...

    Значит в вашем коде ошибка. Какая и в каком месте нельзя сказать не видя кода. Но она точно не связана с локализацией через ресурсы.
  • kotyara12 (18.03.17 08:55) [3]

    > Значит в вашем коде ошибка.


    Код очень простой... Из того же самого примера, только ЭТОТ ЖЕ модуль в примере работает, а в другом приложении - нет.


    type
     TResReader = class(TReader)
     public
       procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer); override;
     end;

    procedure TResReader.ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer);
    begin
     inherited ReadPrefix(Flags, AChildPos);
     Include(Flags, ffInherited);
    end;

    function SetResourceInstance(const NewInstance: Longint): Longint;
    var
     CurModule: PLibModule;
    begin
     Result := 0;

     CurModule := LibModuleList;
     while CurModule <> nil do
     begin
       if CurModule.Instance = HInstance then
       begin
         if CurModule.ResInstance <> CurModule.Instance then
           FreeLibrary(CurModule.ResInstance);
         CurModule.ResInstance := NewInstance;
         Result := NewInstance;
         Exit;
       end;

       CurModule := CurModule.Next;
     end;
    end;

    function InternalReloadComponentRes(const sResName: string; hInst: THandle; Instance: TComponent): Boolean;
    var
     hRsrc: THandle;
     fStream: TResourceStream;
     fReader: TResReader;
    begin
     Result := False;

     if hInst = 0 then
       hInst := HInstance;

     hRsrc := FindResource(hInst, PChar(sResName), RT_RCDATA);
     if hRsrc <> 0 then
     begin
       fStream := TResourceStream.Create(hInst, sResName, RT_RCDATA);
       try
         fReader := TResReader.Create(fStream, 4096);
         try
           fReader.ReadRootComponent(Instance);
         finally
           fReader.Free;
         end;
       finally
         fStream.Free;
       end;

       Result := True;
     end;
    end;



    Ошибка именно в InternalReloadComponentRes. Но она 100% взята из примера, и в "демо" работает на все 100. Другого кода по локализации точно нет, ListView в форме никак "вручную" не обрабатывается
  • kotyara12 (18.03.17 08:59) [4]
    Я пока "вышел из положения", заменив подгрузку ресурсной DLL "на лету" записью кода языка в INI и перезапуском приложения - тогда все работает. Хотя выполняется 100% тот же самый код.

    Все остальные ресурсы, в том числе resourcestring на лету меняются отлично.
    Вопрос: что такого происходит внутри ListView после запуска формы?
  • kotyara12 (18.03.17 09:04) [5]
    Еще одно дополнение...

    Иногда (иногда!) одна из 5 ListView все таки "подхватывает" изменения. Но тогда она очень медленно пересоздает список столбцов. Буквально можно наблюдать - как пропадают столбцы (ListView все в режиме Report), а затем пересоздаются по 2-3 в секунду, как на видео. Красиво конечно, но не практично :-)

    Может это что-то даст для определения причины...
  • sniknik © (19.03.17 20:39) [6]
    > function InternalReloadComponentRes(const sResName: string; hInst: THandle; Instance: TComponent): Boolean;
    эта функция где находится, в dll? Borlndmm подключен?
  • Eraser © (22.03.17 20:55) [7]

    > kotyara   (17.03.17 20:37) 


    >  "Стандартным" способом, как в демке RichEdit.

    беги, пока не поздно )
 
Конференция "Основная" » Проблемы с локализацей TListView из ресурсных DLL [D7]
Есть новые Нет новых   [118691   +21][b:0][p:0.002]