/////////////////////////////////////////////////////////// // 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 SinglAcksDbR2Form; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, initer, KOLClearDir, mySys, Grids, ValEdit, KOLFileInString; type TSinglAcksDbR2F = 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 SinglAcksDbR2F: TSinglAcksDbR2F; PathForForm, MaskaNam, FileNam, ShablonsPath, ASoundField2, ASoundField3, ASoundField4, ASoundField5, ASoundField6 : String; Indeks : MaskFileArr; Fil1 : TFileInString; Zap1 : TZapisBaziPZ; FileLoaded, TableActivated : boolean; implementation uses PZed, ShablonimForm, QskFnForm, CheckShablForm, UncAskForm; {$R *.dfm} procedure TSinglAcksDbR2F.FormClose(Sender: TObject; var Action: TCloseAction); begin Fil1.Free; Zap1.Free; SinglAcksDbR2FClosed := true; MainForm.AcksMenu2.Checked := false; Action := CaFree; end; procedure TSinglAcksDbR2F.FormShow(Sender: TObject); var I, J, Num : integer; FailEst : boolean; resSt : string; begin Cascade; SinglAcksDbR2FClosed := 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] := ''; //Инициализ. обьектов для файла и записи... Fil1 := TFileInString.Init; Zap1 := TZapisBaziPZ.Init; //Подготовка переменных и списка редактируемых записей. IshDir := DatabaseResIsh; //Путь к базе PathForForm := IshDir+'acks\2\'; //Путь к записям базы ShablonsPath := Path+'shablons\acks\2\'; //Путь к шаблонам //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 TSinglAcksDbR2F.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 TSinglAcksDbR2F.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 TSinglAcksDbR2F.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)); //AgressVoice - поле 2 ASound. ASoundField2 := Zap1.GetField(2); ValuesEd.Cells[1,2] := GetASoundStr(ASoundField2); //SuspectVoice - поле 3 ASound. ASoundField3 := Zap1.GetField(3); ValuesEd.Cells[1,3] := GetASoundStr(ASoundField3); //KillVoice - поле 4 ASound. ASoundField4 := Zap1.GetField(4); ValuesEd.Cells[1,4] := GetASoundStr(ASoundField4); //RestVoice - поле 5 ASound. ASoundField5 := Zap1.GetField(5); ValuesEd.Cells[1,5] := GetASoundStr(ASoundField5); //InAgressVoice - поле 6 ASound. ASoundField6 := Zap1.GetField(6); ValuesEd.Cells[1,6] := GetASoundStr(ASoundField6); end; Function TSinglAcksDbR2F.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 AllOk = true then begin //Name. поле 1. TEXT. BufSt := StrToPzDbStr2(ValuesEd.Cells[1,1]); Zap1.ReWriteField(1,Length(BufSt),BufSt); //AgressVoice. поле 2. ASound. Zap1.ReWriteField(2,Length(ASoundField2),ASoundField2); //SuspectVoice. поле 3. ASound. Zap1.ReWriteField(3,Length(ASoundField3),ASoundField3); //KillVoice. поле 4. ASound. Zap1.ReWriteField(4,Length(ASoundField4),ASoundField4); //RestVoice. поле 5. ASound. Zap1.ReWriteField(5,Length(ASoundField5),ASoundField5); //InAgressVoice. поле 6. ASound. Zap1.ReWriteField(6,Length(ASoundField6),ASoundField6); //Генерация строки записи... Zap1.BuildZap; result := true; end else begin MessageDLG(ErrorMsgStr,mtError,[mbOk],0); ValuesEd.SetFocus; result := false; //Если проверка не прошла. end; end; Procedure TSinglAcksDbR2F.ActivateTable(Sender : TObject); begin //Процедура активации управляющих элементов таблицы. If TableActivated = false then begin //Только если табла еще не активна. ValuesEd.ItemProps[1].EditStyle := esEllipsis; ValuesEd.ItemProps[2].EditStyle := esEllipsis; ValuesEd.ItemProps[3].EditStyle := esEllipsis; ValuesEd.ItemProps[4].EditStyle := esEllipsis; ValuesEd.ItemProps[5].EditStyle := esEllipsis; TableActivated := true; end; end; Procedure TSinglAcksDbR2F.DeActivateTable(Sender : TObject); begin //Процедура деактивации управляющих элементов таблицы. If TableActivated = true then begin //Только если табла уже активна. ValuesEd.ItemProps[1].EditStyle := esSimple; ValuesEd.ItemProps[2].EditStyle := esSimple; ValuesEd.ItemProps[3].EditStyle := esSimple; ValuesEd.ItemProps[4].EditStyle := esSimple; ValuesEd.ItemProps[5].EditStyle := esSimple; TableActivated := false; end; end; Function CheckMaska(const Maska : string) : boolean; var J : integer; begin //Процедура проверки маски на повтор. Result := true; For J := 0 to SinglAcksDbR2F.MaskiBox.Items.Capacity-1 do begin If SinglAcksDbR2F.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 SinglAcksDbR2F.MaskiBox.Items.Capacity-1 do begin If J <> IndAcr then If SinglAcksDbR2F.MaskiBox.Items.Strings[J] = Maska then Result := false; end; end; procedure TSinglAcksDbR2F.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 TSinglAcksDbR2F.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 TSinglAcksDbR2F.CloseButClick(Sender: TObject); begin Close; end; procedure TSinglAcksDbR2F.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 TSinglAcksDbR2F.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 TSinglAcksDbR2F.ValuesEdEditButtonClick(Sender: TObject); var TempStr : string; begin //При клике по кнопке на таблице. //Список проверок на номер строки. //Но сначала - "утрамбовать" инфу - в целях проверки. //И если все ок - тады ок. If GenZap(Sender) = true then begin If ValuesEd.Row = 2 then begin //Редактирование ASound. TempStr := EditASound(ASoundField2); If TempStr <> 'NIL' then begin ASoundField2 := TempStr; ValuesEd.Cells[1,2] := GetASoundStr(ASoundField2); end; end; If ValuesEd.Row = 3 then begin //Редактирование ASound. TempStr := EditASound(ASoundField3); If TempStr <> 'NIL' then begin ASoundField3 := TempStr; ValuesEd.Cells[1,3] := GetASoundStr(ASoundField3); end; end; If ValuesEd.Row = 4 then begin //Редактирование ASound. TempStr := EditASound(ASoundField4); If TempStr <> 'NIL' then begin ASoundField4 := TempStr; ValuesEd.Cells[1,4] := GetASoundStr(ASoundField4); end; end; If ValuesEd.Row = 5 then begin //Редактирование ASound. TempStr := EditASound(ASoundField5); If TempStr <> 'NIL' then begin ASoundField5 := TempStr; ValuesEd.Cells[1,5] := GetASoundStr(ASoundField5); end; end; If ValuesEd.Row = 6 then begin //Редактирование ASound. TempStr := EditASound(ASoundField6); If TempStr <> 'NIL' then begin ASoundField6 := TempStr; ValuesEd.Cells[1,6] := GetASoundStr(ASoundField6); end; end; end; end; procedure TSinglAcksDbR2F.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.