INT 21h

Hi, I am Vladimir Smagin, sysadmin. Telegram Email

Динамические объекты в Lazarus (Delphi) и доступ к ним

№ 4416 В разделе "Программирование" от July 8th, 2012,

Есть у меня один собственный проект 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 циклом, но что поделать… Такова жизнь 🙂

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Комментарии

  • 21h: нене ) без меня )
  • Серегй: Не совсем грабить)) если грабить можно и без рации, есть...
  • 21h: магазин грабить собрались? ) не, тут я не помощник ;)
  • Серегй: А что бы мне поймать чужую волну, что мне для этого нужно...
  • 21h: слушать никто не запрещает. нет закона, который запрещает...
  • Серегй: Я хотел узнать могу ли я просто прийти с данной рацией baofeng...
  • 21h: У меня есть только эти 2. По другим ничего не знаю. В интернете...

© Vladimir Smagin, 2005-2017. Копирование материалов без разрешения запрещено.
Яндекс.Метрика