Lazarus и .dbf
Модератор: Модераторы
Lazarus и .dbf
Доброго времени!
Помогите с кодировкой.
Кидаю на форму DataSource1: TDataSource, Dbf1: TDbf, DBGrid1: TDBGrid.
В Dbf1 указываю базу данных (.dbf). Но DBGrid1 отображает квакозябры вместо русского текста. Как это можно исправить?
Платформа: Linux.
Скрин во вложении
Помогите с кодировкой.
Кидаю на форму DataSource1: TDataSource, Dbf1: TDbf, DBGrid1: TDBGrid.
В Dbf1 указываю базу данных (.dbf). Но DBGrid1 отображает квакозябры вместо русского текста. Как это можно исправить?
Платформа: Linux.
Скрин во вложении
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Код: Выделить всё
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;
...Спасибо, помогло!
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
flowdoc
Могу предложить вам клон TDBF адаптированный для работы с кодовыми страницами 866 и 1251.
Если кодировка прописана в DBF, то она применяется автоматически при открытии, в противном случае кодировка устанавливается штатными методами через DBFGlobals.DefaultOpenCodePage. Работают SetRange и т.д. причем диапазон задается в UTF8. Всё кроссплатформенно.
Могу предложить вам клон TDBF адаптированный для работы с кодовыми страницами 866 и 1251.
Если кодировка прописана в DBF, то она применяется автоматически при открытии, в противном случае кодировка устанавливается штатными методами через DBFGlobals.DefaultOpenCodePage. Работают SetRange и т.д. причем диапазон задается в UTF8. Всё кроссплатформенно.
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;
Если вводить числа то работает, если текст, то ничего не фильтрует...подозреваю что проблема в кодировке...может кто знает как решить проблему?
Код: Выделить всё
dbf1.Filter:='NAME='+'"'+UTF8toCP1251(Edit1.Text)+'*"';kosteek писал(а):Код: Выделить всё
dbf1.Filter:='NAME='+'"'+UTF8toCP1251(Edit1.Text)+'*"';
Это не помогает
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;
