Страница 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 12:26:55
wwswowsogon
Вах, спасибо за примеры! Мне вчера потребовалось разобраться с DBF-ом, и благодаря им я смог сделать нормальную кодировку и даже состряпал небольшой просмотрщик.
Если кому нужно - забирайте! )
https://ibb.co/R0KcTtyhttps://disk.yandex.ru/d/Gg8w9kxcRahZow
Re: Русские буквы в DBGrid
Добавлено: 07.12.2021 22:15:12
wwswowsogon
Добавил экспорт в Excel и .csv.
А также (УРА!) скомпилировал под Linux. Перезалил.
Единственно что, под Линухом почему-то папка не открывается через TProcess.
Возможно, дело конкретно в моём дистрибутиве.
disk.yandex.ru/d/zuuTasTy8GKfEg