INT 21h

Домашняя страница самого страшного прерывания

Динамические объекты в 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 циклом, но что поделать… Такова жизнь :)

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

Оставьте ваш комментарий »

Форма отправки комментария

*

Разрешенные HTML-теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

RSS RSS Feed только для этого поста |


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