root/trunk/Initer.pas

Revision 9, 63.5 kB (checked in by sagrer, 1 year ago)
  1. Поправил документацию. Добавил ридмишку по сборке из исходника.
  2. Добавил опцию вывода значка на рабочий стол при инсталляции.
  • Property svnmailer:content-charset set to cp1251
Line 
1 ///////////////////////////////////////////////////////////
2 //                        EiEdit                         //
3 //      Ðåäàêòîð ÷àñòè ðåñóðñîâ Ïðîêëÿòûõ Çåìåëü         //
4 //             Copyright (C) 2002 Gipat Group            //
5 //              Ðàñïðîñòðàíÿåòñÿ íà óñëîâèÿõ             //
6 //    Gipat Group's opened EI-editor-utility license     //
7 //                      âåðñèè 1.0                       //
8 //                                                       //
9 //                  www.gipatgroup.org                   //
10 ///////////////////////////////////////////////////////////
11
12 //Ê ðàáîòå íàä äàííûì ôàéëîì ïðèëîæèëè ðóêè, íîãè.... êîðî÷å àôôòàðû:
13 // 1) Sagrer (sagrer@yandex.ru)
14
15 ////////////////////////////////////////////////////////////////////////
16
17 unit Initer;
18
19 /////////////////////////////////////////////
20 //        Ãëîáàëüíûé ìîäóëü ïðîãè òèïà     //
21 /////////////////////////////////////////////
22
23 interface
24 uses
25   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
26   StdCtrls, Registry, Menus, ExtCtrls, ComCtrls, ToolWin, CopyFileUnit,
27   mySys, ShowProcessForm, KOLFileInString, KOL, KOLAnIniFile, KOLForPaths,
28   KOLVersionInfo, KOLClearDir, VerInfoTxtFormat;
29
30 const
31   Zagolov = 'Ðåäàêòîð ÷àñòè ðåñóðñîâ ÏÇ ';
32   NZap = 1000;
33   TxtEdDlgDefFiltList = '*|âñå ÷òî òîëüêî ìîæíî :)'+'|*.*|âñå ôàéëû ñ ðàñøèðåíèåì'+'|allod*|Àëëîäû'+'|armor*|Áðîíÿ'+'|briefing*|Áðèôèíãè'+'|camphelp*|Ñïðàâêà ëàãåðÿ'+'|instr*|×åðòåæè'+'|litem*|Ïðåäìåòû äëÿ ïðîäàæè'+'|map.txt|Ïàðàìåòðû êàðò'+'|material*|Ìàòåðèàëû'+'|matshort*|Ñîêðàùåííûå íàçâàíèÿ ìàòåðèàëîâ'+'|modifier*|Ðóíû'+'|perk*|Ïåðêè'+'|pers*|Èìåíà ïåðñîíàæåé'+'|qitem*|Æåçëû'+'|quest*|Ïåéäæåð êâåñòîâ'+'|questitem*|Êâåñòîâûå ïðåäìåòû'+'|say*|Ðåïëèêè íà êàðòå'+'|spell*|Çàêëèíàíèÿ'+'|string*|Ñòðîêè'+'|tip*|Âñïëûâàþùèå ïîäñêàçêè'+'|tutor*|Òåêñòû ýêðàíîâ ïîäñêàçîê'+'|tutorial*|Íàñòðîéêà ïîäñêàçîê'+'|unit*|Èìåíà þíèòîâ'+'|weapon*|Îðóæèå'+'|zone*|Îïèñàíèå çîí'+'|*.res|ðåçû'+'|*.mq|ÌÊÓ-øêè';
34   IniConfFormatVer = 1;
35   EiEdit_AppName = 'Eiedit';
36   EiEdit_CopyrightStr = 'Copyright © 2002-2007 Gipat Group';
37   EiEdit_CraftedBy_list = 'Sagrer';
38   EiEdit_DevelsContacts = 'www.GipatGroup.org';
39
40
41 type
42   ByteFile = File of Byte;
43   TZapisBaziPz = class (TObject)
44   //Êëàññ äëÿ ðàáîòû ñ çàïèñÿìè áàç ÏÇ.
45     ZapisString : ANSIString;
46     FieldsString : ANSIString;
47     Siz : integer;
48     FieldOv : integer;
49     SizFieldOv : integer;
50     FieldsCreated : boolean;
51     ZapisCreated : boolean;
52     SizFieldOtv : integer;
53     Constructor Init;
54     Procedure LoadZap(const ZapSt : ANSIString; sz : integer);
55     Procedure BuildZap;
56     Function GetField(const FieldNum : integer) : ANSIString;
57     Procedure ReWriteField(const FieldNum, sizSt : integer; St: ANSIString);
58     Procedure CreateFields(const FieldNum : integer; NomPoley : StoIntegerov);
59   end;
60   MaskFileArr = array[1..NZap,1..2] of string;
61
62 var
63   //String
64   Path, PzPath, PzResPath, PzCdPath, KodeOpt, DefalDir,
65   databasedir, databaselmpdir, ishdir, ishlmpdir, IniFilPath,
66   AiinfoResPath, DatabaseResPath, DatabaselmpResPath, FiguresResPath,
67   GfxResPath, MaterialsResPath, MenusResPath, OutroResPath,
68   RedressResPath, SfxResPath, SpeechResPath, TextsResPath,
69   TextslmpResPath, TexturesResPath, DatabaseResIsh, DatabaselmpResIsh,
70   TextsEdStart, TxtEdDlgFiltList : string;
71   //Integer
72   MfHeight, MfWidth, MfTop, MfLeft, MfWstate, TxtEdDlgCritSiz,
73   TxtEdDlgActFilt : integer;
74   //boolean
75   ResursFormClosed, PrintsDbR1FClosed, PrintsDbR2FClosed, PrintsDbR3FClosed,
76   LmpLeversFClosed, LeversFClosed, UncAskFSaved,
77   SinglPrintsDbR1FClosed, SinglPrintsDbR2FClosed,
78   SinglPrintsDbR3FClosed, SinglItemsIdbR1FClosed,
79   UncAskFLetChangSiz, ItemsIdbR1FClosed, SinglItemsIdbR2FClosed,
80   ItemsIdbR2FClosed, SinglItemsIdbR3FClosed,
81   ItemsIdbR3FClosed, SinglItemsIdbR4FClosed,
82   ItemsIdbR4FClosed, SinglItemsIdbR5FClosed,
83   ItemsIdbR5FClosed, SinglItemsIdbR6FClosed,
84   ItemsIdbR6FClosed, SinglPerksPdbR1FClosed,
85   PerksPdbR1FClosed, SinglPerksPdbR2FClosed,
86   PerksPdbR2FClosed, SinglQuestsQdbR1FClosed,
87   SinglQuestsQdbR2FClosed,
88   UnitsUdbR1FClosed, SinglUnitsUdbR1FClosed,
89   UnitsUdbR2FClosed, SinglUnitsUdbR2FClosed,
90   UnitsUdbR3FClosed, SinglUnitsUdbR3FClosed,
91   UnitsUdbR4FClosed, SinglUnitsUdbR4FClosed,
92   SpellsSdbR1FClosed, SinglSpellsSdbR1FClosed,
93   SpellsSdbR2FClosed, SinglSpellsSdbR2FClosed,
94   SpellsSdbR3FClosed, SinglSpellsSdbR3FClosed,
95   SpellsSdbR4FClosed, SinglSpellsSdbR4FClosed,
96   SpellsSdbR5FClosed, SinglSpellsSdbR5FClosed,
97   SinglAcksDbR1FClosed, SinglAcksDbR2FClosed,
98   SinglAcksDbR3FClosed, OptStandRes, TxtEdDlg1Click,
99   TxtEdDlgUseCritSiz, TxtEdDlgWordWrap : boolean;
100
101   //Äðóãèå... ïåðåìåííûå, êîòîðûå þçÿòñÿ êàê âðåìåííûå â ðàçíûõ
102   //ôóíêàõ.... â ïðèíöèïå êàê ãëîáàëüíûå íå þçÿòñÿ
103   //íî þçÿòñÿ âî  ìíîãèõ þíèòàõ...
104   CPCResult : RCPCResult;
105   PzDbStrRec : RPzDbStrRec;
106   Registr : TRegistry;
107   AnIniFil : TAnIniFile;
108   VitInfo : TVerInfoTxtFormat;
109
110
111 Procedure OpenProgKey;
112 Procedure OpenPZPathKey;
113 Procedure OpenPZGSKey;
114 Procedure CloseTheKey;
115 Procedure InitPzKey;
116 Procedure InitProgKey;
117 Function CopDir(PathIn, DestIn : string; bar : TProgressBar) : integer;
118 Function StrWinDos (str1 : string) : string;
119 Procedure UnPackResurs(const pathfill, fill : string);
120 Procedure PackResurs(const pathdir : string);
121 Function RaspakBase(const BasFile, PathIshDir : string) : integer;
122 Function GetDlBig (const b1, b2, b3, b4 : byte) : integer;
123 Function GetDlSmall(const b1 : byte) : integer;
124 Function ZapakBase(const PathIshDir, PathConDir : string) : integer;
125 Function MakeDlBig(const int : integer) : ChetireBaita;
126 Function MakeDlSmall(const int : integer) : byte;
127 Procedure VipravitFaili(DirPath : string);
128 Function OtkusitPodPole(Point1 : PointToStr) : string;
129 Function AddPodPole(const Str, AddStr : string; zagol : integer): string;
130 Function UnsLongToShopInfo(const Int : integer) : string;
131 Function GetMagazChislo(const num : integer) : integer;
132 Function CheckShopInfo(const Str : string) : boolean;
133 Function ShopInfoToUnsLong(const Str : string) : integer;
134 Function GetUnkStr(const Unk : string; UnkSiz : integer) : string;
135 Function ListToStr(const ListStr : string) : string;
136 Function CheckList (const Str : string) : boolean;
137 Function ListBezProbelov(const Str : string) : string;
138 Function StrToList(const Str : string) : string;
139 Function SelectValue(const List : string) : string;
140 Function SelectValueEx(const List : string; Idx : integer) : string;
141 Function _4bTEXTListToStr(const ListStr : string) : string;
142 Function ListTo4bTEXTStr(const Str : string) : string;
143 Function CheckList4bTEXT(const Str : string) : boolean;
144 Function EditASound(const Str : string) : string;
145 Function GetASoundStr(const Str : string) : string;
146 Function AddDirToRes(const ResFile, DirPath : string) : string;
147 Function UnPackResToDir(const ResFile, DirPath : string) : string;
148 Function ModalAddDirToRes(const ResFile, DirPath : string) : string;
149 Function ModalUnPackResToDir(const ResFile, DirPath : string) : string;
150 Function GetExtensDirName(const FileName : string) : string;
151 Function GetExtensFileName(const DirName : string) : string;
152 Function OptimizeRes(const ResFile : string) : string;
153 Function ModalOptimizeRes(const ResFile : string) : string;
154 Function SimvCountInStr(const Str : string; Simv : Char) : integer;
155 Function UnPackResDialog(const FileName : string) : string;
156 Function PackResDialog(const DirName : string) : string;
157 Function SortStringFileArray(const TheArray : MaskFileArr) : MaskFileArr;
158
159
160 implementation
161 uses
162   PzEd, OptiF, ValueSelectorForm, ASoundEditorForm, ResbuildForm,
163   RbPackOptForm, RBUnPackOptForm;
164
165 var
166   SRec : TSearchRec;
167
168 Function StrWinDos (str1 : string) : string;
169 var
170   I : integer;
171   ch : char;
172   byt1, byt2 : byte;
173   strOut : string;
174 begin
175   I := 0;
176   strOut :='';
177   repeat
178     I := I+1;
179     if str1[I] <> #0 then begin
180       ch := str1[I];
181       byt1 := byte(ch);
182       byt2 := ConvertWinDos(byt1);
183       Ch := char(byt2);
184       strOut := strOut+Ch;
185     end;
186   until str1[I] = #0;
187   result := strOut;
188 end;
189
190 Procedure InitPzKey;
191 begin
192   Registr.RootKey:=HKEY_CURRENT_USER;
193 end;
194
195 Procedure InitProgKey;
196 begin
197   Registr.RootKey:=HKEY_LOCAL_MACHINE;
198 end;
199
200 Procedure OpenProgKey;
201 begin
202   InitProgKey;
203   registr.OpenKey('\Software\EiEditor',false);
204 end;
205
206 Procedure OpenPZPathKey;
207 begin
208   InitPzKey;
209   registr.OpenKey('\Software\Nival Interactive\EvilIslands\Path Settings',false);
210 end;
211
212 Procedure OpenPZGSKey;
213 begin
214   InitPzKey;
215   registr.OpenKey('\SOFTWARE\Nival Interactive\EvilIslands\Game Specific Settings',false);
216 end;
217
218 Procedure CloseTheKey;
219 begin
220   registr.CloseKey;
221 end;
222
223 Procedure PackResurs(const pathdir : string);
224 var
225   f1 : textfile;
226   str1, str2, str4, str5, pathDOdir, buf, pat, buf2, rezfil : string;
227   I, j : integer;
228 begin
229   //Ïîëó÷åíèå "ïàòõäîäèð"
230   I := 0;
231   PathDOdir := '';
232   repeat
233     pat := '';
234     repeat
235       buf := '';
236       I := I+1;
237       buf := pathdir[I];
238       pat := pat+buf;
239     until (buf = '\') or (buf = #0);
240     if pathdir[I+1] =#0 then buf := #0;
241     if (pathdir[I+1] <> #0) and (pat <> #0) then PathDOdir := pathDOdir+pat;
242     if pathdir[I+1] =#0 then begin  //ïîëó÷åíèå èìåíè ðåçôàéëà
243       J := 0;
244       rezfil := '';
245       repeat
246         J := J+1;
247         buf2 := pat[J];
248         if buf2 <> '\' then rezfil := rezfil+buf2;
249       until buf2 = '\';
250     end;
251   until buf = #0;
252   str4 := PChar(pathdir);
253   str5 := PChar(pathDOdir);
254   str1 := LongToShortPath(str4);
255   str2 := LongToShortPath(str5);
256   AssignFile(F1,pathDOdir+'packer.bat');
257   Rewrite(F1);
258   Writeln(F1,strWinDos('chdir '+str1));
259   Writeln(F1,strWinDos(str2+'resbuild.exe a '+str2+rezfil+'.res *'));
260   closefile(f1);
261   WinExec(Pchar(pathDOdir+'packer.bat'), Sw_ShowNormal);
262   MessageDLG('Ðàáîòàåò ðàñïàêîâùèê. Äîæäèòåñü çàâåðøåíèÿ ðàñïàêîâêè è íàæìèòå ÎÊ'
263   ,MtInformation,[mbOk],0);
264 end;
265
266 Procedure UnPackResurs(const pathfill, fill : string);
267 var
268   f1 : textfile;
269   str1, str2, str4, str5, dirnam, buf : string;
270   I : integer;
271 begin
272   AssignFile(F1,pathfill+'unpacker.bat');
273   Rewrite(F1);
274   dirnam := '';
275   I := 0;
276   repeat
277     buf := '';
278     I := I+1;
279     buf := fill[I];
280     if buf <> '.' then dirnam := dirnam+buf;
281   until buf = '.';
282   str4 := PChar(pathfill+dirnam);
283   str5 := PChar(pathfill);
284   str1 := LongToShortPath(str4);
285   str2 := LongToShortPath(str5);
286   Writeln(F1,strWinDos('chdir '+str1));
287   Writeln(F1,strWinDos(str2+'resbuild.exe e '+str2+fill+' *'));
288   closefile(f1);
289   WinExec(Pchar(pathfill+'unpacker.bat'), Sw_ShowNormal);
290   MessageDLG('Ðàáîòàåò ðàñïàêîâùèê. Äîæäèòåñü çàâåðøåíèÿ ðàñïàêîâêè è íàæìèòå ÎÊ'
291   ,MtInformation,[mbOk],0);
292 end;
293
294 Function CopDir(PathIn, DestIn : string; bar : TProgressBar) : integer;
295 var
296   path, file1, readbuf, dest, from, fto : string;
297   f1 : textfile;
298   HaveSpace, NeedSpace : int64;
299
300 Procedure CreateList(path, dest2 : string);
301 var
302   pathNew, OldNew, FoldFileNew : string;
303   SRecNew : TSearchRec;
304 begin
305   PathNew := path;
306   findFirst(PathNew+'*.*',FaAnyFile,SRecNew);
307   if DirectoryExists(pathNew+SRecNew.name) = true then foldfileNew := ' folder'
308   else foldfileNew := ' file';
309   if foldfilenew = ' folder' then begin
310     if (SRecNew.name <> '.') and (SRecNew.name <> '..') then begin
311       Writeln(f1,'MD');
312       Writeln(f1,pathNew+SRecNew.name+'\');
313       Writeln(f1,dest2+SRecNew.name+'\');
314       CreateList(pathNew+SRecNew.name+'\',dest2+SRecNew.name+'\');
315     end;
316   end
317   else begin
318     if (SRecNew.name <> '.') and (SRecNew.name <> '..') then begin
319       Writeln(f1,'Copy');
320       Writeln(f1,pathNew+SRecNew.name);
321       Writeln(f1,dest2+SRecNew.name);
322     end;
323   end;
324
325   repeat
326     oldNew := pathNew+SRecNew.name;
327     FindNext(SRecNew);
328     if DirectoryExists(pathNew+SRecNew.name) = true then foldfileNew := ' folder'
329     else foldfileNew := ' file';
330     if foldfilenew = ' folder' then begin
331       if (SRecNew.name <> '.') and (SRecNew.name <> '..') then begin
332         if oldNew <> pathNew+SRecNew.name then begin
333           Writeln(f1,'MD');
334           Writeln(f1,pathNew+SRecNew.name+'\');
335           Writeln(f1,dest2+SRecNew.name+'\');
336           CreateList(pathNew+SRecNew.name+'\',dest2+SRecNew.name+'\');
337         end;
338       end;
339     end
340     else begin
341       if (SRecNew.name <> '.') and (SRecNew.name <> '..') then begin
342         if oldNew <> pathNew+SRecNew.name then begin
343           Writeln(f1,'Copy');
344           Writeln(f1,pathNew+SRecNew.name);
345           Writeln(f1,dest2+SRecNew.name);
346         end;
347       end;
348     end;
349   until oldNew = pathNew+SRecNew.name;
350
351   FindClose(SRecNew);
352 end;
353
354 begin
355   file1 := GetTempDir+'CopyList.lis';
356   AssignFile(f1,file1);
357   Rewrite(f1);
358   path := PathIn;
359   dest := DestIn;
360   CreateList(path, dest);
361   Write(f1,'end');
362   CloseFile(f1);
363   HaveSpace := DiskFree(GetDraNum(dest));
364   AssignFile(f1,file1);
365   Reset(f1);
366   NeedSpace := 0;
367   repeat
368     Readln(f1,readbuf);
369     if Readbuf <> 'end' then begin
370       if readbuf = 'Copy' then begin
371         Readln(f1,readbuf);
372         from := readbuf;
373         Readln(f1,readbuf);
374         fto := readbuf;
375         NeedSpace := NeedSpace+GetFileSize(fto);
376       end;
377     end;
378   until readbuf = 'end';
379   CloseFile(f1);
380   If HaveSpace > NeedSpace then begin
381     AssignFile(f1,file1);
382     Reset(f1);
383     repeat
384       Readln(f1,readbuf);
385       if Readbuf <> 'end' then begin
386         if readbuf = 'MD' then begin
387           Readln(f1,readbuf);
388           Readln(f1,readbuf);
389           MkDir(readbuf);
390         end;
391         if readbuf = 'Copy' then begin
392           Readln(f1,readbuf);
393           from := readbuf;
394           Readln(f1,readbuf);
395           fto := readbuf;
396           VCLCopyFile(from,fto,true,true,bar);
397         end;
398       end;
399     until readbuf = 'end';
400     CloseFile(f1);
401     result := 0;
402   end 
403   else begin
404     MessageDLG('Îøèáêà!. Íå õâàòàåò '+IntToStr(NeedSpace-HaveSpace)+' áàéò äëÿ êîïèðîâàíèÿ',mtError,[mbOk],0);
405     result := 1;
406   end; 
407 end;
408
409 Function RaspakBase(const BasFile, PathIshDir : string) : integer;
410 var
411   FoldNam1, foldnam2 : string;
412   Fil1, Fil2 : TFileInString;
413   buffer, buf1, buf2, buf3, buf4 : byte;
414   kursor : int64;
415   NumerRazd2, NumerRazd3, DL1, DL2, Dl3, numerator1,
416   numerator2, numerator3, Sch1 : integer;
417
418 begin
419   //Ïðîöåäóðà ðàñïàêà öåëüíîãî áàçî-ôàéëà.
420   //Âûâîæó íà ýêðàí îêíî ïðîöåññà...
421   ShowProcessF.Show;
422   ShowProcessF.InfoLab1.Caption := BasFile;
423   ShowProcessF.InfoLab2.Caption := 'Îòêðûòèå ôàéëà è ïîäãîòîâêà ïàïêè...';
424   ShowProcessF.PrBar.Position := 0;
425   ShowProcessF.Refresh;
426   //Ïîëó÷àþ èìÿ ôàéëà, è ñîçäàþ ôîëäåð.
427   FoldNam1 := GetFilePath(PathIshDir)+GetFileName(BasFile)+'\';
428   If DirectoryExists(foldnam1) then ClearDir(Foldnam1,true);
429   MkDir(FoldNam1);
430   //Òåïåðü ãðóæó ôàéëî ÷åðåç êëàññ ðàáîòû ñ ôàéëàìè.
431   Fil1 := TFileInString.Init;
432   Fil1.Load(BasFile);
433   //fil1.AddByte(199);
434   //Fil1.Save(PathIshDir+GetFileName2(BasFile));
435   //Ïðèãîòîâèòü áàð ê ðàáîòå, äà è ôîðìó ïåðåïèñàòü...
436   ShowProcessF.InfoLab2.Caption := 'Ðàñïàêîâêà áàçû è çàïèñü èñõîäíèêà...';
437   ShowProcessF.PrBar.Max := Fil1.Siz;
438   ShowProcessF.refresh;
439   //Êóðñîð íà íîëü..
440   Kursor := 0;
441   Sch1 := 0;
442   //Ïîëó÷àþ ÄË è íîìåð...
443   kursor := kursor+1;
444   Sch1 := Sch1+1;
445   buffer := byte(Fil1.FileString[kursor]);
446   ShowProcessF.PrBar.Position := kursor;
447   ShowProcessF.PrBar.Refresh;
448   if buffer <> 0 then begin
449     if buffer <> 1 then messageDLG('Áàçà íà÷èíàåòñÿ íå íà <01>. Íåñòàíäàðòíî...',mtWarning,[mbOk],0);
450     kursor := kursor+1;
451     Sch1 := Sch1+1;
452     buffer := byte(Fil1.FileString[kursor]);
453     ShowProcessF.PrBar.Position := kursor;
454     ShowProcessF.PrBar.Refresh;
455    
456     if chetnoe(buffer) then begin
457       //Åñëè ÄË êîðîòêîå.
458       DL1 := GetDLSmall(buffer);
459     end
460     else begin
461       //Åñëè ÄË äëèííîå.
462       buf1 := buffer;
463       kursor := kursor+1;
464       Sch1 := Sch1+1;
465       buffer := byte(Fil1.FileString[kursor]);
466       buf2 := buffer;
467       kursor := kursor+1;
468       Sch1 := Sch1+1;
469       buffer := byte(Fil1.FileString[kursor]);
470       buf3 := buffer;
471       kursor := kursor+1;
472       Sch1 := Sch1+1;
473       buffer := byte(Fil1.FileString[kursor]);
474       buf4 := buffer;
475       DL1 := GetDLBig(buf1,buf2,buf3,buf4);
476     end;
477     //Ïðîâåðêà ÄË.
478     if DL1+10 = fil1.siz then begin
479       //Åñëè ÄË ïðàâèëüíîå, ïðîäîëæèòü ðàñïàêîâêó...
480       numerator1 := Dl1-Sch1;
481       //Áûë ïîëó÷åí ñ÷åò÷èê ïðîéäåííûõ áàéòîâ
482       //Öèêë 1 óðîâíÿ.
483       repeat
484         //Ïîëó÷åíèå íîìåðà "ðàçäåëà"
485         sch1 := 0;
486         kursor := kursor+1;
487         sch1 := sch1+1;
488         numerator1 := numerator1-1;
489         buffer := byte(Fil1.FileString[kursor]);
490         NumerRazd2 := buffer;
491         //Ñîçäàíèå ïàïêè äëÿ ðàçäåëà...
492         foldnam2 := FoldNam1+IntToStr(NumerRazd2)+'\';
493         MkDir(FoldNam2);
494         //Ïîëó÷åíèå ÄË "ðàçäåëà"
495         kursor := kursor+1;
496         sch1 := sch1+1;
497         numerator1 := numerator1-1;
498         buffer := byte(Fil1.FileString[kursor]);
499         if chetnoe(buffer) then begin
500           //Åñëè ÄË êîðîòêîå.
501           DL2 := GetDLSmall(buffer);
502         end
503         else begin
504           //Åñëè ÄË äëèííîå.
505           buf1 := buffer;
506           kursor := kursor+1;
507           Sch1 := Sch1+1;
508           numerator1 := numerator1-1;
509           buffer := byte(Fil1.FileString[kursor]);
510           buf2 := buffer;
511           kursor := kursor+1;
512           Sch1 := Sch1+1;
513           numerator1 := numerator1-1;
514           buffer := byte(Fil1.FileString[kursor]);
515           buf3 := buffer;
516           kursor := kursor+1;
517           Sch1 := Sch1+1;
518           numerator1 := numerator1-1;
519           buffer := byte(Fil1.FileString[kursor]);
520           buf4 := buffer;
521           DL2 := GetDLBig(buf1,buf2,buf3,buf4);
522         end;
523         //Ïîëó÷åíèå ñ÷åò÷èêà ïðîéäåííûõ áàéòîâ äëÿ 2-ãî óðîâíÿ.
524         numerator2 := DL2-Sch1;
525         //Öèêë 2 óðîâíÿ
526         NumerRazd3 := 0;
527         repeat
528           //Ïîëó÷åíèå íîìåðà çàïèñè, îäíîâðåìåííî íà÷àâ "òðàíñêðèïöèþ".
529           //Ñîçäàíèå îáüåêòà êëàññà äëÿ íîâîãî ôàéëà.
530           Fil2 := TFileInString.Init;
531           Fil2.MakNewFile;
532           //Ñîáñíî ïîëó÷åíèå íîìåðà.
533           Sch1 := 0;
534           kursor := kursor+1;
535           numerator1 := numerator1 - 1;
536           numerator2 := numerator2 - 1;
537           Sch1 := Sch1+1;
538           buffer := byte(Fil1.FileString[kursor]);
539           //À òðàíñêðèïöèÿ óæå èäåò...
540           Fil2.AddByte(buffer);
541           //Íîìåð çàïèñè...
542           //NumerRazd3 := buffer;
543           //À òàê êàê íîìåð çàïèñè ïà÷åìóòà âñåãäà íà 1 òî áóäåò ñ÷åò÷èê.
544           NumerRazd3 := NumerRazd3+1;
545           //Òåïåðü ïîëó÷åíèå ÄË çàïèñè...
546           kursor := kursor+1;
547           numerator1 := numerator1 - 1;
548           numerator2 := numerator2 - 1;
549           Sch1 := Sch1+1;
550           buffer := byte(Fil1.FileString[kursor]);
551           Fil2.AddByte(buffer);
552           if chetnoe(buffer) then begin
553             //Åñëè ÄË êîðîòêîå.
554             DL3 := GetDLSmall(buffer);
555           end
556           else begin
557             //Åñëè ÄË äëèííîå.
558             buf1 := buffer;
559             kursor := kursor+1;
560             numerator1 := numerator1 - 1;
561             numerator2 := numerator2 - 1;
562             Sch1 := Sch1+1;
563             buffer := byte(Fil1.FileString[kursor]);
564             Fil2.AddByte(buffer);
565             buf2 := buffer;
566             kursor := kursor+1;
567             numerator1 := numerator1 - 1;
568             numerator2 := numerator2 - 1;
569             Sch1 := Sch1+1;
570             buffer := byte(Fil1.FileString[kursor]);
571             Fil2.AddByte(buffer);
572             buf3 := buffer;
573             kursor := kursor+1;
574             numerator1 := numerator1 - 1;
575             numerator2 := numerator2 - 1;
576             Sch1 := Sch1+1;
577             buffer := byte(Fil1.FileString[kursor]);
578             Fil2.AddByte(buffer);
579             buf4 := buffer;
580             DL3 := GetDLBig(buf1,buf2,buf3,buf4);
581           end;
582           //Ïîëó÷åíèå ñ÷åò÷èêà ïðîéäåííûõ áàéòîâ äëÿ 3-ãî óðîâíÿ...
583           numerator3 := DL3-Sch1;
584           //Öèêë 3-ãî óðîâíÿ (òîêà çàïèñü â ôàéë...)
585           repeat
586             kursor := kursor+1;
587             numerator1 := numerator1 - 1;
588             numerator2 := numerator2 - 1;
589             numerator3 := numerator3 - 1;
590             buffer := byte(Fil1.FileString[kursor]);
591             Fil2.AddByte(buffer);
592           until numerator3 = 0;
593           //Òåïåðü çàïèñü ïîëó÷åííîãî "ôàéëà" â ôàéë.
594           fil2.Save(foldnam2+GenerateNumName(NumerRazd3,'')+'.zap');
595           //Óäàëåíèå îáüåêòà...
596           fil2.Free;
597           ShowProcessF.PrBar.Position := kursor;
598           ShowProcessF.PrBar.Refresh;
599         until numerator2 = 0;
600       until numerator1 = 0;
601     end
602     else begin
603       MessageDLG('ÄË ôàéëà íåïðàâèëüíîå!',mtError,[mbOk],0);
604     end;
605   end
606   else begin
607     //Ðóãíóòüñÿ, åñëè ïåðâûé áàéò - 00
608     MessageDLG('Ïåðâûé áàéò ôàéëà '+BasFile+' ðàâåí 00h. Íåñòàíäàðòíàÿ áàçà èëè âîîáùå íå áàçà. Íåðàñïàêîâàí.',mtError,[mbOk],0);
609   end;
610   Fil1.Free;
611   ShowProcessF.Close;
612
613   Result := 1;
614 end;
615
616 Function GetDlBig (const b1, b2, b3, b4 : byte) : integer;
617 var
618   UnsLong, Sum : integer;
619 begin
620   //Ïðîöåäóðà ïîëó÷åíèÿ ÄË áàçû äëèííîãî òèïà.
621   UnsLong := GetUnsignedLongOld(b1,b2,b3,b4);
622   Sum := (UnsLong+9) div 2;
623   Result := Sum;
624 end;
625
626 Function GetDlSmall(const b1 : byte) : integer;
627 var
628   UnsLong, Sum : integer;
629 begin
630   //Ïðîöåäóðà ïîëó÷åíèÿ ÄË áàçû êîðîòêîãî òèïà.
631   UnsLong := b1;
632   Sum := (UnsLong div 2)+2;
633   Result := Sum;
634 end;
635
636 Function ZapakBase(const PathIshDir, PathConDir : string) : integer;
637 var
638    //SRec1, SRec2 : TSearchRec;
639    DliniRazdelov : array[1..10] of integer;
640    DLbasi, numerpapki, numerfila, I, razdelov : integer;
641    EstPapka, EstFile : boolean;
642    Pathh, FilNam1, FilNam2 : string;
643    Fil1, Fil2 : TFileInString;
644    buffer : byte;
645    buff1 : ChetireBaita;
646 begin
647   //Ïðîöåäóðà çàïàêîâêè áàçû îáðàòíî â ôàéë.
648   //Èòàê, âíà÷àëå íóæíî ðàññ÷èòàòü ÄË-û.
649   //Ïîéäó ïî öèêëàì - 1 - èñ÷ó ïàïêè
650   //È åñ÷å - âûâîæó íà ýêðàí.
651   ShowProcessF.Show;
652   ShowProcessF.InfoLab1.caption := PathConDir;
653   ShowProcessF.InfoLab2.caption := 'Àíàëèç èñõîäíèêà è ïîäñ÷åò ÄË...';
654   ShowProcessF.PrBar.Position := ShowProcessF.PrBar.min;
655   ShowProcessF.refresh;
656   Fil1 := TFileInString.Init;
657   Fil2 := TFileInString.Init;
658   For I := 1 to 10 do DliniRazdelov[I] := 0;
659   NumerPapki := 0;
660   repeat
661     EstPapka := false;
662     NumerPapki := NumerPapki+1;
663     Pathh := PathIshDir+IntToStr(NumerPapki)+'\';
664     If DirectoryExists(Pathh) = true then begin
665       //Åñëè ïàïêà åñòü...
666       EstPapka := true;
667       //Öèêë 2 - ïî ôàéëàì.
668       NumerFila := 0;
669       repeat
670         EstFile := false;
671         //Ïîëó÷àþ èìåíà...
672         NumerFila := NumerFila+1;
673         FilNam1 := generateNumName(NumerFila,'')+'.zap';
674         FilNam2 := pathh+FilNam1;
675         //Ïðîâåðÿþ...
676         if FileExistsDiv(FilNam1,pathh) = true then begin
677           //Åñëè ôàéë åñòü, ïîñ÷èòàòü åãî ðàçìåð.
678           EstFile := true;
679           //Fil1 := TFileInString.Init;
680           Fil1.Load(FilNam2);
681           DliniRazdelov[NumerPapki] := DliniRazdelov[NumerPapki]+Fil1.Siz;
682           //Fil1.free;
683         end;
684       until EstFile = false;
685     end;
686   until EstPapka = false;
687   //Ñ÷èòàþ êîë-âî ðàçäåëîâ
688   Razdelov := NumerPapki-1;
689   //Òåïåðü ïåðåñ÷èòûâàþ äëèíû ðàçäåëîâ ñ ó÷åòîì çàãîëîâêà ðàçäåëà....
690   //È ñ÷èòàþ ÄË áàçû.
691   DLBasi := 0;
692   For I := 1 to razdelov do begin
693     if DliniRazdelov[I] < 128 then begin
694       //Êîðîòêèé ÄË
695       DliniRazdelov[I] := DliniRazdelov[I]+2;
696     end
697     else begin
698       //Äëèííûé ÄË
699       DliniRazdelov[I] := DliniRazdelov[I]+5;
700     end;
701     DLBasi := DLBasi+DliniRazdelov[I];
702   end;
703   //Ó÷èòûâàþ äëèíó çàãîëîâêà...
704   if DLBasi < 128 then begin
705     //Êîðîòêèé ÄË
706     DLBasi := DLBasi+2;
707   end
708   else begin
709     //Äëèííûé ÄË
710     DLBasi := DLBasi+5;
711   end;
712   //Òåïåðü ìîæíî çàïèñûâàòü íîâûé ôàéë áàçû...
713   //Âûâîä íà ýêðàí
714   ShowProcessF.InfoLab1.caption := PathConDir;
715   ShowProcessF.InfoLab2.caption := 'Ãåíåðàöèÿ íîâîé áàçû è çàïèñü åå íà äèñê...';
716   ShowProcessF.PrBar.Position := ShowProcessF.PrBar.min;
717   ShowProcessF.refresh;
718   fil2.MakNewFile;
719   //Äîáàâëÿþ çàãîëîâîê.
720   buffer := 1;
721   Fil2.AddByte(buffer);
722   //Äîáàâëÿþ ÄË âñåé áàçû...
723   if DlBasi < 130 then begin
724     buffer := MakeDLSmall(DlBasi);
725     Fil2.AddByte(buffer);
726   end
727   else begin
728     buff1 := MakeDlBig(DlBasi);
729     Fil2.AddByte(buff1[1]);
730     Fil2.AddByte(buff1[2]);
731     Fil2.AddByte(buff1[3]);
732     Fil2.AddByte(buff1[4]);
733   end;
734   //Òåïåðü öèêë - äëÿ çàïèñè ðàçäåëîâ.
735   For I := 1 to razdelov do begin
736     //Çàïèñàòü çàãîëîâîê ðàçäåëà ðàâíûé I
737     buffer := I;
738     Fil2.AddByte(buffer);
739     //Çàïèñàòü ÄË ðàçäåëà...
740     if DliniRazdelov[I] < 130 then begin
741       buffer := MakeDLSmall(DliniRazdelov[I]);
742       Fil2.AddByte(buffer);
743     end
744     else begin
745       buff1 := MakeDlBig(DliniRazdelov[I]);
746       Fil2.AddByte(buff1[1]);
747       Fil2.AddByte(buff1[2]);
748       Fil2.AddByte(buff1[3]);
749       Fil2.AddByte(buff1[4]);
750     end;
751     //Öèêë äëÿ çàïèñè âñåõ ôàéëîâ èç ðàçäåëà (âñåõ çàïèñåé).
752    
753     //Ïîëó÷èòü ïóòü, íîìåð ôàéëà íà 0...
754     Pathh := PathIshDir+inttostr(I)+'\';
755     NumerFila := 0;
756     repeat
757       //Ïèñàòü ïî ôàéëó....
758       EstFile := false;
759       NumerFila := NumerFila+1;
760       FilNam1 := generateNumName(NumerFila,'')+'.zap';
761       FilNam2 := pathh+FilNam1;
762       if fileexistsDiv(FilNam1,pathh) then begin
763         //Ôàéë åñòü
764         EstFile := true;
765         //Ïðèëåïèòü åãî.
766         fil1.Load(FilNam2);
767         Fil2.FileString := Fil2.FileString+Fil1.FileString;
768         //Fil2.Siz := Fil2.Siz + Fil1.Siz;
769       end;
770     until EstFile = false;
771   end;
772   //Òèïà âñå ðàçäåëû çàïèñàíû. Ïèøó "õâîñò".
773   Fil2.AddByte(0);
774   Fil2.AddByte(0);
775   Fil2.AddByte(2);
776   Fil2.AddByte(12);
777   Fil2.AddByte(2);
778   Fil2.AddByte(8);
779   Fil2.AddByte(1);
780   Fil2.AddByte(0);
781   Fil2.AddByte(0);
782   Fil2.AddByte(0);
783   //Âðîäå ãîòîâî. Òåïåðü ñàìîå èíòåðåñíîå - çàïèñü.
784   Fil2.Save(PathConDir);
785   //Îñâîáîæäàþ ïàìÿòü...
786   //ShowMessage('Ãîòîâî');    //Ýòî îòëàäî÷íîå
787   Fil1.Free;
788   Fil2.free;
789   ShowProcessF.Close;
790
791   Result := 1;
792 end;
793
794 Function MakeDlBig(const int : integer) : ChetireBaita;
795 begin
796   //Ïîëó÷åíèå äëèííîãî ÄË áàçû â âèäå áàéòîâ.
797   Result := UngetUnsignedLong(((int*2)-9));
798 end;
799
800 Function MakeDlSmall(const int : integer) : byte;
801 begin
802   //Ïðîöåäóðà ïîëó÷åíèÿ êîðîòêîãî ÄË áàçû â âèäå áàéòà.
803   result := ((int-2)*2);
804 end;
805
806 Constructor TZapisBaziPz.Init;
807 begin
808   //Êîíñòðóêòîð (âûñòàâèòü íà ôàëñ áóëåàíû) - òèïà íè÷å íå çàãðóæåíî è íå ñîçäàíî.
809   FieldsCreated := false;
810   ZapisCreated := false;
811   FieldOv := 0;
812   Siz := 0;
813   SizFieldOv := 0;
814   FieldsString := '';
815   ZapisString := '';
816 end;
817
818 Procedure TZapisBaziPz.LoadZap(const ZapSt : ANSIString; sz : integer);
819 var
820   kursor, DLFilda : integer;
821   b1, b2, b3, b4 : byte;
822 begin
823   //Çàãðóçêà çàïèñè â îáüåêò, ïîäñ÷åò ïîëåé è ñîçäàíèå ñòðîêè ïîëåé.
824   //Íà÷àëüíûé çíà÷. ïåðåìåííûõ.
825   ZapisString := '';
826   FieldsString := '';
827   ZapisString := ZapSt;
828   Siz := sz;
829   FieldOv := 0;
830   SizFieldOv := 0;
831   kursor := 2;
832   //SizFieldOv := 2;
833   //ÄË ïîëÿ = 1 - ÷òîá ïðî÷èòàòü 1-é áàéò ïîëåé.
834   DLFilda := 1;
835   //Ïîëó÷åíèå ñòðîêè ïîëåé, îäíîâðåìåííî ïîäñ÷åò ïîëåé (ïðîñêîê ÄË+öèêë).
836   //Óçíàòü òèï ÄË çàïèñè (êîðîòêàÿ èëè äëèííàÿ) è âûâåñòè êóðñîð
837   //íà íà÷àëî ïîëåé.
838   if Chetnoe(byte(ZapisString[kursor])) = true then begin
839     //Ìîæíî íè÷å íå äåëàòü, êóðñîð óæå íà ïîñë. áàéòå ÄË
840     //(ïîñêîêó îí âñåãî îäèí :)  )
841   end
842   else begin
843     //Êóðñîð íà ïîñë. áàéò ÄË
844     kursor := kursor+3;
845     //SizFieldOv := SizFieldOv+3; //ÑÈÇÔÈËÄΠÑ×ÈÒÀÉÒ ÄËÈÍÓ ÑÒÐÎÊÈ ÏÎËÅÉ!
846   end;
847
848   //íà âñÿêèé ñëó÷àå "èíèöèàëèçàöèÿ" íåêîòîðûõ âàðîâ
849   b1 := 0;
850   b2 := 0;
851   b3 := 0;
852
853   //äàëüøå ðàáîòàòü...
854   repeat
855     //Êóðñîð âïåðåä, ñ÷åò÷èê ÄË óìåíüøèòü è äîïèñàòü áàéò.
856     kursor := kursor+1;
857     FieldsString := FieldsString+ZapisString[kursor];
858     SizFieldOv := SizFieldOv+1;
859     DLFilda := DLFilda-1;
860     //Ïðîâåðêà íà íà÷àëî íîâîãî ïîëÿ - ïî ÄË ïîëÿ.
861     if DLFilda = -1 then begin
862       //Åñëè íà÷àëîñü íîâîå ïîëå
863       FieldOv := FieldOv+1;
864     end;
865     if DLFilda = -2 then begin
866       //Åñëè ùàñ áàéò - íà÷àëî ÄË íîâîãî ïîëÿ.
867       //Íàäî ïðîâåðèòü òèï ÄË.
868       if Chetnoe(byte(ZapisString[kursor-1])) = true then begin
869         //Êîðîòêèé ÄË. Íà÷àòü îòñ÷åò ÄË ïîëÿ(íî óæå 2 áàéòà ïðîéäåíî).
870         DLFilda := GetDLSmall(byte(ZapisString[kursor-1]))-2;
871       end
872       else begin
873         //Äëèííûé ÄË. Ïðîäîëæàòü ìèíóñèòü ÄËÔèëäà è çàïèñàòü 1 áàéò.
874         b1 := byte(ZapisString[kursor-1]);
875       end;
876     end;
877     if DLFilda = -3 then begin
878       //Äëèííûé ÄË. Ïðîäîëæàòü ìèíóñèòü ÄËÔèëäà è çàïèñàòü 1 áàéò.
879       b2 := byte(ZapisString[kursor-1]);
880     end;
881     if DLFilda = -4 then begin
882       //Äëèííûé ÄË. Ïðîäîëæàòü ìèíóñèòü ÄËÔèëäà è çàïèñàòü 1 áàéò.
883       b3 := byte(ZapisString[kursor-1]);
884     end;
885     if DLFilda = -5 then begin
886       //Äëèííûé ÄË. Çàïèñàòü 1 áàéò, ïîñ÷èòàòü ÄË è íà÷àòü åãî îòñ÷åò.
887       b4 := byte(ZapisString[kursor-1]);
888       DLFilda := GetDLBig(b1, b2, b3, b4)-5 //íî 5 áàéòîâ óæå ïðîéäåíî.
889     end;
890   until kursor = Siz;
891   //FieldOv := FieldOv-1;
892   FieldsCreated := true;
893   ZapisCreated := true;
894 end;
895
896 Procedure TZapisBaziPz.BuildZap;
897 var
898   ChBaita : ChetireBaita;
899
900 begin
901   //Ñîçäàíèå ñòðîêè çàïèñè èç ñòðîêè ïîëåé.
902   //Íàäî ïðîñòî çàïèñàòü ÄË è áàéò 1.
903   ZapisString := '';
904   siz := 0;
905   ZapisString := ZapisString+char(byte(01));
906   siz := 1;
907   //Ïîëó÷åíèå ÄË. +2 - ò.ê ó÷åñòü çàãîëîâîê ñ êîðîòêèì ÄË.
908   if SizFieldOv+2 < 130 then begin
909     //Êîðîòêèé ÄË.
910     ZapisString := ZapisString+char(MakeDLSmall(SizFieldOv+2));
911     siz := siz+1;
912   end
913   else begin
914     //Äëèííûé ÄË.
915     ChBaita := MakeDLBig(SizFieldOv+5);
916     //Çàïèñü áàéòîâ...
917     ZapisString := ZapisString+char(ChBaita[1]);
918     ZapisString := ZapisString+char(ChBaita[2]);
919     ZapisString := ZapisString+char(ChBaita[3]);
920     ZapisString := ZapisString+char(ChBaita[4]);
921     siz := siz+4;
922   end;
923   //Ïðèëåïèòü ñòðîêó ïîëåé.
924   ZapisString := ZapisString+FieldsString;
925   siz := siz+SizFieldOv;
926   ZapisCreated := true;
927 end;
928
929 Function TZapisBaziPz.GetField(const FieldNum : integer) : ANSIString;
930 var
931   I, J, kursor, DLFilda : integer;
932   b1, b2, b3, b4 : byte;
933   StrokaPolya : string;
934 begin
935   //Ôóíêöèÿ ïîëó÷åíèÿ ñòðîêè ñîäåðæèìîãî ïîëß èç ñòðîêè ïîëåé.
936   //Ïðîâåðèòü ïðàâèëüíîñòü íîìåðà ïîëÿ.
937   If (FieldNum > 0) and (FieldNum <= FieldOv) then begin
938     //Âûõîä êóðñîðîì íà íà÷àëî íóæíîãî ïîëÿ.
939     kursor := 1;
940     For I := 1 to FieldNum do begin
941       //Öèêë "ïðîãîíêè" ÷åðåç ïîëå.
942       kursor := kursor+1; //Ïðîñêî÷èòü íîìåð ïîëÿ â áàçå
943       if chetnoe(byte(FieldsString[kursor])) = true then begin
944         //Êîðîòêèé ÄË, ðàññ÷åò...
945         DLFilda := GetDLSmall(byte(FieldsString[kursor]))-2;
946       end
947       else begin
948         //Äëèííûé ÄË. Ðàññ÷åò è âûõîä êóðñîðîì íà ïîñëåäíèé áàéò ÄË.
949         b1 := byte(FieldsString[kursor]);
950         kursor := kursor+1;
951         b2 := byte(FieldsString[kursor]);
952         kursor := kursor+1;
953         b3 := byte(FieldsString[kursor]);
954         kursor := kursor+1;
955         b4 := byte(FieldsString[kursor]);
956         DLFilda := GetDLBig(b1,b2,b3,b4)-5;
957       end;
958       kursor := kursor+1; //- íà íà÷àëî ñîäåðæèìîãî ïîëÿ.
959       //Òåïåðü ïðîãíàòü ïî ïîëþ è âûéòè íà íà÷. ñëåäóþùåãî
960       //Åñëè ýòî íå íóæíîå ïîëå. Èíà÷å - ïîëå ïðî÷èòàòü.
961       if I <> FieldNum then kursor := kursor+DLFilda
962       else begin
963         //Ïðî÷èòàòü ïîëå.
964         StrokaPolya := '';
965         For J := 0 to DLFilda-1 do begin
966           StrokaPolya := StrokaPolya+char(FieldsString[kursor+J]);
967         end;
968         //Âåðíóòü äëèíó ñîäåðæèìîãî ïîëÿ
969         SizFieldOtv := DLFilda;
970       end;
971     end;
972     //Âåðíóòü ðåçàëò
973     Result := StrokaPolya;
974   end
975   else begin
976     //Ãðîìêî çàîðàòü ïðî îøèáêó...
977     MessageDLG('Íåïðàâèëüíûé íîìåð ïîëÿ áàçû!',mtError,[mbOk],0);
978     Result := 'ERROR!';
979   end;
980 end;
981
982 Procedure TZapisBaziPz.ReWriteField(const FieldNum, sizSt : integer; St: ANSIString);
983 var
984   I, J, kursor, DLFilda : integer;
985   b1, b2, b3, b4 : byte;
986   OldStroka : string;
987   ChB : ChetireBaita;
988 begin
989   //Ïðîöåäóðà çàïèñè íîâîãî çíà÷åíèÿ ïîëÿ â ñòðîêó ïîëåé, è ïåðåðàñ÷åò ÄË ïîëÿ.
990   //Ðåàëüíî æå ïðîèñõîäèò ïåðåçàïèñü ñòðîêè ïîëåé ñ íîâûì çíà÷åíèåì êîíêðåòíîãî ïîëÿ.
991   OldStroka := FieldsString;
992   FieldsString := '';
993   SizFieldOv := 0;
994   kursor := 0;
995   For I := 1 to FieldOv do begin
996     kursor := kursor+1;
997     FieldsString := FieldsString+OldStroka[kursor];
998     SizFieldOv := SizFieldOv+1;
999     kursor := kursor+1;
1000     if I <> FieldNum then begin
1001       //Íåèçìåíÿåìîå ïîëå
1002       FieldsString := FieldsString+OldStroka[kursor];
1003       SizFieldOv := SizFieldOv+1;
1004       //Êóðñîð ñòîèò òåïåðü íà íà÷àëå ÄË.
1005       if chetnoe(byte(OldStroka[kursor])) then begin
1006         DLFilda := GetDLSmall(byte(OldStroka[kursor]))-2;
1007       end
1008       else begin
1009         b1 := byte(OldStroka[kursor]);
1010         kursor := kursor+1;
1011         FieldsString := FieldsString+OldStroka[kursor];
1012         SizFieldOv := SizFieldOv+1;
1013         b2 := byte(OldStroka[kursor]);
1014         kursor := kursor+1;
1015         FieldsString := FieldsString+OldStroka[kursor];
1016         SizFieldOv := SizFieldOv+1;
1017         b3 := byte(OldStroka[kursor]);
1018         kursor := kursor+1;
1019         FieldsString := FieldsString+OldStroka[kursor];
1020         SizFieldOv := SizFieldOv+1;
1021         b4 := byte(OldStroka[kursor]);
1022         DLFilda := GetDlBig(b1,b2,b3,b4)-5;
1023       end;
1024       //Ïåðåïèñàòü ñîäåðæèìîå ïîëÿ...
1025       for J := 1 to DLFilda do begin
1026         kursor := kursor+1;
1027         FieldsString := FieldsString+OldStroka[kursor];
1028         SizFieldOv := SizFieldOv+1;
1029       end;
1030     end
1031     else begin
1032       //Èçìåíÿåìîå ïîëå.
1033       //Ïðîãíàòü êóðñîð ÷òåíèÿ ÷åðåç ïîëå íî íå ïåðåïèñûâàòü ïîëÿ
1034       //Êóðñîð ñòîèò òåïåðü íà íà÷àëå ÄË.
1035       if chetnoe(byte(OldStroka[kursor])) then begin
1036         DLFilda := GetDLSmall(byte(OldStroka[kursor]))-2;
1037       end
1038       else begin
1039         b1 := byte(OldStroka[kursor]);
1040         kursor := kursor+1;
1041         b2 := byte(OldStroka[kursor]);
1042         kursor := kursor+1;
1043         b3 := byte(OldStroka[kursor]);
1044         kursor := kursor+1;
1045         b4 := byte(OldStroka[kursor]);
1046         DLFilda := GetDlBig(b1,b2,b3,b4)-5;
1047       end;
1048       //Ïðîãíàòü ÷åðåç ñîäåðæèìîå ïîëÿ...
1049       for J := 1 to DLFilda do begin
1050         kursor := kursor+1;
1051       end;
1052       //À òåïåðü ñîáñíî çàïèñàòü ïîëå çàíîâî.
1053       //Ïèøó ÄË
1054       if sizST+2 < 130 then begin
1055         b1 := MakeDLSmall(sizST+2);
1056         FieldsString := FieldsString+char(b1);
1057         SizFieldOv := SizFieldOv+1;
1058       end
1059       else begin
1060         ChB := MakeDLBig(sizST+5);
1061         FieldsString := FieldsString+char(ChB[1]);
1062         SizFieldOv := SizFieldOv+1;
1063         FieldsString := FieldsString+char(ChB[2]);
1064         SizFieldOv := SizFieldOv+1;
1065         FieldsString := FieldsString+char(ChB[3]);
1066         SizFieldOv := SizFieldOv+1;
1067         FieldsString := FieldsString+char(ChB[4]);
1068         SizFieldOv := SizFieldOv+1;
1069       end;
1070       //Ïèøó ñîäåðæèìîå
1071       For J := 1 to sizST do begin
1072         FieldsString := FieldsString+st[J];
1073         SizFieldOv := SizFieldOv+1;
1074       end;
1075     end;
1076   end;
1077 end;
1078
1079 Procedure TZapisBaziPz.CreateFields(const FieldNum : integer; NomPoley : StoIntegerov);
1080 var
1081   I : integer;
1082 begin
1083   //Ñîçäàíèå ñòðîêè ïîëåé (îáû÷íî åñëè íåò ñòðîêè çàïèñè).
1084   FieldsCreated := true;
1085   ZapisCreated := false;
1086   FieldOv := 0;
1087   Siz := 0;
1088   SizFieldOv := 0;
1089   FieldsString := '';
1090   ZapisString := '';
1091   for I := 1 to FieldNum do begin
1092     FieldsString := FieldsString+char(byte(NomPoley[I]));
1093     SizFieldOv := SizFieldOv+1;
1094     FieldsString := FieldsString+char(byte(0));
1095     SizFieldOv := SizFieldOv+1;
1096   end;
1097   FieldOv := FieldNum;
1098 end;
1099
1100 Procedure VipravitFaili(DirPath : string);
1101 var
1102   I : integer;
1103   FailEst : boolean;
1104   FNam, FNam2 : string;
1105 begin
1106   //Ïðîöåäóðà ïðîâåðêè è ðåïàðàöèè èìåí ôàéëîâ (åñëè 2 èç ôàéëîâ áûë óäàëåí).
1107   //Ïåðâîå - äîéòè äî òî÷êè ðàçðûâà.
1108   I := 0;
1109   repeat
1110     I := I+1;
1111     FailEst := false;
1112     FNam := GenerateNumName(I,'')+'.zap';
1113     If FileExistsDiv(FNam,DirPath) = true then FailEst := true;
1114   until FailEst = false;
1115   //Âûïðàâëåíèå...
1116   repeat
1117     I := I+1;
1118     FailEst := false;
1119     FNam := GenerateNumName(I-1,'')+'.zap';
1120     FNam2 := GenerateNumName(I,'')+'.zap';
1121     if FileExistsDiv(FNam2,DirPath) = true then begin
1122       FailEst := true;
1123       RenameFile(DirPath+FNam2,DirPath+FNam);
1124     end;
1125   until FailEst = false;
1126 end;
1127
1128 Function OtkusitPodPole(Point1 : PointToStr) : string;
1129 var
1130   Otkusheno, DL : Integer;
1131 begin
1132   //Ôóíêà äëÿ îòêóñûâàíèÿ îò ñëîæíîãî ïîëÿ ïåðâîãî ïîäïîëÿ.
1133   //Þçàåò ÁîøêÎòêóñàëêó èç MySys.pas
1134
1135   //Ïðîâåðèòü òèï ÄË.
1136   if Chetnoe(byte(Point1^[2])) = true then begin
1137     //ÄË êîðîòêèé.
1138     DL := GetDlSmall(byte(Point1^[2]))-2;
1139     Otkusheno := 2;
1140   end
1141   else begin
1142     //ÄË äëèííûé
1143     DL := GetDlBig(byte(Point1^[2]),byte(Point1^[3]),byte(Point1^[4]),byte(Point1^[5]))-5;
1144     Otkusheno := 5;
1145   end;
1146
1147   //À òåïåðü ïðîñòî ÎòÊóÑèÒü ÂñÅ íÅíÓæÍîÅ!!!!!
1148   OtkusitStrokeBashku(@Point1^,Otkusheno);
1149   //À ïîòîì ÂÛêóñèòü íóæíûé êóñîê...
1150   Result := OtkusitStrokeBashku(@Point1^,DL);
1151
1152   //Íó âîò âðîäå âñå...
1153 end;
1154
1155 Function AddPodPole(const Str, AddStr : string; zagol : integer): string;
1156 var
1157   SizText : integer;
1158   ChBaita : ChetireBaita;
1159 begin
1160   //Ôóíêà äëÿ äîáàâëåíèÿ ïîäïîëÿ â ñòðîêó ñëîæíîãî ïîëÿ.
1161
1162   //Ñíà÷àëà ïðèëåïèòü çàãîëîâîê.
1163
1164   Result := Str;
1165   Result := Result+char(byte(zagol));
1166
1167   //Òåïåðü ïîëó÷èòü (è äîáàâèòü) ÄË.
1168   SizText := Length(AddStr);
1169   if SizText+2 < 130 then begin
1170     //Êîðîòêèé ÄË.
1171     Result := Result+char(MakeDLSmall(SizText+2));
1172   end
1173   else begin
1174     //Äëèííûé ÄË.
1175     ChBaita := MakeDLBig(SizText+5);
1176</