Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.ru

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Проблемы с локализацей TListView из ресурсных DLL [D7]


kotyara   (17.03.17 20:37

Доброго времени, уважаемые!

Делаю локализацию приложения, написанного на 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.

беги, пока не поздно )


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо