Что изменилось в 0.9.26? Где мои тексты???

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Troublemaker писал(а):как именно работает strings.LoadFromFile, в какой кодировке идет чтение запись.

Данный метод не занимается преобразование кодировок, а просто загружает текст потоком....
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Odyssey писал(а):Здесь поможет консоль, достаточно создать маленький отладочный модуль с функцией типа Utf8DbgOut(const aMessage: string) которая будет перекодировать строку из utf-8 (а под windows еще и делать CharToOEM) и выводить сообщение в консоль. При желании можно элементарно переключиться на ведение лог-файла отладки. При создании релиза этот модуль убирается из uses, и забытые отладочные вызовы подсвечиваются как ошибки, что помогает от них избавиться.

проще добавить внутрь процедуры Utf8DbgOut директивы и про релизной компиляции отключать соответсвующим ключем.
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Mr.Smart писал(а):просто загружает текст потоком...

Виноват, неточно выразился. Как работает с кодировками .values()? В каком виде ему нужно подсовывать название параметра, если оно не латиницей?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Troublemaker писал(а):
Mr.Smart писал(а):просто загружает текст потоком...

Виноват, неточно выразился. Как работает с кодировками .values()? В каком виде ему нужно подсовывать название параметра, если оно не латиницей?

Смотря в какой кодировке хранятся данные в StringList.
Если в UTF-8 то не каких преобразований не нужно

Код: Выделить всё

var
 list: TStringList;
 s: String;
begin
...
  s:=list.Values['Имя'];
...
end;

Иначе если в cp1251 то

Код: Выделить всё

   s:=SysToUTF8(list.Values[UTF8ToSys('Имя')];
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Очередная бяка: где сообщения об ошибках?
lasarus-the_error.jpg

Ошибка происходит в строке с брекпойнтом.

Код: Выделить всё

    CollAuthorEdit.Text:=Dates.LastModified.Who.FIO;
    CollAuthorRankEdit.Text:=Dates.LastModified.Who.Rank;

Выбрасывает на строку 2507 в control.inc:

Код: Выделить всё

function TControl.GetText: TCaption;
var
  len: Integer;
begin
  // Check if GetTextBuf is overridden, otherwise
  // we can call RealGetText directly
 [b] if TMethod(@Self.GetTextBuf).Code = Pointer(@TControl.GetTextBuf)[/b]

Тоже странность. Оба edit-a - обычные LabeledEdit-ы без выкрутасов, .FIO и .Rank - строки длиной в 51 символ (как я понимаю, по дефолту string=widestring в .26).

Код: Выделить всё

T_Desc.Text=string[51];
...
...rank:T_Desc.text;


Дополнительная странность: если записать в .FIO строку из 51 цифры или латинской буквы, то всё нормально. При попытке записать туда константу (тоже юникодную) из 36 русских букв в поле ничего не отображается, хотя .text выдает нормальное значение. Константа меньшего размера, где-то до 25 символов отображается нормально. Так же себя ведет этот edit при вводе с клавиатуры: какое-то время нормально кажет кириллицу, потом поле ввода резко очищается.

Где копать?

Добавлено спустя 48 минут 35 секунд:
Бяка с ошибкой присвоения

Код: Выделить всё

CollAuthorRankEdit.Text:=Dates.LastModified.Who.Rank;
решилась: изначально был контрол CollAuthorREdit, потом я сделал "переименовать идентификатор" - "изменить все ссылки". Изменилось всё, кроме описания формы, в ней так и остался CollAuthorREdit и появился дополнительный CollAuthorRankEdit. Первый на форме был, второй существовал только в ее описании. Заметил случайно, когда обратил внимание на атрибут .name, который остался неизмененным после "переименовать".
Впрочем, я уже писал о подобном глюке, когда нарушается синхронизация между gui формы и ее описанием в исходнике.

Как воспроизвести: создаем форму, на нее вешаем контрол с каким-то именем. В исходнике для разнообразия обращаемся к этому контролу. Затем делаем "переименовать": в исходнике всё меняется, в описании формы (.lfm) остается старое имя, а для нового в описании формы в исходнике создается новая строка.

Добавлено спустя 10 минут 5 секунд:
Да, при переименовании контрола из "инспектора объектов" в исходнике всё изменяется правильно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Troublemaker писал(а):...как я понимаю, по дефолту string=widestring в .26...

Нет AnsiString в кодировке UTF-8.

Добавлено спустя 5 минут 14 секунд:
Troublemaker писал(а):Очередная бяка: где сообщения об ошибках?

Дело в том, что текс ошибки в своём составе имеет кириллицу. А так как при вызове raise перекодировка в UTF-8 не производится получам что видим.
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Mr.Smart писал(а):Нет AnsiString в кодировке UTF-8

То есть, мало преобразовать в юникод, еще и длину надо увеличить вдвое, да?
Mr.Smart писал(а):текст ошибки в своём составе имеет кириллицу

Есть идеи, где это можно поправить?
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Troublemaker писал(а):Есть идеи, где это можно поправить?


Идеи есть, но для исправления необходима следующая информация:
  1. Язык интерфейса.
  2. Является ли сообщение системным, либо вы его создаёте сами.
  3. Версия Lazarus (думаю, что 0.9.26).

Если сообщение системное и язык интерфейса русский, то переключите интерфейс на английский язык, воспроизведите ситуацию, и приведите скриншот сообщения (сообщение должно быть на английском языке и, по идее, отображаться корректно). Возможно, что имеется ошибка в русском переводе.

По приведённому вами алгоритму я добился сообщения об ошибке, но оно отображается нормально (у меня версия 0.9.26.1).
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

os: winxp/sp3
Максим писал(а):Язык интерфейса.

"английский или автоматически" - русский
Максим писал(а):Является ли сообщение системным

угу
Максим писал(а):Версия Lazarus (думаю, что 0.9.26)

точно так. Обратите внимание на название ветки.

Вопрос в том, КАКОЕ там должно быть сообщение, и где проверить, как оно хранится?
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Troublemaker писал(а):Вопрос в том, КАКОЕ там должно быть сообщение, и где проверить, как оно хранится?

Не надо задавать бессмысленные вопросы. Просто сделайте то, о чём я попросил:
Максим писал(а):Если сообщение системное и язык интерфейса русский, то переключите интерфейс на английский язык, воспроизведите ситуацию, и приведите скриншот сообщения (сообщение должно быть на английском языке и, по идее, отображаться корректно). Возможно, что имеется ошибка в русском переводе.

Я всё проверю и исправлю.
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Максим писал(а):переключите интерфейс на английский язык, воспроизведите ситуацию, и приведите скриншот сообщения (сообщение должно быть на английском языке и, по идее, отображаться корректно).

После смены интерфейса на английский НИЧЕГО не изменилось, на том же самом месте точно так же вылез пустой диалог:
lazarus-eng-error.jpg


Вот я и задаю очень даже не бессмысленный вопрос: ЧТО там должно быть написано? Или после смены интерфейса надо было и лазаря пересобрать?

Добавлено спустя 14 минут 11 секунд:
После пересборки ничего не изменилось. 0.9.26 качал с офсайта, никакой самодеятельности
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Troublemaker писал(а):
Mr.Smart писал(а):Нет AnsiString в кодировке UTF-8

То есть, мало преобразовать в юникод, еще и длину надо увеличить вдвое, да?

Длину увеличивать не надо. Пользуйся стандартными функциями они работают корректно и всё делают сами.
Для преобразования в юникод есть функции UTF8Decode, в анси соответственно UTF8ToAnsi.

Добавлено спустя 7 минут 57 секунд:
Troublemaker писал(а):Есть идеи, где это можно поправить?

Если это сообщение системное и операционка у вас локализована то сообщение естественно будет на русском языке.
Вызов системных эксцепшенов выполняется функцией RaiseLastOSError

Код: Выделить всё

...
  ECode := GetLastOSError;
  If (ECode<>0) then
    E:=EOSError.CreateFmt(SOSError, [ECode, SysErrorMessage(ECode)])
  else
    E:=EOSError.Create(SUnkOSError);
  E.ErrorCode:=ECode;
  Raise E;
....

Так как функция SysErrorMessage возвращает значения в кодировки Ansi, а преобразования в UTF-8 нет то получаем что видим 8)
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Mr.Smart писал(а):Если это сообщение системное и операционка у вас локализована то сообщение естественно будет на русском языке.

Дык, эта... я ж не знаю, ЧТО это за сообщение. КОгда я сказал "да, системное", вероятно, неправильно выразился, имелось в виду, что не мой код выдает это сообщение.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Troublemaker писал(а):
Mr.Smart писал(а):Если это сообщение системное и операционка у вас локализована то сообщение естественно будет на русском языке.

Дык, эта... я ж не знаю, ЧТО это за сообщение. КОгда я сказал "да, системное", вероятно, неправильно выразился, имелось в виду, что не мой код выдает это сообщение.

Ну отлови ексцепшен и посмотри

Код: Выделить всё

...
  try
    // Код с эксцепшеном
  except
    on e: Exception do
     ShowMessage(AnsiToUTF8(e.Message));
  end;
...
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Mr.Smart писал(а):отлови ексцепшен и посмотри

спасибо, попробую.
Ответить