№ 4416 В разделе "Programming"
от July 8th, 2012,
В подшивках: Delphi, Lazarus, Pascal
Есть у меня один собственный проект IDE для микроконтроллеров AVR под мои собственные нужды. Там используется интерфейс с закладками в которых находится редактор с файлом. Выглядит оно примерно так:
Сделать при открытии\создании файла новую закладку с редактором легко. Достаточно только создать объекты, назначить им необходимые свойства и “присобачить” на форму. Сначала создайте (File->New->Frame) новый фрейм и нарисуйте в нем все содержимое закладки (таба, Tabsheet).
Теперь на главной форме добавте PageControl, OpenDialog, какую-нибудь кнопочку и создайте на нее событие с примерно следующим кодом:
procedure TForm1.act_file_openExecute(Sender: TObject); var NewFrame: TFrame1; NewTab: TTabSheet; begin NewFrame := TFrame1.Create(Application); NewTab := TTabSheet.Create(Application); NewTab.Parent := PageControl1; NewTab.Caption := 'Opening file...'; PageControl1.ActivePage := NewTab; NewFrame.Parent := NewTab; NewFrame.Align := alClient; NewFrame.SynMemo1.Clear; NewTab.Name:='filetab'+inttostr(PageControl1.PageCount); NewFrame.Name:='fileframe'+inttostr(PageControl1.PageCount); if OpenDialog1.Execute then begin NewFrame.SynMemo1.Lines.LoadFromFile(OpenDialog1.FileName); NewTab.Caption := ExtractFileName(OpenDialog1.FileName); NewFrame.StatusBar1.SimpleText := OpenDialog1.FileName; end; end;
В коде видно как создаются 2 новых объекта TTabSheet и TFrame1 (копия того самого фрейма, что создали выше), назначаются им соответствующие свойства и прикрепляются к PageControl на главной форме.
Это довольно легко и не требует особых знаний. Но что за IDE без форматирования кода или функции сохранения открытого файла? Нужно взаимодействовать с созданым объектом. Например, как можно сделать форматирование кода с помощью программы GNU Indent:
procedure TForm1.act_format_fileExecute(Sender: TObject); var AProcess: TProcess; I: Integer; OldText, NewText: String; begin AProcess := TProcess.Create(nil); for I:=0 to TFrame(PageControl1.ActivePage.Controls[0]).ControlCount-1 do if TFrame(PageControl1.ActivePage.Controls[0]).Controls[I] is TSynMemo then TSynMemo(TFrame(PageControl1.ActivePage.Controls[0]).Controls[I]).Lines.SaveToFile('tmp'); AProcess.CommandLine := 'indent -linux tmp'; AProcess.Options := AProcess.Options + [poWaitOnExit]; AProcess.Execute; for I:=0 to TFrame(PageControl1.ActivePage.Controls[0]).ControlCount-1 do if TFrame(PageControl1.ActivePage.Controls[0]).Controls[I] is TSynMemo then TSynMemo(TFrame(PageControl1.ActivePage.Controls[0]).Controls[I]).Lines.LoadFromFile('tmp'); DeleteFile('tmp'); DeleteFile('tmp~'); AProcess.Free; end;
Обратите внимание на ловкость с for
и if
. Поскольку на закладке всего 1 объект – наша копия фрейма, то сразу же у ActivePage берем объект с индексом 0. Как только получили его делаем перебор по его потомкам (чилдам, child) чтобы найти TSynMemo – редактор текста. Ну а дальше просто выполняем необходимые нам действия. Я тут конечно наговнокодил и можно было бы обойтись всего 1 циклом, но что поделать… Такова жизнь 🙂
Fortune cookie: Today's spam: poppa needs some new shoes
Leave a Reply