Страница 1 из 1

Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 08:40:26
Alex333
Привет всем. Читаю данные по ODBC из MDB. Русские буквы отображаются вопросиками. Приходится для SQL - запроса создавать поля, а для них описывать примерно такое:

procedure TForm1.SQLQuery1Field1GetText(Sender: TField; var aText: string;
DisplayText: Boolean);
begin
aText:=ansitoutf8(Sender.AsString);
end;

Всё бы ничего, если я заранее знаю, какая таблица мне нужна, и что у нее за структура.
А как бы это сделать для произвольной таблицы (запроса)?
Т.е. мне как-то надо этот обработчик динамически навесить на все текстовые поля, или как тут правильно поступить? Может, есть возможность сделать это где-то один раз (типа, написать наследника TSQLQuery, в котором что-то переопределить) и забыть о проблеме?
Хорошо бы маленький примерчик, как такое сделать. У самого мозгов пока не хватает.

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 12:18:45
alexs
Обычно нормальные СУБД уменю перекодировать строки сами.
Может начать работать с вменяемой БД, а не этим выкидышем от MS?

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 14:47:35
Ism
Задать кодировку в которой будет возращать запросы mdb , несколько минут гугла и о чудо
http://www.sql.ru/Forum/actualthread.as ... 644710&hl=
http://xpoint.ru/forums/computers/dbms/ ... 7152.xhtml

для access должен быть аналог set names от mysql

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 16:45:08
Alex333
для access должен быть аналог set names от mysql


Что-то я не догоняю, причём тут Access вообще. Он нормально возвращает мне кодировку 1251. Но особенность элементов управления в Lazarus (в отличие от Delphi, где всё в порядке), такова, что им нужна кодировка utf8 для нормального отображения. Если я подключусь не к Access, а к DBF например, будет то же самое.
Просто надо где-то (не знаю где пока) переопределить метод, который возвращает вот этот самый текст, выдранный из БД (ну и, соответственно, засовывает его назад в БД) - и всё. А вот где это сделать, чтобы не писать для каждого поля?

Приведите лучше 2-3 строчки кода (или сколько там получится...)

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 16:53:26
alexs
Alex333 писал(а):Он нормально возвращает мне кодировку 1251.

Вот именно. 1251 - это уже не актуально. Надо, чтобы возвращал UTF8.

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 16:58:18
Alex333
Как это сделать? Тип БД определяю не я - мне надо просто читать из нее данные.

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 18:02:25
svk12
alexs писал(а):А вот где это сделать, чтобы не писать для каждого поля?

Приведите лучше 2-3 строчки кода (или сколько там получится...)


Для этого надо написать обработчик события OnGetText для полей DataSeta.

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

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


Привязка этого обработчика к полям выполняется в обработчике события датасета OnAfterOpen:


Код: Выделить всё
procedure TForm1.DataSetAfterOpen(DataSet: TDataSet);
var
    i:integer;
begin
  With DataSet do
  begin
    IF FieldDefs.Count>0 THEN
    begin
      for i := 0 to Pred(FieldDefs.Count) do
      BEGIN
        With Fields[i] do
        begin
           OnGetText:=AllText;
        end;
      end;
    end;
  end;
end;                                                         

Re: Русские буквы в DBGrid

СообщениеДобавлено: 24.09.2011 19:22:35
Ism
О, обсуждения типов тяжелой формы извращений. Неужели access (точнее драйверу odbc ) нельзя приказать возвращать записи в нужной кодировке ? В данном случае utf8
См. настройки кодировки в настройках ODBC (нету под рукой, потому где конкретно - не помню).

Re: Русские буквы в DBGrid

СообщениеДобавлено: 25.09.2011 19:21:58
Alex333
Привязка этого обработчика к полям выполняется в обработчике события датасета OnAfterOpen:


Ну, вот, хоть один вполне конкретный ответ - спасибо. Сделал так примерно:

Код: Выделить всё
procedure TForm1.AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
begin
   AText:=ansiToUTF8(Sender.AsString);
end;

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


Неужели access (точнее драйверу odbc ) нельзя приказать возвращать записи в нужной кодировке ?

Чего не знаю - того не знаю. У меня в DSN файле написано такое:
[ODBC]
DRIVER=Driver do Microsoft Access (*.mdb)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=MS Access
DriverId=25
DefaultDir=C:\99
DBQ=C:\99\proba.mdb

Если знаете, что сюда надо написать для того, чтоб была другая кодировка - подскажите. Возможно, я действительно туплю. Но в виндовой формировалке этого файла я не нашёл таких полей. Может смотрел не туда.

Re: Русские буквы в DBGrid

СообщениеДобавлено: 29.09.2011 14:06:39
Ism
Посмотрел, походу для access нельзя задавать кодировку чтения

Предлагаю странный но легкий способ.
Если надо только читать
1 Создаем базу firebird embedded c таблицей в той же кодировке, что и таблицы базы access (хотя можно уже в access при связывании указать кодировку в которой передавать данный)
2 Создаем в базе access запрос вставки записей в базу firebird через тотже odbc (связывание таблиц)
3 В вашей программе Lazarus посылаем запрос на выполнение сохраненного запроса в access описанного в п2 (access своими средствами кидает содержимое своей таблицы в аналогичную firebird таблицу)
4 Читаете из таблицы в базе firebird в любой кодировке устанавливая SET NAMES

Единственная загвоздка, сумеет ли Lazarus через odbc скомандовать access выполнить хранимый запрос посылающий данные в базу firebird

http://www.sql.ru/forum/actualthread.aspx?tid=846197

Re: Русские буквы в DBGrid

СообщениеДобавлено: 29.09.2011 16:57:30
Alex333
Я только не пойму - чем этот лёгкий, но странный способ проще, чем 3 строчки

for i:=0 to SQLQuery1.Fields.Count-1 do
if SQLQuery1.Fields[i].DataType=ftString then
SQLQuery1.Fields[i].OnGetText:=@AllText;

что приведены выше?

Меня вроде и так всё устроило. А тем более, Access-ные базы не мои (чукча не писатель - чукча читатель в данном случае).

Re: Русские буквы в DBGrid

СообщениеДобавлено: 02.12.2021 13:26:55
wwswowsogon
Вах, спасибо за примеры! Мне вчера потребовалось разобраться с DBF-ом, и благодаря им я смог сделать нормальную кодировку и даже состряпал небольшой просмотрщик.

Если кому нужно - забирайте! )

https://ibb.co/R0KcTty

https://disk.yandex.ru/d/Gg8w9kxcRahZow

Re: Русские буквы в DBGrid

СообщениеДобавлено: 07.12.2021 23:15:12
wwswowsogon
Добавил экспорт в Excel и .csv.

А также (УРА!) скомпилировал под Linux. Перезалил.

Единственно что, под Линухом почему-то папка не открывается через TProcess.

Возможно, дело конкретно в моём дистрибутиве.

disk.yandex.ru/d/zuuTasTy8GKfEg