TDbf и DOS-кодировка файла

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

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

Ответить
alex_rain
новенький
Сообщения: 26
Зарегистрирован: 12.02.2010 05:56:32
Откуда: Russia

TDbf и DOS-кодировка файла

Сообщение alex_rain »

Как заставить TDbf корректно прочитать файл dbf с кодировкой 866 и отобразить содержимое в TDBGrid?
Вместо русских букв отображаются знаки вопроса и квадраты.
Пробовал следующее:

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

  Dbf1.LanguageID := DbfLangId_RUS_866;
  Dbf1.TableLevel := 4;
  Dbf1.Active := True;

Никаких изменений. Какую кодировку использует TDbf по умолчанию и можно ли перекодировать строки перед отображением?
Lazarus 0.9.28.3 FPC 2.4.0
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

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

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

v-t-l
:mrgreen: :mrgreen: :mrgreen:
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Вообще надо бы обвести мигающим красным непосредственно на сайте. :D
alex_rain
новенький
Сообщения: 26
Зарегистрирован: 12.02.2010 05:56:32
Откуда: Russia

Сообщение alex_rain »

v-t-l - ха, ха. :D

Вопрос решен:

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

uses 
  ... synachar, Windows;
...
procedure TForm1.RecodeDbf(Oem: boolean);
var
  n:   integer;
  str: string;
begin
  n := 0;
  StringGrid1.RowCount := 1;
  if Oem then
    Dbf1.TableName := 'test_866.dbf'
  else
    Dbf1.TableName := 'test_1251.dbf';
  Dbf1.Active := True;
  StringGrid1.RowCount := Succ(Dbf1.RecordCount);
  Dbf1.First;
  while not Dbf1.EOF do
  begin
    str := Dbf1.Fields[1].AsString;
    if Oem then
      OemToChar(PChar(str), PChar(str));
    str := CharsetConversion(str, CP1251, UTF_8);
    Inc(n);
    StringGrid1.Cells[1, n] := IntToStr(Dbf1.Fields[0].AsInteger);
    StringGrid1.Cells[2, n] := str;
    Dbf1.Next;
  end;
  Dbf1.Active := False;
end;
Ответить