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

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

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

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

CAPTCHA
*

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

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


Комментарии
  • Игорь: Все настроил, еще раз просмотрел видео и методом научного тыка все настроил и сохранил, все работает и обе...
  • 21h: Здравствуйте, Игорь! Я не знаю :) Думаю аналогично согласно инструкции к вашей радиостанции.
  • Игорь: Добрый день, просмотрел Ваше видео все доступно и ясно для 8 ми канальных радеек, но мне нада настроить 69...
  • Гоги: Есть инструкция к Моторолкам – она подходит к серии Motorola TLKR T4… Т8. В конце сетка частот и...
  • 21h: торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без...
  • Buter: Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать...
  • 21h: понятия не имею. гуглите инструкцию к вашей радейке и сверяйтесь с ней.
  • Денис: хочу их подружить с uv5r
  • Денис: t-388 walkie talkie на эти шпаргалочек нет,или как приминить ваши к их настройке?
  • John: Стекла для электроник – техночас.ру