Перевод проекта Delphi на Lazarus

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

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

Перевод проекта Delphi на Lazarus

Сообщение lemon » 13.04.2011 03:41:25

Привет !

Пытаюсь перенести проект Delphi на Lazarus .
Проект работает с таблицами DBF ( DOS 866 RUS) и Interbase ( кодировка WIN1251 RUS).
При открытии таблиц в проекте Lazarus в полях таблиц вместо русских слов стоит не читаемый набор символов .
Что надо сделать ?

http://project1.fo.ru/image/1014/2664_s ... 000003.jpg

Пример таблицы
http://project1.fo.ru/file/944/2080_TEST.DBF

Проект Delphi
http://project1.fo.ru/file/944/2076_866Delphi.rar

Проект Lazarus
http://project1.fo.ru/file/944/2078_866Lazarus.rar
lemon
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.04.2011 03:30:44

Re: Перевод проекта Delphi на Lazarus

Сообщение mad_nazgul » 13.04.2011 07:06:30

Здравствуйте

Для CP866
смотреть в сторону
OemToChar
mad_nazgul
новенький
 
Сообщения: 10
Зарегистрирован: 20.04.2009 19:28:50

Re: Перевод проекта Delphi на Lazarus

Сообщение alexs » 13.04.2011 08:47:52

lemon писал(а):Проект работает с таблицами DBF ( DOS 866 RUS) и Interbase ( кодировка WIN1251 RUS).
При открытии таблиц в проекте Lazarus в полях таблиц вместо русских слов стоит не читаемый набор символов .


dbf сконвертировать в utf8
в Interbase при подключении указать клиентскую кодировку utf8
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Перевод проекта Delphi на Lazarus

Сообщение lemon » 13.04.2011 09:37:16

alexs писал(а):
lemon писал(а):Проект работает с таблицами DBF ( DOS 866 RUS) и Interbase ( кодировка WIN1251 RUS).
При открытии таблиц в проекте Lazarus в полях таблиц вместо русских слов стоит не читаемый набор символов .


dbf сконвертировать в utf8
в Interbase при подключении указать клиентскую кодировку utf8


Спасибо .

А чем и как конвертировать dbf в utf8 ?

И какой компонет Lazarus лучше использовать для подключения к Interbase ?
lemon
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.04.2011 03:30:44

Re: Перевод проекта Delphi на Lazarus

Сообщение alexs » 13.04.2011 22:58:09

lemon писал(а):А чем и как конвертировать dbf в utf8 ?

Конвертер пишется в 5 строк :-)
lemon писал(а):в Interbase при подключении указать клиентскую кодировку utf8

Ну я не буду оригинальным - UIB + FBDataSet :lol: (если там действительно Interbase, а не FireBird - заодно потестишь, как с ним работа обстоит)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Перевод проекта Delphi на Lazarus

Сообщение lemon » 14.04.2011 01:12:50

alexs писал(а):
lemon писал(а):А чем и как конвертировать dbf в utf8 ?

Конвертер пишется в 5 строк :-)


Увы :) , Этот ответ не решает моей проблемы .
Я никогда этого не делал .

А посему , второй вопрос :
Какие это 5 строк и на чем ?
lemon
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.04.2011 03:30:44

Re: Перевод проекта Delphi на Lazarus

Сообщение Vadim » 14.04.2011 03:58:29

lemon писал(а):Какие это 5 строк и на чем ?

На том, что у Вас уже есть. :) Если Вы используете компонент TDbf, то перекодировка будет выглядеть примерно так:
Код: Выделить всё
Dbf1.First;
Dbf1.Edit;
For i:=0 To Dbf1.RecordCount-1 Do
  Dbf1.FieldByName('Текстовое_поле').AsString:=ConsoleToUtf8(Dbf1.FieldByName('Текстовое_поле').AsString);

Предварительно нужно выяснить коэффициент отношения максимальной длины строки, которая хранится в текстовом поле к длине самого поля. Если он больше, чем 1/2, то длину поля следует увеличить до соблюдения этого коэффициента, т.к. русский символ в кодировке UTF8 занимает 2 байта, а не один.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Перевод проекта Delphi на Lazarus

Сообщение lemon » 14.04.2011 04:47:16

alexs писал(а):
lemon писал(а):А чем и как конвертировать dbf в utf8 ?

Конвертер пишется в 5 строк :-)
lemon писал(а):в Interbase при подключении указать клиентскую кодировку utf8

Ну я не буду оригинальным - UIB + FBDataSet :lol: (если там действительно Interbase, а не FireBird - заодно потестишь, как с ним работа обстоит)


Вопрос : UIB + FBDataSet - это два разных компонента ?
Где взять FBDataSet - нашел .
Как его правильно ставить ? ( Пакет, Открыть файл пакета (lpk) ? там три пакета dcl_fb_id_dataset , fbdemofpc ,uibeditors)
А где взять UIB ?

PS Вопросов много ! Все впервые .

Добавлено спустя 1 час 15 минут 15 секунд:
Пробую ставить FBDataSet
Открыть файл пакета (lpk)
Там три пакета dcl_fb_id_dataset , fbdemofpc ,uibeditors)
Получил сообщение :
C:lazarus_libFBDataSetfbcustomdataset.pas(1,1) Fatal: Can't find unit jvuiblib used by fbcustomdataset

Как правильно ставить FBDataSet ?

Добавлено спустя 2 минуты 54 секунды:
И еще , такой вопросик :

Какие компоненты из UIB + FBDataSet положить на форму ,
что бы получить доступ к InterBase таблицам ?

Добавлено спустя 14 минут 57 секунд:
Подключаю компонент UIBDataBase к InterBase базе содержащей таблицы с кодировкой WIN1251 ,
Если кодировку в свойствах CharacterSet оставить WIN1251 - то подключается .
Если кодировку ставить UTF8 - то нет и пишет character set UTF8 is not defined .

Где нужно подправить еще ?

Добавлено спустя 8 минут 42 секунды:
И так, что получилось :

На форму разместил:

1 UIDataBase1 , в свойствах указано

DatabaseName = interbaseserrv:/current/db/base1.gdb
CharacterSet =csWIN1251

2 UIDataSet1
3 UIBTransaction1
4 Datasource1
5 TDBGreed1

И так , 5 компонентов .

В гриде появляется таблица .где вместо русских букв стоят вопросы .
Как лечить ?
Если при смене CharacterSet =csUTF8
к базе невозможно подключиться ? пишет character set UTF8 is not defined .

Добавлено спустя 1 минуту 1 секунду:
Я вообще не использовал ни одного компонента из FBDataSet .
Может он и не нужет тут .

Добавлено спустя 2 минуты 57 секунд:
alexs писал(а):Ну я не буду оригинальным - UIB + FBDataSet :lol: (если там действительно Interbase, а не FireBird - заодно потестишь, как с ним работа обстоит)


Может тут FBDataSet вообще не нужен ???
Я же без него получил доступ к базе .
Или я что-то не так делаю ?

Добавлено спустя 3 минуты 19 секунд:
Vadim писал(а):
lemon писал(а):Какие это 5 строк и на чем ?

На том, что у Вас уже есть. :) Если Вы используете компонент TDbf, то перекодировка будет выглядеть примерно так:
Код: Выделить всё
Dbf1.First;
Dbf1.Edit;
For i:=0 To Dbf1.RecordCount-1 Do
  Dbf1.FieldByName('Текстовое_поле').AsString:=ConsoleToUtf8(Dbf1.FieldByName('Текстовое_поле').AsString);

Предварительно нужно выяснить коэффициент отношения максимальной длины строки, которая хранится в текстовом поле к длине самого поля. Если он больше, чем 1/2, то длину поля следует увеличить до соблюдения этого коэффициента, т.к. русский символ в кодировке UTF8 занимает 2 байта, а не один.



попробую , спасибо !!!

Добавлено спустя 22 минуты 18 секунд:
Vadim писал(а):
lemon писал(а):Какие это 5 строк и на чем ?

На том, что у Вас уже есть. :) Если Вы используете компонент TDbf, то перекодировка будет выглядеть примерно так:
Код: Выделить всё
Dbf1.First;
Dbf1.Edit;
For i:=0 To Dbf1.RecordCount-1 Do
  Dbf1.FieldByName('Текстовое_поле').AsString:=ConsoleToUtf8(Dbf1.FieldByName('Текстовое_поле').AsString);

Предварительно нужно выяснить коэффициент отношения максимальной длины строки, которая хранится в текстовом поле к длине самого поля. Если он больше, чем 1/2, то длину поля следует увеличить до соблюдения этого коэффициента, т.к. русский символ в кодировке UTF8 занимает 2 байта, а не один.


Так, сделал . Что то не заработало .
Вот результат :
http://project1.fo.ru/image/1014/2906_s ... 000004.jpg

Впервой строке должно быть слово "солнце"
( отработал только первую строчку , по все мне стал )
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var i:integer ;
begin

Dbf1.First;
Dbf1.Edit;
For i:=0 To Dbf1.RecordCount-1 Do
  Dbf1.FieldByName('FIL').AsString:=ConsoleToUtf8(Dbf1.FieldByName('FIL').AsString);

end;   


Добавлено спустя 5 минут 24 секунды:
Вот сам проект
http://project1.fo.ru/file/944/2200_866 ... 4-2011.rar
lemon
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.04.2011 03:30:44

Re: Перевод проекта Delphi на Lazarus

Сообщение Vadim » 14.04.2011 10:39:10

Прошу прощения, совершенно не учёл, что Вы за Lazarus впервые сели. ;)
Начнём с теории. Компонент TDbf за один раз берёт только одну строчку данных и, соответственно, показывает её как текущую. Следовательно, чтобы просмотреть (изменить или что-то вроде этого) все записи, надо последовательно пройтись по всем этим записям, что-то с ними делая. Таким образом, использование групповой работы с записями таблицы, например, изменение значений в полях, а уж изменение с условием, так и подавно, порождает довольно громоздкий код. Поэтому программисты от подобной формы хранения и обработки данных давно отказались в пользу компонентов и соответствующих БД, которые поддерживают работу с данными с помощью простого языка запросов SQL.

Рабочий код будет выглядеть так:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
Var
  i: integer ;
Begin
  Dbf1.First;  //Переходим на самую первую запись таблицы
  Dbf1.Edit;   //Переводим таблицу в состояние редактирования
  For i:=0 To Dbf1.RecordCount-1 Do
  Begin
    Dbf1.FieldByName('FIL').AsString:=ConsoleToUtf8(Dbf1.FieldByName('FIL').AsString);  //Вводим в поле новое значение
    Dbf1.Next;  //Переходим на следующую запись
  End; 
End;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Перевод проекта Delphi на Lazarus

Сообщение Odyssey » 14.04.2011 11:35:09

Я бы не советовал использовать ConsoleToUtf8. Она платформозависимая, и если вы работаете под Linux - она не сделает ровно никаких изменений (поскольку в современных Linux консоль и так в utf-8).

В модуле LConvEncoding есть функция CP866ToUTF8, которая делает то, что вам нужно, под любой платформой.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Перевод проекта Delphi на Lazarus

Сообщение Vadim » 14.04.2011 11:38:52

Odyssey писал(а):...если вы работаете под Linux...

Он по виндой работает, так что всё будет тип-топ. :) Если, конечно, не забудет, в случае необходимости, увеличить размер текстовых полей.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Перевод проекта Delphi на Lazarus

Сообщение v-t-l » 14.04.2011 14:33:01

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Dbf1.First;
  Dbf1.Edit;
  while not Dbf1.EOF Do
  begin
    Dbf1.FieldByName('FIL').AsString:=ConsoleToUtf8(Dbf1.FieldByName('FIL').AsString);
    Dbf1.Next;
  end;
end;
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Перевод проекта Delphi на Lazarus

Сообщение lemon » 15.04.2011 04:03:44

alexs писал(а):dbf сконвертировать в utf8
в Interbase при подключении указать клиентскую кодировку utf8


Alexs , а в каком компоненте указывать ?
lemon
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.04.2011 03:30:44

Re: Перевод проекта Delphi на Lazarus

Сообщение alexs » 15.04.2011 08:01:57

UIBDataBase
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Перевод проекта Delphi на Lazarus

Сообщение lemon » 21.04.2011 08:15:40

Привет , еще вопрос возник

При установке alexsDataSet_1_28\FBDataSet
идет сообщение

C:\lazarus_\lazarus_lib\FBDataSet\fbcustomdataset.pas(1,1) Fatal: Can't find unit jvuiblib used by fbcustomdataset

Как лечить ?
lemon
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.04.2011 03:30:44

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru