Sign in Join
Wiki copytemporary

Guide for usage of Tdbf component/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11**Учебник по использованию компонента Tdbf**
22
3-## Contents
4-
5- * 1 Обзор
6- * 2 Документация
7- * 3 Начало - создание новой таблицы
8- * 4 Перекодировка
9- * 5 Замеченные баги
10- * 6 См. также
11-
123## Обзор
134
14-В этой статье я хочу описать некоторые особенности использования компонента Tdbf совместно со средой разработки Lazarus. При написании оиспользовались Free Pascal Compiler 2.2.1 /Lazarus 0.9.25, компонент Tdbf установлен по умолчанию. Примеры кода, приведенные ниже, проверены в Windows XP SP2 и Mandriva Linux 2007.1 Spring.
5+В этой статье я хочу описать некоторые особенности использования компонента Tdbf совместно со средой разработки Lazarus. При написании оиспользовались Free Pascal Compiler 2.2.1 /Lazarus 0.9.25, компонент Tdbf установлен по умолчанию. Примеры кода, приведенные ниже, проверены в Windows XP SP2 и Mandriva Linux 2007.1 Spring.
156
167## Документация
178
18-Я пользовался следующей документацией при изучении принципов работы с этим компонентом. Официальная документация в формате PDF доступна на [SourceForge](<https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371>). Также мой перевод статьи по использованию этого компонента [[1]](<http://wiki.lazarus.freepascal.org/Lazarus_Tdbf_Tutorial/ru>).
9+Я пользовался следующей документацией при изучении принципов работы с этим компонентом. Официальная документация в формате PDF доступна на [SourceForge](https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371). Также мой перевод статьи по использованию этого компонента [1](http://wiki.lazarus.freepascal.org/Lazarus_Tdbf_Tutorial/ru).
1910
2011## Начало - создание новой таблицы
2112
22-Подробности создания таблицы описываются в статье [[[2]](<http://wiki.lazarus.freepascal.org/Lazarus_Tdbf_Tutorial/ru#.D0.9A.D0.B0.D0.BA_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D1.82.D1.8C_.D0.BD.D0.BE.D0.B2.D1.83.D1.8E_.D1.82.D0.B0.D0.B1.D0.BB.D0.B8.D1.86.D1.83_.D0.B1.D0.B0.D0.B7.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85>)] Я хочу уточнить некоторые особенности, с которыми мне пришлось столкнуться. Например, нам необходимо создать таблицу следующей структуры, если она не существует (пример взят из реальной программы):
23-```
13+Подробности создания таблицы описываются в статье [[http://wiki.lazarus.freepascal.org/Lazarus Tdbf Tutorial/ru|http://wiki.lazarus.freepascal.org/Lazarus_Tdbf_Tutorial/ru#.D0.9A.D0.B0.D0.BA_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D1.82.D1.8C_.D0.BD.D0.BE.D0.B2.D1.83.D1.8E_.D1.82.D0.B0.D0.B1.D0.BB.D0.B8.D1.86.D1.83_.D0.B1.D0.B0.D0.B7.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85]] Я хочу уточнить некоторые особенности, с которыми мне пришлось столкнуться. Например, нам необходимо создать таблицу следующей структуры, если она не существует (пример взят из реальной программы):
14+
15+``` pascal
2416procedure CheckAndCreate;
25- var path : String;
26- TarifDbf : Tdbf;
27- begin
28- path:=ExtractFilePath(Application.EXEName);
29- //Проверка существования базы данных
30- if not DirectoryExists(Path+DirectorySeparator+'Base') then
31- CreateDir(Path+DirectorySeparator+'Base');
32- if not FileExists(Path+'Base'+DirectorySeparator+'tarif.dbf') then begin
33- TarifDbf.TableLevel := 4;
34- TarifDbf.FilePathFull := Path+'Base';
35- TarifDbf.TableName := 'tarif.dbf';
36- TarifDbf.FieldDefs.Add('NLZ',ftInteger,2);//[0]код учреждения
37- TarifDbf.FieldDefs.Add('NOTD',ftInteger,2);//[1]код отдела
38- TarifDbf.FieldDefs.Add('DOLGNOST',ftString,20);//[2]название должности
39- TarifDbf.FieldDefs.Add('PERSONAL',ftInteger,2);//тип персонала
40- TarifDbf.FieldDefs.Add('KODKAT',ftInteger,2);//[3]квалификацоонная категория (разряд)
41- TarifDbf.FieldDefs.Add('FIO1',ftString,35);//[4]Фамилия, имя, отчество сотрудника
42- TarifDbf.FieldDefs.Add('TARIFRZ',ftInteger,2);//[5]Тарификационный разряд (1..25)
43- TarifDbf.FieldDefs.Add('OKLAD1',ftFloat,10);//[6]Должносной оклад по тарифному разряду
44- TarifDbf.FieldDefs[TarifDbf.FieldDefs.Count-1].Precision := 2;//<=
45- TarifDbf.FieldDefs.Add('DOLJA1',ftFloat,5);//[16]доля ставки
46- TarifDbf.FieldDefs[TarifDbf.FieldDefs.Count-1].Precision := 2;//<=
47- TarifDbf.FieldDefs.Add('FOND',ftFloat,11);//[27] месячный фонд з/п
48- TarifDbf.FieldDefs[TarifDbf.FieldDefs.Count-1].Precision := 2;//<=
49- TarifDbf.CreateTable;
50- end;
51- TarifDbf.FilePathFull := Path+DirectorySeparator+'Base';
52- TarifDbf.TableName := 'tarif.dbf';
53- TarifDbf.Active := true;
54- end;
17+var path : String;
18+ TarifDbf : Tdbf;
19+begin
20+ path:=ExtractFilePath(Application.EXEName);
21+ //Проверка существования базы данных
22+ if not DirectoryExists(Path+DirectorySeparator+'Base') then
23+ CreateDir(Path+DirectorySeparator+'Base');
24+ if not FileExists(Path+'Base'+DirectorySeparator+'tarif.dbf') then begin
25+ TarifDbf.TableLevel := 4;
26+ TarifDbf.FilePathFull := Path+'Base';
27+ TarifDbf.TableName := 'tarif.dbf';
28+ TarifDbf.FieldDefs.Add('NLZ',ftInteger,2);//[0]код учреждения
29+ TarifDbf.FieldDefs.Add('NOTD',ftInteger,2);//[1]код отдела
30+ TarifDbf.FieldDefs.Add('DOLGNOST',ftString,20);//[2]название должности
31+ TarifDbf.FieldDefs.Add('PERSONAL',ftInteger,2);//тип персонала
32+ TarifDbf.FieldDefs.Add('KODKAT',ftInteger,2);//[3]квалификацоонная категория (разряд)
33+ TarifDbf.FieldDefs.Add('FIO1',ftString,35);//[4]Фамилия, имя, отчество сотрудника
34+ TarifDbf.FieldDefs.Add('TARIFRZ',ftInteger,2);//[5]Тарификационный разряд (1..25)
35+ TarifDbf.FieldDefs.Add('OKLAD1',ftFloat,10);//[6]Должносной оклад по тарифному разряду
36+ TarifDbf.FieldDefs[TarifDbf.FieldDefs.Count-1].Precision := 2;//<=
37+ TarifDbf.FieldDefs.Add('DOLJA1',ftFloat,5);//[16]доля ставки
38+ TarifDbf.FieldDefs[TarifDbf.FieldDefs.Count-1].Precision := 2;//<=
39+ TarifDbf.FieldDefs.Add('FOND',ftFloat,11);//[27] месячный фонд з/п
40+ TarifDbf.FieldDefs[TarifDbf.FieldDefs.Count-1].Precision := 2;//<=
41+ TarifDbf.CreateTable;
42+ end;
43+ TarifDbf.FilePathFull := Path+DirectorySeparator+'Base';
44+ TarifDbf.TableName := 'tarif.dbf';
45+ TarifDbf.Active := true;
46+end;
5547```
5648
57-Обратите внимание на фрагменты кода, отмеченные <= в коментарии - только таким образом можно создать поле типа Numeric с дробной частью.
49+Обратите внимание на фрагменты кода, отмеченные \<= в коментарии - только таким образом можно создать поле типа Numeric с дробной частью.
5850
5951## Перекодировка
6052
61-У компонента Tdbf есть свойство OnTranslate. Этому свойству нужно присвоить определенную процедуру:
62-```
53+У компонента Tdbf есть свойство OnTranslate. Этому свойству нужно присвоить определенную процедуру:
54+
55+``` pascal
6356uses lconvencoding;
64-
65- constructor TMyDbf.Create;
66- begin
67- FDbf.OnTranslate:= @OnTranslate;
68- end;
69-
70- function TMyDbf.OnTranslate(Dbf: TDbf; Src, Dest: PChar; ToOem: Boolean): Integer;
71- var
72- S: String;
73- begin
74- if ToOem then
75- S := ConvertEncoding(Src, 'utf8', 'cp866')
76- else
77- S := ConvertEncoding(Src, 'cp866', 'utf8');
78- StrCopy(Dest, PChar(S));
79- Result := StrLen(Dest);
80- end;
81-```
8257
83-а потом после открытия для всех полей типа TStringField поставить свойству Transliterate := True:
58+constructor TMyDbf.Create;
59+begin
60+ FDbf.OnTranslate:= @OnTranslate;
61+end;
62+
63+function TMyDbf.OnTranslate(Dbf: TDbf; Src, Dest: PChar; ToOem: Boolean): Integer;
64+var
65+ S: String;
66+begin
67+ if ToOem then
68+ S := ConvertEncoding(Src, 'utf8', 'cp866')
69+ else
70+ S := ConvertEncoding(Src, 'cp866', 'utf8');
71+ StrCopy(Dest, PChar(S));
72+ Result := StrLen(Dest);
73+end;
8474```
75+
76+а потом после открытия для всех полей типа TStringField поставить свойству Transliterate := True:
77+
78+``` pascal
8579FDbf.Open;
86- for i := 0 to FDbf.Fields.Count - 1 do begin
87- if FDbf.Fields[i] is TStringField then
88- TStringField(FDbf.Fields[i]).Transliterate := True;
89- end;
80+for i := 0 to FDbf.Fields.Count - 1 do begin
81+ if FDbf.Fields[i] is TStringField then
82+ TStringField(FDbf.Fields[i]).Transliterate := True;
83+end;
9084```
9185
92-После выполнения этих действий таблица FDbf будет автоматически перекодироваться из cp866 в utf8 при открытии и из utf8 в cp866 при записи.
86+После выполнения этих действий таблица FDbf будет автоматически перекодироваться из cp866 в utf8 при открытии и из utf8 в cp866 при записи.
9387
9488## Замеченные баги
9589
96-При использовании данного компонента я выявил несколько багов.
90+При использовании данного компонента я выявил несколько багов.
9791
98-1\. При попытке узнать тип и размерность поля не всегда полученный результат соответствует действительности.
92+1\. При попытке узнать тип и размерность поля не всегда полученный результат соответствует действительности.
9993
100-2\. При упаковке таблицы с MEMO файл MEMO "раздувается" приблизительно в 10 раз вместо того, чтобы уменьшаться. (в SVN версии этот баг исправили, связан с неправильным определением размера при чтении данных из поля MEMO).
94+2\. При упаковке таблицы с MEMO файл MEMO "раздувается" приблизительно в 10 раз вместо того, чтобы уменьшаться. (в SVN версии этот баг исправили, связан с неправильным определением размера при чтении данных из поля MEMO).
10195
102-3\. Нет нормальной поддержки перекодировки с кодовой страницы БД в текущую локаль и обратно, что создает определенные трудности при переносе БД с одной системы в другую (напр. из DOS в Windows или Linux), поэтому приходится самому реализовывать перекодировку "на лету".
96+3\. Нет нормальной поддержки перекодировки с кодовой страницы БД в текущую локаль и обратно, что создает определенные трудности при переносе БД с одной системы в другую (напр. из DOS в Windows или Linux), поэтому приходится самому реализовывать перекодировку "на лету".
10397
10498## См. также
10599
106- * [[Example: TDbf \(creating table and indexes, selecting of index\|Example: TDbf (creating table and indexes, selecting of index)]]> "Example: TDbf \(creating table and indexes, selecting of index\)")
100+- [[Example: TDbf (creating table and indexes, selecting of index)]]
107101
108-
109-\--[ViruZ_UA](</index.php?title=User:ViruZ&action=edit&redlink=1> "User:ViruZ \(page does not exist\)") 14:55, 20 March 2008 (CET)
102+--ViruZ_UA 14:55, 20 March 2008 (CET)
110103
111104---
112-*From the Free Pascal wiki, page "Guide for usage of Tdbf component/ru", as the Internet Archive kept it on 2025-03-23. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
105+*From the Free Pascal wiki, page "Guide for usage of Tdbf component/ru", as it stood on 2020-02-16 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
106+Category: Components
107+Category: Components/ru
108+Category: Databases
109+Category: Databases/ru
110+Category: FPC
111+Category: FPC/ru
112+Category: Lazarus
113+Category: Lazarus/ru
114+Category: Russian
115+Category: Tutorials
116+Category: Tutorials/ru

Back to history