Русские буквы в DBGrid
Модератор: Модераторы
Русские буквы в DBGrid
Привет всем. Читаю данные по ODBC из MDB. Русские буквы отображаются вопросиками. Приходится для SQL - запроса создавать поля, а для них описывать примерно такое:
procedure TForm1.SQLQuery1Field1GetText(Sender: TField; var aText: string;
DisplayText: Boolean);
begin
aText:=ansitoutf8(Sender.AsString);
end;
Всё бы ничего, если я заранее знаю, какая таблица мне нужна, и что у нее за структура.
А как бы это сделать для произвольной таблицы (запроса)?
Т.е. мне как-то надо этот обработчик динамически навесить на все текстовые поля, или как тут правильно поступить? Может, есть возможность сделать это где-то один раз (типа, написать наследника TSQLQuery, в котором что-то переопределить) и забыть о проблеме?
Хорошо бы маленький примерчик, как такое сделать. У самого мозгов пока не хватает.
procedure TForm1.SQLQuery1Field1GetText(Sender: TField; var aText: string;
DisplayText: Boolean);
begin
aText:=ansitoutf8(Sender.AsString);
end;
Всё бы ничего, если я заранее знаю, какая таблица мне нужна, и что у нее за структура.
А как бы это сделать для произвольной таблицы (запроса)?
Т.е. мне как-то надо этот обработчик динамически навесить на все текстовые поля, или как тут правильно поступить? Может, есть возможность сделать это где-то один раз (типа, написать наследника TSQLQuery, в котором что-то переопределить) и забыть о проблеме?
Хорошо бы маленький примерчик, как такое сделать. У самого мозгов пока не хватает.
Задать кодировку в которой будет возращать запросы mdb , несколько минут гугла и о чудо
http://www.sql.ru/Forum/actualthread.as ... 644710&hl=
http://xpoint.ru/forums/computers/dbms/ ... 7152.xhtml
для access должен быть аналог set names от mysql
http://www.sql.ru/Forum/actualthread.as ... 644710&hl=
http://xpoint.ru/forums/computers/dbms/ ... 7152.xhtml
для access должен быть аналог set names от mysql
для access должен быть аналог set names от mysql
Что-то я не догоняю, причём тут Access вообще. Он нормально возвращает мне кодировку 1251. Но особенность элементов управления в Lazarus (в отличие от Delphi, где всё в порядке), такова, что им нужна кодировка utf8 для нормального отображения. Если я подключусь не к Access, а к DBF например, будет то же самое.
Просто надо где-то (не знаю где пока) переопределить метод, который возвращает вот этот самый текст, выдранный из БД (ну и, соответственно, засовывает его назад в БД) - и всё. А вот где это сделать, чтобы не писать для каждого поля?
Приведите лучше 2-3 строчки кода (или сколько там получится...)
Как это сделать? Тип БД определяю не я - мне надо просто читать из нее данные.
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;
О, обсуждения типов тяжелой формы извращений. Неужели access (точнее драйверу odbc ) нельзя приказать возвращать записи в нужной кодировке ? В данном случае utf8
См. настройки кодировки в настройках ODBC (нету под рукой, потому где конкретно - не помню).
Привязка этого обработчика к полям выполняется в обработчике события датасета 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
Если знаете, что сюда надо написать для того, чтоб была другая кодировка - подскажите. Возможно, я действительно туплю. Но в виндовой формировалке этого файла я не нашёл таких полей. Может смотрел не туда.
Посмотрел, походу для 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
Предлагаю странный но легкий способ.
Если надо только читать
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
Я только не пойму - чем этот лёгкий, но странный способ проще, чем 3 строчки
for i:=0 to SQLQuery1.Fields.Count-1 do
if SQLQuery1.Fields[i].DataType=ftString then
SQLQuery1.Fields[i].OnGetText:=@AllText;
что приведены выше?
Меня вроде и так всё устроило. А тем более, Access-ные базы не мои (чукча не писатель - чукча читатель в данном случае).
for i:=0 to SQLQuery1.Fields.Count-1 do
if SQLQuery1.Fields[i].DataType=ftString then
SQLQuery1.Fields[i].OnGetText:=@AllText;
что приведены выше?
Меня вроде и так всё устроило. А тем более, Access-ные базы не мои (чукча не писатель - чукча читатель в данном случае).
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
Вах, спасибо за примеры! Мне вчера потребовалось разобраться с DBF-ом, и благодаря им я смог сделать нормальную кодировку и даже состряпал небольшой просмотрщик.
Если кому нужно - забирайте! )
https://ibb.co/R0KcTty
https://disk.yandex.ru/d/Gg8w9kxcRahZow
Если кому нужно - забирайте! )
https://ibb.co/R0KcTty
https://disk.yandex.ru/d/Gg8w9kxcRahZow
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
Добавил экспорт в Excel и .csv.
А также (УРА!) скомпилировал под Linux. Перезалил.
Единственно что, под Линухом почему-то папка не открывается через TProcess.
Возможно, дело конкретно в моём дистрибутиве.
disk.yandex.ru/d/zuuTasTy8GKfEg
А также (УРА!) скомпилировал под Linux. Перезалил.
Единственно что, под Линухом почему-то папка не открывается через TProcess.
Возможно, дело конкретно в моём дистрибутиве.
disk.yandex.ru/d/zuuTasTy8GKfEg
