Lazarus и .dbf

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

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

Ответить
flowdoc
новенький
Сообщения: 22
Зарегистрирован: 17.12.2014 16:26:45

Lazarus и .dbf

Сообщение flowdoc »

Доброго времени!
Помогите с кодировкой.
Кидаю на форму DataSource1: TDataSource, Dbf1: TDbf, DBGrid1: TDBGrid.
В Dbf1 указываю базу данных (.dbf). Но DBGrid1 отображает квакозябры вместо русского текста. Как это можно исправить?
Платформа: Linux.
Скрин во вложении
У вас нет необходимых прав для просмотра вложений в этом сообщении.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

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

uses ...LConvEncoding, LazUTF8;

...
type

  { TForm1 }

  TForm1 = class(TForm)
 ...
    procedure AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
...

procedure TForm1.AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
begin
   AText:= CP1251ToUTF8(Sender.AsString);
end;

procedure TForm1.Dbf1AfterOpen(DataSet: TDataSet);
var i:Integer;
begin
  for i:=0 to Dbf1.Fields.Count-1 do
    if Dbf1.Fields[i].DataType=ftString then
      Dbf1.Fields[i].OnGetText:=@AllText;
end;

...
flowdoc
новенький
Сообщения: 22
Зарегистрирован: 17.12.2014 16:26:45

Сообщение flowdoc »

Спасибо, помогло!
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

flowdoc
Могу предложить вам клон TDBF адаптированный для работы с кодовыми страницами 866 и 1251.
Если кодировка прописана в DBF, то она применяется автоматически при открытии, в противном случае кодировка устанавливается штатными методами через DBFGlobals.DefaultOpenCodePage. Работают SetRange и т.д. причем диапазон задается в UTF8. Всё кроссплатформенно.
flowdoc
новенький
Сообщения: 22
Зарегистрирован: 17.12.2014 16:26:45

Сообщение flowdoc »

kosteek писал(а):

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

uses ...LConvEncoding, LazUTF8;

...
type

  { TForm1 }

  TForm1 = class(TForm)
 ...
    procedure AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
...

procedure TForm1.AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
begin
   AText:= CP1251ToUTF8(Sender.AsString);
end;

procedure TForm1.Dbf1AfterOpen(DataSet: TDataSet);
var i:Integer;
begin
  for i:=0 to Dbf1.Fields.Count-1 do
    if Dbf1.Fields[i].DataType=ftString then
      Dbf1.Fields[i].OnGetText:=@AllText;
end;

...



Таким образом конвертируется и показывается нормально. Но свойство filter работает почему то только с числами, а при попытке искать по тексту - не находит(((
Добавляю Edit1 и пишу обработчик:

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

procedure TForm1.Edit1Change(Sender: TObject);
begin   
Dbf1.Filtered:=false;
dbf1.Filter:='NAME='+'"'+Edit1.Text+'*"';
Dbf1.Filtered:=true;
end;


Если вводить числа то работает, если текст, то ничего не фильтрует...подозреваю что проблема в кодировке...может кто знает как решить проблему?
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

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

dbf1.Filter:='NAME='+'"'+UTF8toCP1251(Edit1.Text)+'*"';
flowdoc
новенький
Сообщения: 22
Зарегистрирован: 17.12.2014 16:26:45

Сообщение flowdoc »

kosteek писал(а):

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

dbf1.Filter:='NAME='+'"'+UTF8toCP1251(Edit1.Text)+'*"';

Это не помогает
hovadur
постоялец
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Сообщение hovadur »

flowdoc писал(а):Помогите с кодировкой.

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

uses
  LConvEncoding;

function TForm1.OnTranslate(Dbf: TDbf; Src, Dest: PChar; ToOem: Boolean): Integer;
var
  S, Encoding: String;
begin
  if (Dbf.CodePage = 1251) and (Dbf.LanguageID = 201) then
    Encoding := 'cp1251'
  else
    Encoding := 'cp866';
  if ToOem then
    S := ConvertEncoding(Src, 'utf8', Encoding)
  else
    S := ConvertEncoding(Src, Encoding, 'utf8');
  StrCopy(Dest, PChar(S));
  Result := StrLen(Dest);
end;

    Dbf.OnTranslate := @OnTranslate;
Ответить