Перевод проекта Delphi на Lazarus
Модератор: Модераторы
Перевод проекта Delphi на Lazarus
Привет !
Пытаюсь перенести проект 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
Пытаюсь перенести проект 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
-
mad_nazgul
- новенький
- Сообщения: 10
- Зарегистрирован: 20.04.2009 19:28:50
Здравствуйте
Для CP866
смотреть в сторону
OemToChar
Для CP866
смотреть в сторону
OemToChar
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
lemon писал(а):Проект работает с таблицами DBF ( DOS 866 RUS) и Interbase ( кодировка WIN1251 RUS).
При открытии таблиц в проекте Lazarus в полях таблиц вместо русских слов стоит не читаемый набор символов .
dbf сконвертировать в utf8
в Interbase при подключении указать клиентскую кодировку utf8
alexs писал(а):lemon писал(а):Проект работает с таблицами DBF ( DOS 866 RUS) и Interbase ( кодировка WIN1251 RUS).
При открытии таблиц в проекте Lazarus в полях таблиц вместо русских слов стоит не читаемый набор символов .
dbf сконвертировать в utf8
в Interbase при подключении указать клиентскую кодировку utf8
Спасибо .
А чем и как конвертировать dbf в utf8 ?
И какой компонет Lazarus лучше использовать для подключения к Interbase ?
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
lemon писал(а):А чем и как конвертировать dbf в utf8 ?
Конвертер пишется в 5 строк
lemon писал(а):в Interbase при подключении указать клиентскую кодировку utf8
Ну я не буду оригинальным - UIB + FBDataSet
alexs писал(а):lemon писал(а):А чем и как конвертировать dbf в utf8 ?
Конвертер пишется в 5 строк
Увы
Я никогда этого не делал .
А посему , второй вопрос :
Какие это 5 строк и на чем ?
lemon писал(а):Какие это 5 строк и на чем ?
На том, что у Вас уже есть.
Код: Выделить всё
Dbf1.First;
Dbf1.Edit;
For i:=0 To Dbf1.RecordCount-1 Do
Dbf1.FieldByName('Текстовое_поле').AsString:=ConsoleToUtf8(Dbf1.FieldByName('Текстовое_поле').AsString);Предварительно нужно выяснить коэффициент отношения максимальной длины строки, которая хранится в текстовом поле к длине самого поля. Если он больше, чем 1/2, то длину поля следует увеличить до соблюдения этого коэффициента, т.к. русский символ в кодировке UTF8 занимает 2 байта, а не один.
alexs писал(а):lemon писал(а):А чем и как конвертировать dbf в utf8 ?
Конвертер пишется в 5 строкlemon писал(а):в Interbase при подключении указать клиентскую кодировку utf8
Ну я не буду оригинальным - UIB + FBDataSet(если там действительно 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(если там действительно 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
Прошу прощения, совершенно не учёл, что Вы за Lazarus впервые сели. 
Начнём с теории. Компонент TDbf за один раз берёт только одну строчку данных и, соответственно, показывает её как текущую. Следовательно, чтобы просмотреть (изменить или что-то вроде этого) все записи, надо последовательно пройтись по всем этим записям, что-то с ними делая. Таким образом, использование групповой работы с записями таблицы, например, изменение значений в полях, а уж изменение с условием, так и подавно, порождает довольно громоздкий код. Поэтому программисты от подобной формы хранения и обработки данных давно отказались в пользу компонентов и соответствующих БД, которые поддерживают работу с данными с помощью простого языка запросов SQL.
Рабочий код будет выглядеть так:
Начнём с теории. Компонент 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;Я бы не советовал использовать ConsoleToUtf8. Она платформозависимая, и если вы работаете под Linux - она не сделает ровно никаких изменений (поскольку в современных Linux консоль и так в utf-8).
В модуле LConvEncoding есть функция CP866ToUTF8, которая делает то, что вам нужно, под любой платформой.
В модуле LConvEncoding есть функция CP866ToUTF8, которая делает то, что вам нужно, под любой платформой.
Odyssey писал(а):...если вы работаете под Linux...
Он по виндой работает, так что всё будет тип-топ.
Код: Выделить всё
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;alexs писал(а):dbf сконвертировать в utf8
в Interbase при подключении указать клиентскую кодировку utf8
Alexs , а в каком компоненте указывать ?
Привет , еще вопрос возник
При установке alexsDataSet_1_28\FBDataSet
идет сообщение
C:\lazarus_\lazarus_lib\FBDataSet\fbcustomdataset.pas(1,1) Fatal: Can't find unit jvuiblib used by fbcustomdataset
Как лечить ?
При установке alexsDataSet_1_28\FBDataSet
идет сообщение
C:\lazarus_\lazarus_lib\FBDataSet\fbcustomdataset.pas(1,1) Fatal: Can't find unit jvuiblib used by fbcustomdataset
Как лечить ?
