-
Здравствуйте ! Скачал дистрибутив нового Лазаруса: lazarus-0.9.28.2-fpc-2.2.4-win32.exe Раньше у меня был: lazarus-0.9.22-fpc-2.0.4-20070326-win32.exe
Пока что успел заметить, что скорость компиляции заметно выше и можно снабдить проект иконкой. Используется Unicode, по крайней мере в проектах с MySQL5.
Однако появилась проблема, с которой пока не удается справиться: Вывод русских сообщений в контролы в run-time не работает (выводятся знаки ? ). Причем наблюдается такая картина: часть проектов работает нормально, а у другой - выводятся знаки ?. Более того - сейчас вожусь в проектом MySQL5, так довел его почти до конца (нормально выполнялись запросы), а затем - испортился вывод русского текста в Memo (а в StringGrid, где отображается результат запроса - нормально).
Тогда снял копию с проекта и выбросил из него все, кроме TEdit, TLabel and TButton. - Все то же. Затем добавил вторую форму frm2 с lbl11. И вот что получается:
procedure Tfrm2.Button1Click(Sender: TObject); begin lbl11.Caption:= 'Приветик, приветик'; end; // это работает нормально
procedure TfrmMain1.btnForm2Click(Sender: TObject); begin frm2.lbl11.Caption:= 'Новая форма'; // Выводит ????? ?? frm2.ShowModal; end;
procedure TfrmMain1.Button1Click(Sender: TObject); begin edHost.Text:= 'Привет'; // Выводит знаки ? Label1.Caption:= 'Привет'; // Выводит знаки ? end;
То есть как-то связано с формой? Установил идентичные свойства у форм - ничто не изменилось.
Можно ли как-то с этим справиться? Я пока что придумал только такое: создавать проект заново, сохраняя резерные копии этапов - в качестве точек отката. Помогите, пожалуйста !
-
Туман немного рассеивается. Если появляется отображение русского текста в виде знаков ??, то нужно преобразовать текст в utf8. Например, работают такие фрагменты:
procedure TfrmZaros.Button1Click(Sender: TObject); var vasa: string; begin vasa:= 'Кролик Вася'; memZapros.Lines.Append(AnsiToUtf8(vasa)); end; В мемо добавтся строка Кролик Вася
--------- procedure TfrmZaros.btnFromFileClick(Sender: TObject); var tt: textfile; busi: string; begin AssignFile(tt,'zaprosi.txt'); Reset(tt); while not eof(tt) do begin readln(tt,busi); memZapros.Lines.Append(AnsiToUtf8(busi)); end; closeFile(tt); end; В мемо нормально отобразится файл, созданный в блокноте (кодировка cp1251)
---------- Похоже, надежнее выводить все в Utf. Непонятно - почему какая-то неустойчивость: вначале вроде бы можно cp1251 выводить, потом нельзя. Где и что переключается ? Придется понаблюдать. И сделаю версию где весь текст преобразуется AnsiToUtf8.
Если у кого-нибудь есть решение этой траблы - подскажите, пожалуйста.
-
Хм. Наилучшим выходом было бы задавать все нужные переменные в строках-переменных (или типизированных константах), имеющих тип UTF8string, и не париться с кросс-преобразованием ANSI <-> UTF. К сожалению, в текущей реализации FPC, если верить вики-статье (не обновлявшейся, правда, с августа), тип UTF8string — это просто редирект на string: http://wiki.freepascal.org/FPC_Unicode_supportВпрочем, попробуйте.
-
Здравствуйте !
Спасибо, буду пробовать. Мои надежды на (И сделаю версию где весь текст преобразуется AnsiToUtf8.) провалились. Т е форма, на которой оператор edHost.Text:= 'Привет'; создает Привет в окошке edHost после переделки на edHost.Text:= AnsiToUtf8('Привет'); создает крякозябры с преобладанием символа P: Привет (надеюсь - инет передаст это) (это было на 3-й форме) А сейчас добавил это (AnsiToUtf8 - на 1-й форме) и теперь форма испортилась, т е после удаления AnsiToUtf8 не хочет показывать нормально (понравилось ?! ). Придется вернуть AnsiToUtf8 !
Есть подозрение еще на одну вещь: с некоторых пор у меня проблемы с переключением рус/лат. Как бы в буфере клавиатуры остается код клавиши Alt. В результате остаются подчеркивания в пунктах меню (соответствующие горячим клавишам) и происходит срабатывание этих пунктов меню, когда начинаю набирать текст. Но это вероятно только у меня.
-
Здравствуйте !
Действительно, UTF8String описан в Файле systemh.inc UTF8String = type ansistring; PUTF8String = ^UTF8String;
Удивительно также, что если Const Privet: UTF8string = 'Привет'; ... то оказывается, что Privet - пустая строка (lena = 0, edHost пустое) edHost.Text := Privet; lena:= strlen(pchar(privet)); edLog.Text:= inttostr(lena);
а если Privet: UTF8string = 'Privet'; то все ОК Но зато понял, что стал неправильно нажимать Alt-Shift !
---------- Наверное, к трабле привыкну как-нибудь, а далее что-нибудь прояснится.
-
Здравствуйте !
Прояснилось вот что: 1. Все же UTF предпочтительнее в наше время 2. В редакторе Лазаруса можно изменять кодировку исходников. Для этого: правый щелчок, выбрать Параметры файла/Кодировка и установить птичку на нужную кодировку. Далее в окошке Смена кодировки выбрать Изменить файл. Файл будет перекодирован. Так нужно перекодировать *.pas *.lfm
|