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

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

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

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

Сообщение alex_rain » 12.02.2010 07:25:18

Как заставить 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
alex_rain
новенький
 
Сообщения: 26
Зарегистрирован: 12.02.2010 06:56:32
Откуда: Russia

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

Сообщение v-t-l » 12.02.2010 11:16:37

.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Mr.Smart » 12.02.2010 11:20:04

v-t-l
:mrgreen: :mrgreen: :mrgreen:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение v-t-l » 12.02.2010 16:10:01

Вообще надо бы обвести мигающим красным непосредственно на сайте. :D
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение alex_rain » 13.02.2010 18:52:30

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;
alex_rain
новенький
 
Сообщения: 26
Зарегистрирован: 12.02.2010 06:56:32
Откуда: Russia


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru