SAK писал(а):Ещё надо в конструкторе TStringField поставить Transliterate:=true для использования метода DataSet.Translate.
Действительно, для использования OnTranslate в FPC/Lazarus необходимо во всех строковых полях поставить Transliterate:=true. Но так как свойство TStringField.Transliterate public, а не published, то его не видно в конструкторе. Значит Transliterate:=true надо прописывать в коде. Например, в OnFormCreate:
- Код: Выделить всё
for i:= 0 to Dbf.FieldCount -1 do
if Dbf.Fields.Fields[ i ].DataType = ftString then
TStringField( Dbf.Fields.Fields[ i ] ).Transliterate:= true;
SAK писал(а):Только я когда-то пробовал и обнаружил, что есть какая-то ошибка в самом TDbf и он начинает при этом глючить. Искать ошибку не стал, т.к особой необходимости небыло.
На мой взгляд, ошибка действительно находится в TDbf. После установки Transliterate:=true строки начинают конвертиться в нужную кодовую страницу, но к ней добавляется мусор. Видимо разработчики забыли добавить #0 в конец nullterminated-строки и из-за этого появился мусор. Мусор убирается следующим образом. Надо в файле dbf.pas найти строку
- Код: Выделить всё
Result := TranslateString(FromCP, ToCP, Src, Dest, -1);
и после неё добавить
- Код: Выделить всё
Dest[Result] := #0;
Этот патч я выложил тут
https://sourceforge.net/tracker/?func=detail&aid=2967241&group_id=34085&atid=410671.
tria писал(а):Надо бы чтобы dbGrid правильно отображал текст.
dbGrid отображает русский текст вопросиками потому, что он оперирует строками в кодировке UTF8, а TDbf выдаёт их в текущей кодовой странице системы. TDbf вроде бы не рассчитан на выдачу строк сразу в UTF8. И исправлением пары строк, наверно, поддержку UTF8 не добавить. Я этот вопрос глубоко не исследовал, это моё предположение после беглого взгляда на код. Скорее всего такое плачевное состояние дел вызвано тем, что проектом TDbf давно никто не занимался. Для себя я решил проблему использования TDbf следующим образом. Везде в коде приложения после получения строки от TDbf использую AnsiToUTF8. А для корректного отображения в dbGrid сделал два обработчика для TStringField OnGetText и OnSetText:
- Код: Выделить всё
procedure TForm1.DbfSetUTF8Text(Sender: TField; const aText: string);
begin
Sender.Value := Utf8ToAnsi(aText);
end;
procedure TForm1.DbfGetUTF8Text(Sender: TField; var aText: string;
DisplayText: Boolean);
begin
aText := AnsiToUtf8(Sender.Value);
end;
Подводя итог, для полного счастья не хватает патча к TDbf добавляющего поддержку конвертации строк в UTF8.