Lazarus и .dbf

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

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

Lazarus и .dbf

Сообщение flowdoc » 17.12.2014 17:38:40

Доброго времени!
Помогите с кодировкой.
Кидаю на форму DataSource1: TDataSource, Dbf1: TDbf, DBGrid1: TDBGrid.
В Dbf1 указываю базу данных (.dbf). Но DBGrid1 отображает квакозябры вместо русского текста. Как это можно исправить?
Платформа: Linux.
Скрин во вложении
У вас нет необходимых прав для просмотра вложений в этом сообщении.
flowdoc
новенький
 
Сообщения: 22
Зарегистрирован: 17.12.2014 17:26:45

Re: Lazarus и .dbf

Сообщение kosteek » 17.12.2014 20:40:07

Код: Выделить всё
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;

...
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Lazarus и .dbf

Сообщение flowdoc » 18.12.2014 07:24:11

Спасибо, помогло!
flowdoc
новенький
 
Сообщения: 22
Зарегистрирован: 17.12.2014 17:26:45

Re: Lazarus и .dbf

Сообщение *Rik* » 18.12.2014 22:01:16

flowdoc
Могу предложить вам клон TDBF адаптированный для работы с кодовыми страницами 866 и 1251.
Если кодировка прописана в DBF, то она применяется автоматически при открытии, в противном случае кодировка устанавливается штатными методами через DBFGlobals.DefaultOpenCodePage. Работают SetRange и т.д. причем диапазон задается в UTF8. Всё кроссплатформенно.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Lazarus и .dbf

Сообщение flowdoc » 23.12.2014 11:22:07

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;


Если вводить числа то работает, если текст, то ничего не фильтрует...подозреваю что проблема в кодировке...может кто знает как решить проблему?
flowdoc
новенький
 
Сообщения: 22
Зарегистрирован: 17.12.2014 17:26:45

Re: Lazarus и .dbf

Сообщение kosteek » 23.12.2014 12:34:10

Код: Выделить всё
dbf1.Filter:='NAME='+'"'+UTF8toCP1251(Edit1.Text)+'*"';
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Lazarus и .dbf

Сообщение flowdoc » 23.12.2014 12:39:40

kosteek писал(а):
Код: Выделить всё
dbf1.Filter:='NAME='+'"'+UTF8toCP1251(Edit1.Text)+'*"';

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

Re: Lazarus и .dbf

Сообщение hovadur » 25.12.2014 22:58:17

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;
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron