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

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

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

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

Сообщение Mr.Smart » 16.10.2008 14:39:22

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

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

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

Сообщение Attid » 16.10.2008 16:59:34

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

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

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

Сообщение Troublemaker » 17.10.2008 00:13:44

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

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

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

Сообщение Mr.Smart » 17.10.2008 13:55:06

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

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

Смотря в какой кодировке хранятся данные в StringList.
Если в UTF-8 то не каких преобразований не нужно
Код: Выделить всё
var
list: TStringList;
s: String;
begin
...
  s:=list.Values['Имя'];
...
end;

Иначе если в cp1251 то
Код: Выделить всё
   s:=SysToUTF8(list.Values[UTF8ToSys('Имя')];
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Troublemaker » 21.10.2008 16:17:47

Очередная бяка: где сообщения об ошибках?
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 секунд:
Да, при переименовании контрола из "инспектора объектов" в исходнике всё изменяется правильно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

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

Сообщение Mr.Smart » 21.10.2008 17:53:48

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

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

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

Дело в том, что текс ошибки в своём составе имеет кириллицу. А так как при вызове raise перекодировка в UTF-8 не производится получам что видим.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Troublemaker » 22.10.2008 00:04:03

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

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

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

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

Сообщение Максим » 22.10.2008 03:41:46

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


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

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

По приведённому вами алгоритму я добился сообщения об ошибке, но оно отображается нормально (у меня версия 0.9.26.1).
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

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

Сообщение Troublemaker » 22.10.2008 04:12:56

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

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

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

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

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

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

Сообщение Максим » 22.10.2008 05:14:40

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

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

Я всё проверю и исправлю.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

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

Сообщение Troublemaker » 22.10.2008 07:06:43

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

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


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

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

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

Сообщение Mr.Smart » 22.10.2008 13:45:15

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)
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Troublemaker » 22.10.2008 14:51:44

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

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

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

Сообщение Mr.Smart » 22.10.2008 14:56:41

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

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

Ну отлови ексцепшен и посмотри
Код: Выделить всё
...
  try
    // Код с эксцепшеном
  except
    on e: Exception do
     ShowMessage(AnsiToUTF8(e.Message));
  end;
...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Troublemaker » 22.10.2008 15:46:02

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

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

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru