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

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

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

Сообщение Alex333 » 24.09.2011 08:40:26

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

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

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

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

Сообщение alexs » 24.09.2011 12:18:45

Обычно нормальные СУБД уменю перекодировать строки сами.
Может начать работать с вменяемой БД, а не этим выкидышем от MS?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение Ism » 24.09.2011 14:47:35

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

для access должен быть аналог set names от mysql
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Alex333 » 24.09.2011 16:45:08

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


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

Приведите лучше 2-3 строчки кода (или сколько там получится...)
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

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

Сообщение alexs » 24.09.2011 16:53:26

Alex333 писал(а):Он нормально возвращает мне кодировку 1251.

Вот именно. 1251 - это уже не актуально. Надо, чтобы возвращал UTF8.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение Alex333 » 24.09.2011 16:58:18

Как это сделать? Тип БД определяю не я - мне надо просто читать из нее данные.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

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

Сообщение svk12 » 24.09.2011 18:02:25

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;                                                         
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

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

Сообщение Ism » 24.09.2011 19:22:35

О, обсуждения типов тяжелой формы извращений. Неужели access (точнее драйверу odbc ) нельзя приказать возвращать записи в нужной кодировке ? В данном случае utf8
См. настройки кодировки в настройках ODBC (нету под рукой, потому где конкретно - не помню).
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Alex333 » 25.09.2011 19:21:58

Привязка этого обработчика к полям выполняется в обработчике события датасета 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

Если знаете, что сюда надо написать для того, чтоб была другая кодировка - подскажите. Возможно, я действительно туплю. Но в виндовой формировалке этого файла я не нашёл таких полей. Может смотрел не туда.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

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

Сообщение Ism » 29.09.2011 14:06:39

Посмотрел, походу для 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
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Alex333 » 29.09.2011 16:57:30

Я только не пойму - чем этот лёгкий, но странный способ проще, чем 3 строчки

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

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

Меня вроде и так всё устроило. А тем более, Access-ные базы не мои (чукча не писатель - чукча читатель в данном случае).
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

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

Сообщение wwswowsogon » 02.12.2021 13:26:55

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

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

https://ibb.co/R0KcTty

https://disk.yandex.ru/d/Gg8w9kxcRahZow
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

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

Сообщение wwswowsogon » 07.12.2021 23:15:12

Добавил экспорт в Excel и .csv.

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

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

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

disk.yandex.ru/d/zuuTasTy8GKfEg
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37


Вернуться в Базы данных

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

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

Рейтинг@Mail.ru