-
Доброго времени, уважаемые!
Делаю локализацию приложения, написанного на D7. "Стандартным" способом, как в демке RichEdit.
Создал ресурсные DLL с переведенными строками. При загрузке программы - все ОК. А при смене языка "на лету" - проблемы с TListView. Они "не читаются" из RC_DATA. Все остальные компоненты успешно переводятся, а ListView - нет.
В "тестовом" приложении, когда TListView лежит на самой форме - все работает. А в основном - их несколько, и все они расположены на разных страницах PageControl. И все. Тупо игнорируются...
Причем проверил, считал RC_DATA не в форму, а в текстовый файл - свойства нужных мне TListView там есть! Но сами TListView их игнорируют. Целый день бьюсь, не могу понять - почему так. И куда копать...
Может кто сталкивался?
-
Честно говоря никогда не использовал этот предложенный вариант. Всегда свой писал , он и быстрее работает и на лету меняет. А сейчас делать локализацию через dll - вообще не актуально, в связи с мултиплатформенностью Delphi.
-
> В "тестовом" приложении, когда TListView лежит на самой > форме - все работает. А в основном - их несколько, и все > они расположены на разных страницах PageControl. И все. > Тупо игнорируются...
Значит в вашем коде ошибка. Какая и в каком месте нельзя сказать не видя кода. Но она точно не связана с локализацией через ресурсы.
-
> Значит в вашем коде ошибка.
Код очень простой... Из того же самого примера, только ЭТОТ ЖЕ модуль в примере работает, а в другом приложении - нет.
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 в форме никак "вручную" не обрабатывается
-
Я пока "вышел из положения", заменив подгрузку ресурсной DLL "на лету" записью кода языка в INI и перезапуском приложения - тогда все работает. Хотя выполняется 100% тот же самый код.
Все остальные ресурсы, в том числе resourcestring на лету меняются отлично. Вопрос: что такого происходит внутри ListView после запуска формы?
-
Еще одно дополнение...
Иногда (иногда!) одна из 5 ListView все таки "подхватывает" изменения. Но тогда она очень медленно пересоздает список столбцов. Буквально можно наблюдать - как пропадают столбцы (ListView все в режиме Report), а затем пересоздаются по 2-3 в секунду, как на видео. Красиво конечно, но не практично :-)
Может это что-то даст для определения причины...
-
> function InternalReloadComponentRes(const sResName: string; hInst: THandle; Instance: TComponent): Boolean; эта функция где находится, в dll? Borlndmm подключен?
-
> kotyara (17.03.17 20:37)
> "Стандартным" способом, как в демке RichEdit.
беги, пока не поздно )
|