WIN1251 в БД

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

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

SergeyDV
новенький
Сообщения: 18
Зарегистрирован: 18.12.2008 21:22:31

Сообщение SergeyDV »

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 ?
Пусть набор данных сам конвертит!
ink
незнакомец
Сообщения: 3
Зарегистрирован: 25.12.2008 11:00:53

Сообщение ink »

Да, это протез, я не спорю. Годится для переходного (на юникоды ) периода.
Хотя я не думаю, что все кинутся переводить данные в БД в юникод, тем более , что это не во всех случаях возможно.
Поэтому неплохо ввести для компонент, работающих с БД, свойства TranslateTo и TranslateFrom. Или Charset.
Вопрос к разработчикам.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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 кодировке.
SergeyDV
новенький
Сообщения: 18
Зарегистрирован: 18.12.2008 21:22:31

Сообщение SergeyDV »

Да, да! Именно там и менял...
Тогда другой вопрос как пересобрать FPC?
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

У меня FPC установлен отдльно, поэтому сначала в его папке делаю make clean, make all, make install, потом уже пересобираю лазаря. Для проверки можно посмотреть дату модификации файла db.ppu.
Аватара пользователя
whs
новенький
Сообщения: 28
Зарегистрирован: 03.04.2010 18:07:44

Сообщение whs »

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;     
Ответить