Конференция "FreePascal" » Проблема русификации в Лазрусе (lazarus-0.9.28.2-fpc-2.2.4-win32) [Win32]
 
  • Winni (21.02.10 06:08) [0]
    Здравствуйте !
    Скачал дистрибутив нового Лазаруса: 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;

    То есть как-то связано с формой? Установил идентичные свойства у форм - ничто не изменилось.

    Можно ли как-то с этим справиться?
    Я пока что придумал только такое: создавать проект заново, сохраняя резерные
    копии этапов - в качестве точек отката.
    Помогите, пожалуйста !
  • Winni (21.02.10 22:42) [1]
    Туман немного рассеивается.
    Если появляется отображение русского текста в виде знаков ??,
    то нужно преобразовать текст в 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.

    Если у кого-нибудь есть решение этой траблы - подскажите, пожалуйста.
  • 0x00FF00 (22.02.10 19:06) [2]
    Хм.
    Наилучшим выходом было бы задавать все нужные переменные в строках-переменных (или типизированных константах), имеющих тип UTF8string, и не париться с кросс-преобразованием ANSI <-> UTF.

    К сожалению, в текущей реализации FPC, если верить вики-статье (не обновлявшейся, правда, с августа), тип UTF8string — это просто редирект на string:
    http://wiki.freepascal.org/FPC_Unicode_support

    Впрочем, попробуйте.
  • Winni (23.02.10 22:54) [3]
    Здравствуйте !

    Спасибо, буду пробовать. Мои надежды на
    (И сделаю версию где весь текст преобразуется AnsiToUtf8.)
    провалились. Т е форма, на которой оператор
    edHost.Text:= 'Привет';  создает Привет в окошке edHost
    после переделки на
    edHost.Text:= AnsiToUtf8('Привет');
    создает крякозябры с преобладанием символа P:
    Привет (надеюсь - инет передаст это)
    (это было на 3-й форме)
    А сейчас добавил это (AnsiToUtf8 - на 1-й форме) и теперь форма испортилась,
    т е после удаления AnsiToUtf8 не хочет показывать нормально
    (понравилось ?! ). Придется вернуть AnsiToUtf8 !

    Есть подозрение еще на одну вещь: с некоторых пор у меня проблемы с
    переключением рус/лат. Как бы в буфере клавиатуры остается код клавиши
    Alt.  В результате остаются подчеркивания в пунктах меню (соответствующие
    горячим клавишам) и происходит срабатывание этих пунктов меню, когда начинаю набирать текст. Но это вероятно только у меня.
  • Winni (24.02.10 07:43) [4]
    Здравствуйте !

    Действительно, 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 !

    ----------
    Наверное, к трабле привыкну как-нибудь, а далее что-нибудь прояснится.
  • Winni (06.03.10 07:31) [5]
    Здравствуйте !

    Прояснилось  вот что:
    1. Все же UTF предпочтительнее в наше время
    2. В редакторе Лазаруса можно изменять кодировку исходников.
    Для этого: правый щелчок, выбрать Параметры файла/Кодировка
    и установить птичку на нужную кодировку. Далее в окошке Смена кодировки
    выбрать Изменить файл. Файл будет перекодирован. Так нужно перекодировать
    *.pas *.lfm
 
Конференция "FreePascal" » Проблема русификации в Лазрусе (lazarus-0.9.28.2-fpc-2.2.4-win32) [Win32]
Есть новые Нет новых   [118677   +68][b:0][p:0]