/////////////////////////////////////////////////////////// // EiEdit // // Редактор части ресурсов Проклятых Земель // // Copyright (C) 2002 Gipat Group // // Распространяется на условиях // // Gipat Group's opened EI-editor-utility license // // версии 1.0 // // // // www.gipatgroup.org // /////////////////////////////////////////////////////////// //К работе над данным файлом приложили руки, ноги.... короче аффтары: // 1) Sagrer (sagrer@yandex.ru) //////////////////////////////////////////////////////////////////////// unit ItemsIdbR5Form; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, initer, KOLClearDir, mySys, Grids, ValEdit, KOLFileInString; type TItemsIdbR5F = class(TForm) Label1: TLabel; Label2: TLabel; MaskiBox: TComboBox; FilesBox: TComboBox; SaveBut: TButton; CloseBut: TButton; CreateBut: TButton; DeleteBut: TButton; ValuesEd: TValueListEditor; ZashablonitBut: TButton; SortBut: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject); procedure MaskiBoxClick(Sender: TObject); procedure FilesBoxClick(Sender: TObject); Procedure LoadFil(const FilNam : string; Sender: TObject); Function GenZap(Sender : TObject): boolean; Procedure ActivateTable(Sender : TObject); Procedure DeActivateTable(Sender : TObject); procedure ZashablonitButClick(Sender: TObject); procedure SaveButClick(Sender: TObject); procedure CloseButClick(Sender: TObject); procedure CreateButClick(Sender: TObject); procedure DeleteButClick(Sender: TObject); procedure ValuesEdEditButtonClick(Sender: TObject); procedure SortButClick(Sender: TObject); private { Private declarations } public { Public declarations } end; Function CheckMaska(const Maska : string) : boolean; Function CheckMaska2(const Maska : string; IndAcr : integer) : boolean; var ItemsIdbR5F: TItemsIdbR5F; PathForForm, MaskaNam, FileNam,ShablonsPath, Unknown1, Unknown2, Unknown3, Unknown4, Unknown5, Unknown6, Unknown7, Unknown8, Unknown9, Unknown10, Unknown11, Unknown12 : String; Indeks : MaskFileArr; Fil1 : TFileInString; Zap1 : TZapisBaziPZ; FileLoaded, TableActivated : boolean; Unk1Siz, Unk2Siz, Unk3Siz, Unk4Siz, Unk5Siz, Unk6Siz, Unk7Siz, Unk8Siz, Unk9Siz, Unk10Siz, Unk11Siz, Unk12Siz : integer; implementation uses PZed, ShablonimForm, QskFnForm, CheckShablForm, UncAskForm; {$R *.dfm} procedure TItemsIdbR5F.FormClose(Sender: TObject; var Action: TCloseAction); begin Fil1.Free; Zap1.Free; ItemsIdbR5FClosed := true; MainForm.LmpItemsMenu5.Checked := false; Action := CaFree; end; procedure TItemsIdbR5F.FormShow(Sender: TObject); var I, J, Num : integer; FailEst : boolean; resSt : string; begin Cascade; ItemsIdbR5FClosed := false; //Очистка (на всякий случай). MaskaNam := ''; FileNam := ''; MaskiBox.Clear; FilesBox.Clear; FileLoaded := false; SaveBut.Enabled := false; DeleteBut.Enabled := false; ZashablonitBut.Enabled := false; DeactivateTable(Sender); //Очистка таблицы ValuesEd.Cells[1,1] := ''; ValuesEd.Cells[1,2] := ''; ValuesEd.Cells[1,3] := ''; ValuesEd.Cells[1,4] := ''; ValuesEd.Cells[1,5] := ''; ValuesEd.Cells[1,6] := ''; ValuesEd.Cells[1,7] := ''; ValuesEd.Cells[1,8] := ''; ValuesEd.Cells[1,9] := ''; ValuesEd.Cells[1,10] := ''; ValuesEd.Cells[1,11] := ''; ValuesEd.Cells[1,12] := ''; ValuesEd.Cells[1,13] := ''; ValuesEd.Cells[1,14] := ''; ValuesEd.Cells[1,15] := ''; ValuesEd.Cells[1,16] := ''; ValuesEd.Cells[1,17] := ''; ValuesEd.Cells[1,18] := ''; //Инициализ. обьектов для файла и записи... Fil1 := TFileInString.Init; Zap1 := TZapisBaziPZ.Init; //Подготовка переменных и списка редактируемых записей. IshDir := DatabaselmpResIsh; //Путь к базе PathForForm := IshDir+'items\5\'; //Путь к записям базы ShablonsPath := Path+'shablons\items\5\'; //Путь к шаблонам //ShowMessage(PathForForm); //Проверка папки... If DirectoryExists(PathForForm) then begin //Поиск файлов, их открытие и ввод переменных в список... I := 0; //FailEst : false; repeat I := I+1; FailEst := false; if FileExistsDiv(GenerateNumName(I,'')+'.zap',PathForForm) = true then begin //Файл есть FailEst := true; FilesBox.Items.Add(GenerateNumName(I,'')+'.zap'); //Вставка в индекс... Indeks[I,1] := GenerateNumName(I,'')+'.zap'; //Получение маски... Fil1.Load(PathForForm+Indeks[I,1]); Zap1.LoadZap(Fil1.FileString,Fil1.siz); MaskaNam := Zap1.GetField(1); //Убрать последний ноль. ResSt := MaskaNam; MaskaNam := ''; For J := 1 to Zap1.SizFieldOtv-1 do begin MaskaNam := MaskaNam+ResSt[J]; end; Indeks[I,2] := MaskaNam; MaskiBox.Items.Add(MaskaNam); //Проверить на уникальность маску... For J := 1 to MaskiBox.Items.Capacity-1 do begin //Минус 1 - чтоб последнюю внесенную маску не считать. If MaskaNam = Indeks[J,2] then begin MessageDLG('ВНИМАНИЕ!!, встречается повтор маски!',mtWarning,[mbOk],0); end; end; end; until FailEst = false; end else begin //ГРОМКА! заругаться, что нету папки! MessageDLG('Проверьте наличие исходника! Отсутствует папка с исходником данного раздела!',mtError,[mbOk],0); Close; end; end; procedure TItemsIdbR5F.MaskiBoxClick(Sender: TObject); var I : integer; begin //Поиск нужного имени файла по индексу... MaskaNam := MaskiBox.Text; //ShowMessage(MaskaNam); For I := 1 to MaskiBox.Items.Capacity do begin If MaskaNam=Indeks[I,2] then FileNam := Indeks[I,1]; end; //Выставка нужного элемента списка For I := 0 to FilesBox.Items.Capacity-1 do begin //Поиск... и выставление if FilesBox.Items.Strings[I] = FileNam then FilesBox.ItemIndex := I; end; LoadFil(PathForForm+FileNam,Sender); end; procedure TItemsIdbR5F.FilesBoxClick(Sender: TObject); var I : integer; begin //Поиск маски файла... FileNam := FilesBox.Text; //ShowMessage(MaskaNam); For I := 1 to FilesBox.Items.Capacity do begin If FileNam=Indeks[I,1] then MaskaNam := Indeks[I,2]; end; //Выставка нужного элемента списка For I := 0 to MaskiBox.Items.Capacity-1 do begin //Поиск... и выставление if MaskiBox.Items.Strings[I] = MaskaNam then MaskiBox.ItemIndex := I; end; //Загрузка файлА... LoadFil(PathForForm+FileNam,Sender); end; Procedure TItemsIdbR5F.LoadFil(const FilNam : string; Sender: TObject); var BufSt, StToText, BufSt1 : string; BufSiz, I, int1, int2, int3 : integer; ChB : ChetireBaita; Flt : Single; UnkEmpty : boolean; begin //ПроцеДурка открытия файЛа ActivateTable(Sender); Fil1.Load(FilNam); Zap1.LoadZap(Fil1.FileString,Fil1.siz); FileLoaded := true; SaveBut.Enabled := true; DeleteBut.Enabled := true; ZashablonitBut.Enabled := true; //Получение значений полей и вывод их на экран. //Name - поле 1 TEXT. ValuesEd.Cells[1,1] := PzDbStrToStr(Zap1.GetField(1)); //Unknown2 - поле 2 TEXT. (тип известен) ValuesEd.Cells[1,2] := PzDbStrToStr(Zap1.GetField(2)); //Unknown2 - поле 3 Неизвестное поле, обычно 4 байта длиной. Unknown2 := Zap1.GetField(3); Unk2Siz := Zap1.SizFieldOtv; ValuesEd.Cells[1,3] := GetUnkStr(Unknown2,Unk2Siz); //Unknown3 - поле 4 TEXT. (тип известен) ValuesEd.Cells[1,4] := PzDbStrToStr(Zap1.GetField(4)); //Unknown4 - поле 5 Неизвестное поле, обычно 4 байта длиной. Unknown4 := Zap1.GetField(5); Unk4Siz := Zap1.SizFieldOtv; ValuesEd.Cells[1,5] := GetUnkStr(Unknown4,Unk4Siz); //Graphics Data Texture Type Index - поле 6 UnsLong. ValuesEd.Cells[1,6] := IntToStr(_4byteStrToUnsLong(Zap1.GetField(6))); //Graphics Data Texture Type Index2 - поле 7 UnsLong. ValuesEd.Cells[1,7] := IntToStr(_4byteStrToUnsLong(Zap1.GetField(7))); //Unknown5 - поле 8 FLOAT. (тип известен) ValuesEd.Cells[1,8] := FloatToStrMy(RoundFloat(_4byteStrToFloat(Zap1.GetField(8)),7)); //Unknown6 - поле 9 FLOAT. (тип известен) ValuesEd.Cells[1,9] := FloatToStrMy(RoundFloat(_4byteStrToFloat(Zap1.GetField(9)),7)); //Unknown7 - поле 10 FLOAT. (тип известен) ValuesEd.Cells[1,10] := FloatToStrMy(RoundFloat(_4byteStrToFloat(Zap1.GetField(10)),7)); //Unknown8 - поле 11 FLOAT. (тип известен) ValuesEd.Cells[1,11] := FloatToStrMy(RoundFloat(_4byteStrToFloat(Zap1.GetField(11)),7)); //Unknown9 - поле 12 UnsLong. (тип известен) ValuesEd.Cells[1,12] := IntToStr(_4byteStrToUnsLong(Zap1.GetField(12))); //Unknown10 - поле 13 FLOAT. (тип известен) ValuesEd.Cells[1,13] := FloatToStrMy(RoundFloat(_4byteStrToFloat(Zap1.GetField(13)),7)); //Unknown11 - поле 14 UnsLong. (тип известен) ValuesEd.Cells[1,14] := IntToStr(_4byteStrToUnsLong(Zap1.GetField(14))); //ShopInfo - поле 15. ValuesEd.Cells[1,15] := UnsLongToShopInfo(_4byteStrToUnsLong(Zap1.GetField(15))); //Unknown12 - поле 16 BOOLEAN. (тип известен) ValuesEd.Cells[1,16] := BoolToStr(_1byteStrToBool(Zap1.GetField(16))); //ScriptID - поле 17 UnsLong. ValuesEd.Cells[1,17] := IntToStr(_4byteStrToUnsLong(Zap1.GetField(17))); //Quest Items Zones - поле 18 List. ValuesEd.Cells[1,18] := ListToStr(Zap1.GetField(18)); end; Function TItemsIdbR5F.GenZap(Sender : TObject): boolean; //Функа для перевода инфы из таблицы формы //в память экземпляра обьекта для работы с записями баз ПЗ. var BufSt, Res1St, BufSt1, BufSt2, ErrorMsgStr : string; SizBufSt, I, int1, int2 : integer; bf1 : char; Flt1 : Extended; ChB : ChetireBaita; AllOk : boolean; begin //Проверка полей на правильность AllOk := true; ErrorMsgStr := ''; if CheckMaska2(ValuesEd.Cells[1,1],MaskiBox.ItemIndex) = false then begin AllOk := false; //Name ValuesEd.Selection := SelGridRect(1,1); ErrorMsgStr := 'Неправильная маска - такая уже есть. Маска берется из выделенного поля.'; Beep; end; if CheckStrInt(ValuesEd.Cells[1,6]) = false then begin AllOk := false; //Graphics Data Texture Type Index ValuesEd.Selection := SelGridRect(1,6); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrInt(ValuesEd.Cells[1,7]) = false then begin AllOk := false; //Graphics Data Texture Type Index2 ValuesEd.Selection := SelGridRect(1,7); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrFloat(ValuesEd.Cells[1,8]) = false then begin AllOk := false; //Unknown5 ValuesEd.Selection := SelGridRect(1,8); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrFloat(ValuesEd.Cells[1,9]) = false then begin AllOk := false; //Unknown6 ValuesEd.Selection := SelGridRect(1,9); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrFloat(ValuesEd.Cells[1,10]) = false then begin AllOk := false; //Unknown7 ValuesEd.Selection := SelGridRect(1,10); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrFloat(ValuesEd.Cells[1,11]) = false then begin AllOk := false; //Unknown8 ValuesEd.Selection := SelGridRect(1,11); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrInt(ValuesEd.Cells[1,12]) = false then begin AllOk := false; //Unknown9 ValuesEd.Selection := SelGridRect(1,12); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrFloat(ValuesEd.Cells[1,13]) = false then begin AllOk := false; //Unknown10 ValuesEd.Selection := SelGridRect(1,13); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckStrInt(ValuesEd.Cells[1,14]) = false then begin AllOk := false; //Unknown11 ValuesEd.Selection := SelGridRect(1,14); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckShopInfo(ValuesEd.Cells[1,15]) = false then begin AllOk := false; //Жоп-инфу проверить ValuesEd.Selection := SelGridRect(1,15); ErrorMsgStr := 'Выделенное поле имеет неправильный формат. Это должен быть список номеров магазинов, разделенный запятыми, и заканчивающийся последней цифрой магазина (никаких других символов дальше)'; Beep; end; if CheckStrBool(ValuesEd.Cells[1,16]) = false then begin AllOk := false; //Unknown12 ValuesEd.Selection := SelGridRect(1,16); ErrorMsgStr := 'Выделенное поле имеет неправильный формат. Либо ноль - значит "нет", либо единица - значит "да" (тобиш 0=False, 1=True)'; Beep; end; if CheckStrInt(ValuesEd.Cells[1,17]) = false then begin AllOk := false; //Quest Items ScriptID ValuesEd.Selection := SelGridRect(1,17); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'; Beep; end; if CheckList(ValuesEd.Cells[1,18]) = false then begin AllOk := false; //Quest Items ScriptID ValuesEd.Selection := SelGridRect(1,18); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'+#13+'Это должен быть список текстовых значений, разделенный запятыми. Запятой в конце и начале быть не должно, 2-х запятых подряд быть не должно, лишние пробелы (после запятых) удаляются.'; Beep; end else begin //Убрать пробелы, и еще раз проверить. ValuesEd.Cells[1,18] := ListBezProbelov(ValuesEd.Cells[1,18]); if CheckList(ValuesEd.Cells[1,18]) = false then begin AllOk := false; ValuesEd.Selection := SelGridRect(1,18); ErrorMsgStr := 'Выделенное поле имеет неправильный формат.'+#13+'Это должен быть список текстовых значений, разделенный запятыми. Запятой в конце и начале быть не должно, 2-х запятых подряд быть не должно, лишние пробелы (после запятых) удаляются.'; Beep; end; end; //Теперь собственно сохранение (если все в порядке) If AllOk = true then begin //Name. поле 1. TEXT. //Получить ПЗ-базовскую строку... PzDbStrRec := StrToPzDbStr(ValuesEd.Cells[1,1]); //Добавка в запись... Zap1.ReWriteField(1,PzDbStrRec.Siz,PzDbStrRec.Str); //Unknown1. поле 2. TEXT. //Получить ПЗ-базовскую строку... PzDbStrRec := StrToPzDbStr(ValuesEd.Cells[1,2]); //Добавка в запись... Zap1.ReWriteField(2,PzDbStrRec.Siz,PzDbStrRec.Str); //Unknown2. поле 3. Длина и тип неизвестны. Zap1.ReWriteField(3,Unk2Siz,Unknown2); //Unknown3. поле 4. TEXT. //Получить ПЗ-базовскую строку... PzDbStrRec := StrToPzDbStr(ValuesEd.Cells[1,4]); //Добавка в запись... Zap1.ReWriteField(4,PzDbStrRec.Siz,PzDbStrRec.Str); //Unknown4. поле 5. Длина и тип неизвестны. Zap1.ReWriteField(5,Unk4Siz,Unknown4); //Graphics Data Texture Type Index. поле 6. UnsLong. Zap1.ReWriteField(6,4,UnsLongTo4byteStr(StrToInt(ValuesEd.Cells[1,6]))); //Graphics Data Texture Type Index2. поле 7. UnsLong. Zap1.ReWriteField(7,4,UnsLongTo4byteStr(StrToInt(ValuesEd.Cells[1,7]))); //Unknown5. поле 8. FLOAT. Zap1.ReWriteField(8,4,FloatTo4byteStr(StrToFloat2(ValuesEd.Cells[1,8]))); //Unknown6. поле 9. FLOAT. Zap1.ReWriteField(9,4,FloatTo4byteStr(StrToFloat2(ValuesEd.Cells[1,9]))); //Unknown7. поле 10. FLOAT. Zap1.ReWriteField(10,4,FloatTo4byteStr(StrToFloat2(ValuesEd.Cells[1,10]))); //Unknown8. поле 11. FLOAT. Zap1.ReWriteField(11,4,FloatTo4byteStr(StrToFloat2(ValuesEd.Cells[1,11]))); //Unknown9. поле 12. UnsLong. Zap1.ReWriteField(12,4,UnsLongTo4byteStr(StrToInt(ValuesEd.Cells[1,12]))); //Unknown10. поле 13. FLOAT. Zap1.ReWriteField(13,4,FloatTo4byteStr(StrToFloat2(ValuesEd.Cells[1,13]))); //Unknown11. поле 14. UnsLong. Zap1.ReWriteField(14,4,UnsLongTo4byteStr(StrToInt(ValuesEd.Cells[1,14]))); //ShopInfo. поле 15. Zap1.ReWriteField(15,4,UnsLongTo4byteStr(ShopInfoToUnsLong(ValuesEd.Cells[1,15]))); //Unknown12. поле 16. BOOLEAN. Zap1.ReWriteField(16,1,BoolTo1byteStr(StrToBool(ValuesEd.Cells[1,16]))); //Quest Items ScriptID. поле 17. UnsLong. Zap1.ReWriteField(17,4,UnsLongTo4byteStr(StrToInt(ValuesEd.Cells[1,17]))); //Quest Items Zones. поле 18. LIST. BufSt := StrToList(ValuesEd.Cells[1,18]); Zap1.ReWriteField(18,Length(BufSt),BufSt); //Генерация строки записи... Zap1.BuildZap; result := true; end else begin MessageDLG(ErrorMsgStr,mtError,[mbOk],0); ValuesEd.SetFocus; result := false; //Если проверка не прошла. end; end; Procedure TItemsIdbR5F.ActivateTable(Sender : TObject); begin //Процедура активации управляющих элементов таблицы. If TableActivated = false then begin //Только если табла еще не активна. ValuesEd.ItemProps[2].EditStyle := esEllipsis; ValuesEd.ItemProps[4].EditStyle := esEllipsis; TableActivated := true; end; end; Procedure TItemsIdbR5F.DeActivateTable(Sender : TObject); begin //Процедура деактивации управляющих элементов таблицы. If TableActivated = true then begin //Только если табла уже активна. ValuesEd.ItemProps[2].EditStyle := esSimple; ValuesEd.ItemProps[4].EditStyle := esSimple; TableActivated := false; end; end; Function CheckMaska(const Maska : string) : boolean; var J : integer; begin //Процедура проверки маски на повтор. Result := true; For J := 0 to ItemsIdbR5F.MaskiBox.Items.Capacity-1 do begin If ItemsIdbR5F.MaskiBox.Items.Strings[J] = Maska then Result := false; end; end; Function CheckMaska2(const Maska : string; IndAcr : integer) : boolean; var J : integer; begin //Процедура проверки маски на повтор, при проверке поля... Result := true; For J := 0 to ItemsIdbR5F.MaskiBox.Items.Capacity-1 do begin If J <> IndAcr then If ItemsIdbR5F.MaskiBox.Items.Strings[J] = Maska then Result := false; end; end; procedure TItemsIdbR5F.ZashablonitButClick(Sender: TObject); var ShablName : string; begin //Эта функа должна создавать шаблон на основе открытой записи. //На всякий случай приготовить базу вроде как к записи //И если ОК - продолжить If GenZap(Sender) = true then begin //Выдать окно для создания шаблона (узнать имя) ShablonimF.ShablsPath := ShablonsPath; ShablonimF.ShowModal; If ShablonimF.ModalResult = mrOk then begin //В форме ОКнули.. ShablName := GetFileName(ShablonimF.ShablPath); //Перестроить запись PzDbStrRec := StrToPzDbStr(ShablName); Zap1.ReWriteField(1,PzDbStrRec.Siz,PzDbStrRec.Str); Zap1.BuildZap; //Сохранить... Fil1.FileString := Zap1.ZapisString; //Fil1.Siz := Zap1.Siz; Fil1.Save(ShablonimF.ShablPath); end; end; end; procedure TItemsIdbR5F.SaveButClick(Sender: TObject); var I : integer; begin //Процедура сохранения файла... //Проверить таблицу и если ОК - сгенерить ее строку If GenZap(Sender) = true then begin //Сохранение в файл... Fil1.FileString := Zap1.ZapisString; //Fil1.Siz := Zap1.Siz; Fil1.Save(PathForForm+FileNam); //Поменять маску в списке. I := MaskiBox.ItemIndex; indeks[I+1,2] := ValuesEd.Cells[1,1]; MaskiBox.Items.Strings[I] := ValuesEd.Cells[1,1]; MaskiBox.ItemIndex := I; end; end; procedure TItemsIdbR5F.CloseButClick(Sender: TObject); begin Close; end; procedure TItemsIdbR5F.CreateButClick(Sender: TObject); var ind1, Ind2 : boolean; Maska, FNam, ShablNam : string; I, J : integer; begin //Процедура для создания нового файла. //Запрос маски, если ОК то продолжить... ind1 := false; repeat AskFnForm.QuestionDial := 'Введите значение поля Name для новой записи (маску):'; AskFnForm.ShowModal; if AskFnForm.ModalResult = MrOk then begin Maska := AskFnForm.AnswerDial; if CheckMaska(Maska) = true then begin //Если маска уникальна. //Теперь надо выбрать шаблон. ShablonimF.ShablsPath := ShablonsPath; CheckShablF.ShowModal; //Если шаблон был выбран то продолжить //иначе - полная отмена. If CheckShablF.ModalResult = mrOk then begin //ShowMessage(ShablPath); //Если ОКнули... //Получить уникальное имя... I := 0; repeat Ind2 := true; I := I+1; FNam := GenerateNumName(I,'')+'.zap'; For J := 0 to FilesBox.Items.Capacity-1 do begin if FNam = FilesBox.Items.Strings[J] then ind2 := false; end; until ind2 = true; FileNam := FNam; //Теперь открыть шаблон, сменить ему имя (маску), и //сохранить на новом месте. //Итак, загрузить шаблон Fil1.Load(ShablonimF.ShablPath); Zap1.LoadZap(Fil1.FileString,Fil1.siz); //Сменить маску... PzDbStrRec := StrToPzDbStr(Maska); Zap1.ReWriteField(1,PzDbStrRec.Siz,PzDbStrRec.Str); //Сгенерить строку записи... Zap1.BuildZap; //Сохранить... Fil1.FileString := Zap1.ZapisString; //Fil1.Siz := Zap1.Siz; Fil1.Save(PathForForm+FileNam); //Готово. Перевывести форму. FormShow(Sender); //Выйти списком куды надо и открыть файл. FilesBox.ItemIndex := FilesBox.Items.Capacity-1; FilesBoxClick(Sender); //Завершить цикл инда1... ind1 := true; end else begin //Если отменили... //Завершить цикл инда1... ind1 := true; end; end else begin //Если маска повторяется. MessageDLG('ОШИБКА! Такая запись уже есть в базе! Введите уникальную маску!',mtError,[mbOk],0); end; end else begin //Чтоб выход по отмене тока был ind1 := true; end; until ind1 = true; end; procedure TItemsIdbR5F.DeleteButClick(Sender: TObject); var OldIndex : integer; begin If MessageDLG('Действительно хотите удалить эту запись?',mtConfirmation,[mbYes]+[mbNo],0) = mrYes then begin //Процедура удаления файла записи. DeleteFile(PathForForm+FileNam); //Теперь выровнять имена файлов... VipravitFaili(PathForForm); //Теперь обновить список записей... //Очистить инфу формы... Fil1.Free; Zap1.Free; OldIndex := FilesBox.ItemIndex; FilesBox.Clear; MaskiBox.Clear; MaskaNam := ''; FileNam := ''; FormShow(sender); //Если был стерт последний файл в списке //То сместиться на 1 позицию назад. If OldIndex = FilesBox.Items.Capacity then OldIndex := OldIndex-1; //Выставить позицию в списке. FilesBox.ItemIndex := OldIndex; //Загрузить файл. FilesBoxClick(Sender); end; end; procedure TItemsIdbR5F.ValuesEdEditButtonClick(Sender: TObject); begin //При клике по кнопке на таблице. //Список проверок на номер строки. //Но сначала - "утрамбовать" инфу - в целях проверки. //И если все ок - тады ок. If GenZap(Sender) = true then begin If ValuesEd.Row = 3 then begin //Ункновн1, предположительно типа UnsLong. 4 байта. //Итак, подготавливаю инфу для диалога запроса... UncAskF.UncAskFBuff := Unknown2; UncAskF.UncAskFBytes := Unk2Siz; UncAskFLetChangSiz := true; //Разрешить менять размер... UncAskF.ShowModal; If UncAskF.ModalResult = mrOk then begin //Если ОКнули If UncAskFSaved = false then begin //Если загрузили файл... //Поместить его в таблицу и память. Unknown2 := UncAskF.UncAskFBuff; Unk2Siz := UncAskF.UncAskFBytes; ValuesEd.Cells[1,3] := GetUnkStr(Unknown2,Unk2Siz); end; end; end; If ValuesEd.Row = 5 then begin //Ункновн1, предположительно типа UnsLong. 4 байта. //Итак, подготавливаю инфу для диалога запроса... UncAskF.UncAskFBuff := Unknown4; UncAskF.UncAskFBytes := Unk4Siz; UncAskFLetChangSiz := true; //Разрешить менять размер... UncAskF.ShowModal; If UncAskF.ModalResult = mrOk then begin //Если ОКнули If UncAskFSaved = false then begin //Если загрузили файл... //Поместить его в таблицу и память. Unknown4 := UncAskF.UncAskFBuff; Unk4Siz := UncAskF.UncAskFBytes; ValuesEd.Cells[1,5] := GetUnkStr(Unknown4,Unk4Siz); end; end; end; end; end; procedure TItemsIdbR5F.SortButClick(Sender: TObject); var SortInd : MaskFileArr; SortIndLength, i : integer; OldSourcePath : String; DirFile : File; begin //Сортирует записи в базе по маске - по алфавиту. if FilesBox.Items.Capacity > 1 then begin //Получить отсортированный массив. SortInd := SortStringFileArray(Indeks); //Перекопировать сырц в отсортированном виде... //Переименовать старую диру... OldSourcePath := PathForForm; SetLength(OldSourcePath,Length(OldSourcePath)-1); OldSourcePath := OldSourcePath+'_old\'; If DirectoryExists(OldSourcePath) = true then begin //Если папка под старый вариант уже существует. ClearDir(OldSourcePath,true); end; RenameDir(PathForForm,OldSourcePath); //Создать новую диру. CreateDir(DelLastSlash(PathForForm)); //Циклически - перекопировать (а если точнее - перенести) //файлы под новыми именами... i := 0; repeat //Нет нужды заново генерировать цифровые имена файлов. //Они уже записаны в indeks в нужном порядке и количестве, // пусть и относятся реально к другим файлам i := i+1; RenameFile(OldSourcePath+SortInd[i,1],PathForForm+Indeks[i,1]); until SortInd[i+1,1] = ''; //Удалить старую временную диру ClearDir(OldSourcePath,true); // А теперь - заново сгенерить список для формы. FormShow(Sender); end; end; end.