WIN1251 в БД

Вопросы программирования и использования среды Lazarus.

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

Re: WIN1251 в БД

Сообщение SergeyDV » 25.12.2008 13:59:29

ink писал(а):В лазарусе 0.9.26 при подключении к firebird 1.5 в компоненте IBConnection устанавливаю свойство CharSet = WIN1251Для правильного отображения кириллицы в гриде (DBGrid-DataSource-TSQLQuery-IBConnection) достаточно в свойство грида onDrawColumnCell добавитьprocedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);begin DBGrid1.Canvas.TextOut(Rect.left,Rect.Top + 1,AnsitoUTF8(column.Field.Text));end; Если грид привязан к DBF файлу с 866 кодировкой то column.Field.Text необходимо сначала преобразовать OEMToChar в 1251А вот при работе с полями приходится их конвертировать в UTF8... AnsiToUTF8, а при записи в базу обратно в 1251.....


Да работает!
Но Вам не кажется, что это как то через .... :oops:
Может стоит в компанент Dataset или Query добавить свойство CharSet ?
Пусть набор данных сам конвертит!
SergeyDV
новенький
 
Сообщения: 18
Зарегистрирован: 18.12.2008 22:22:31

Re: WIN1251 в БД

Сообщение ink » 25.12.2008 15:12:26

Да, это протез, я не спорю. Годится для переходного (на юникоды ) периода.
Хотя я не думаю, что все кинутся переводить данные в БД в юникод, тем более , что это не во всех случаях возможно.
Поэтому неплохо ввести для компонент, работающих с БД, свойства TranslateTo и TranslateFrom. Или Charset.
Вопрос к разработчикам.
ink
незнакомец
 
Сообщения: 3
Зарегистрирован: 25.12.2008 12:00:53

Re: WIN1251 в БД

Сообщение SAK » 25.12.2008 21:03:17

SergeyDV писал(а):to SAK: В файле fields.inc свойство Transliterate изменил на true.

А в каком месте? Это надо сделать в конструкторе TStringField:
Код: Выделить всё
constructor TStringField.Create(AOwner: TComponent);
begin
<.........>
  FTransliterate := True;
end;

SergeyDV писал(а):Так и не смог наити TSQLQuery.Translate... Правда я непонял почему именно для SQLQuery надо добавлять этот метод

Его там видимо просто нет. А где писать впринципе не важно, но если мы это напишем в TSQLQuery, то это коснётся только его, а в TDataSet это повлияет на всех наследников если они не перекроют этот метод.

Добавлено спустя 17 минут:
И ещё пересобирать надо не только Lazarus, но и FPC, а точнее пакет fcl-db, т.к. возможно, что при пересборке лазаря он остался старым.
Кроме того этого недостаточно для перекодирования blob полей, для них надо дорабатывать код непосредственно TSQLQuery.

Добавлено спустя 7 минут 36 секунд:
SergeyDV писал(а):Может стоит в компанент Dataset или Query добавить свойство CharSet ?
Пусть набор данных сам конвертит!

Ну я так и делаю, только в своём собственном компоненте для работы с DBF файлами. Прекрасно работает с таблицами как в 1251 так и в 866 кодировке.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: WIN1251 в БД

Сообщение SergeyDV » 26.12.2008 15:53:49

Да, да! Именно там и менял...
Тогда другой вопрос как пересобрать FPC?
SergeyDV
новенький
 
Сообщения: 18
Зарегистрирован: 18.12.2008 22:22:31

Re: WIN1251 в БД

Сообщение SAK » 26.12.2008 21:45:33

У меня FPC установлен отдльно, поэтому сначала в его папке делаю make clean, make all, make install, потом уже пересобираю лазаря. Для проверки можно посмотреть дату модификации файла db.ppu.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: WIN1251 в БД

Сообщение whs » 22.09.2015 06:54:57

ink писал(а):В лазарусе 0.9.26 при подключении к firebird 1.5 в компоненте IBConnection устанавливаю свойство CharSet = WIN1251
Для правильного отображения кириллицы в гриде (DBGrid-DataSource-TSQLQuery-IBConnection) достаточно
в свойство грида onDrawColumnCell добавить

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DBGrid1.Canvas.TextOut(Rect.left,Rect.Top + 1,AnsitoUTF8(column.Field.Text));
end;

Если грид привязан к DBF файлу с 866 кодировкой то column.Field.Text необходимо сначала преобразовать OEMToChar в 1251
А вот при работе с полями приходится их конвертировать в UTF8... AnsiToUTF8, а при записи в базу обратно в 1251.....


К этой методе еще надо добавить и преобразование Caption у столбцов что-то вроде

Код: Выделить всё
For i:=0 To DBGrid1.Columns.Count-1 Do
    begin
    DBGrid1.Columns.Items[i].Title.Caption:=AnsitoUTF8(DBGrid1.Columns.Items[i].Title.Caption);
    end;     
Аватара пользователя
whs
новенький
 
Сообщения: 28
Зарегистрирован: 03.04.2010 18:07:44

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru