Frames/ru
Фреймы являются именованными контейнерами для компонентов и очень похожи на Формы. Их уникальная способность заключается в том, что они могут быть встроены в формы или другие фреймы в дизайнере. В виде форм они хранятся в двух файлах: код хранится в файле .pas, а дизайн — в файле .lfm.
Contents
- 1 Как создать фрейм?
- 2 Как поместить фрейм на форму или в другой фрейм?
- 3 Для чего их можно использовать?
- 4 Инициализация частных переменных
- 5 Пример динамического создания
- 6 См.также
Как создать фрейм?
Нажмите пункт меню File->New. и откройте диалоговое окно, выбрав пункт «Frame».
Как поместить фрейм на форму или в другой фрейм?
Вкладка Standard в Палитре компонентов имеет специальный компонентный элемент «TFrame». Когда вы перетаскиваете его на форму или фрейм, IDE предлагает вам выбрать один из фреймов проекта. Вы должны сначала сохранить проект и новый фрейм, потому что только предварительно сохраненные фреймы могут появиться в списке выбора. Фреймы в пакетах пока не реализованы. Но вы можете создавать фреймы в коде даже в пакетах. Вы не можете создавать циклические фреймы — IDE запретит это, т.е. вы не можете поместить FrameA в FrameA, и вы не можете поместить любой фрейм, который содержит FrameA, в FrameA.
Для чего их можно использовать?
Они необходимы, когда у вас есть группа компонентов, которые вы хотите повторно использовать в нескольких формах. Группа должна иметь одинаковый набор элементов управления и логику между ними в разных окнах (формах) вашего приложения. Вы можете сгруппировать повторяющиеся элементы управления и логику в один фрейм и использовать этот фрейм в разных местах. Поэтому вам не нужно повторять работу по разметке элементов управления и написанию их логики.
Например, у вас есть два списка и кнопки для перемещения элементов между ними. Таким образом, вы можете создать фрейм с двумя списками и необходимыми кнопками, написать логику для перемещения элементов, а затем использовать свой фрейм во всех формах, где это необходимо. Более того, если вы обнаружите ошибку в коде фрейма, вы можете исправить ее один раз в коде фрейма вместо того, чтобы исправлять ее n раз среди всех форм.
Фрейм в дизайнере:
Фрейм, размещенный на форме:
Тот же фрейм помещен в другую форму:
Инициализация частных переменных
TFrame не имеет событий OnCreate или OnDestroy , в которых могут быть инициализированы и освобождены частные переменные. Для этого необходимо переопределить constructor и destructor по умолчанию.
TFrame1 = class(TFrame) private MyObj: TObject; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; end; constructor TFrame1.Create(TheOwner: TComponent); begin inherited Create(TheOwner); MyObj := TObject.Create; end; destructor TFrame1.Destroy; begin MyObj.Free inherited Destroy; end;
Пример динамического создания
Еще проще. Поскольку компонент TFrame из палитры компонентов не требуется. И вы можете создать приложение типа изменения страницы (например, приложение для смартфона) с сохранением ресурса.
unit Unit1; interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; GroupBox1: TGroupBox; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private Frame: TFrame; public end; var Form1: TForm1; implementation uses Unit2 , Unit3 , Unit4 ; procedure TForm1.FormCreate(Sender: TObject); begin Frame := TFrame1.Create(GroupBox1); Frame.Parent := GroupBox1; end; procedure TForm1.Button1Click(Sender: TObject); begin if not Assigned(Frame) then begin Frame := TFrame1.Create(GroupBox1); Frame.Parent := GroupBox1; end else if Frame is TFrame1 then begin Frame.Free; Frame := TFrame2.Create(GroupBox1); Frame.Parent := GroupBox1; end else if Frame is TFrame2 then begin Frame.Free; Frame := TFrame3.Create(GroupBox1); Frame.Parent := GroupBox1; end else begin FreeAndNil(Frame); end; end; end.
Form in DLL/ru
В следующей программе и библиотеке к ней показано, как можно отобразить модальную и немодальную форму, а также создать пользовательский компонент на форме из библиотеки DLL. Проверено на win32 и Linux/Gtk2 с помощью Lazarus 1.7 из trunk.
program MainApp; uses Interfaces, Classes, LCLType, Controls, StdCtrls, Forms, ExtCtrls; type TEnableDisableFormsCallBack = procedure(var FormList: Pointer); TCreateButtonCallBack = procedure(Caption: PChar; OnClick: TProcedure); const DLLDialogLib = 'DLLDialog.dll'; DLLDialogLib = 'DLLDialog.so'; procedure DLLDialog_Init(DisableFormsCallBack, EnableFormsCallback: TEnableDisableFormsCallBack); external DLLDialogLib; procedure DLLDialog_Final; external DLLDialogLib; procedure DLLDialog_ShowModal(ParentWindow: HWND); external DLLDialogLib; procedure DLLDialog_Show(ParentWindow: HWND); external DLLDialogLib; procedure DLLDialog_CreateDLLButton(ParentWindow: HWND); external DLLDialogLib; procedure DLLDialog_CreateButton(CreateButtonCallBack: TCreateButtonCallBack); external DLLDialogLib; type TMainForm = class(TForm) private PnlParent: TPanel; procedure BtnAddDLLButtonClick(Sender: TObject); procedure BtnAddButtonClick(Sender: TObject); procedure ShowModalDLLDialog(Sender: TObject); procedure ShowDLLDialog(Sender: TObject); public constructor Create(aOwner: TComponent); override; end; var MainForm: TMainForm; procedure DisableFormsCallBack(var FormList: Pointer); begin FormList := Screen.DisableForms(nil, TList(FormList)); end; procedure EnableFormsCallback(var FormList: Pointer); begin Screen.EnableForms(TList(FormList)); end; constructor TMainForm.Create(aOwner: TComponent); var BtnShow, BtnShowModal, BtnAddDLLButton, BtnAddButton: TButton; begin inherited CreateNew(aOwner); Position := poWorkAreaCenter; Width := 600; Height := 200; BtnShow := TButton.Create(Self); BtnShow.Parent := Self; BtnShow.Caption := 'Show form'; BtnShow.AutoSize := True; BtnShow.OnClick := @ShowDLLDialog; BtnShowModal := TButton.Create(Self); BtnShowModal.Parent := Self; BtnShowModal.Caption := 'Show modal form'; BtnShowModal.AutoSize := True; BtnShowModal.OnClick := @ShowModalDLLDialog; BtnShowModal.AnchorSide[akLeft].Control := BtnShow; BtnShowModal.AnchorSide[akLeft].Side := asrRight; BtnShowModal.BorderSpacing.Left := 10; BtnAddDLLButton := TButton.Create(Self); BtnAddDLLButton.Parent := Self; BtnAddDLLButton.Caption := 'Create real DLL button'; BtnAddDLLButton.AutoSize := True; BtnAddDLLButton.OnClick := @BtnAddDLLButtonClick; BtnAddDLLButton.AnchorSide[akLeft].Control := BtnShowModal; BtnAddDLLButton.AnchorSide[akLeft].Side := asrRight; BtnAddDLLButton.BorderSpacing.Left := 10; BtnAddButton := TButton.Create(Self); BtnAddButton.Parent := Self; BtnAddButton.Caption := 'Create fake DLL button'; BtnAddButton.AutoSize := True; BtnAddButton.OnClick := @BtnAddButtonClick; BtnAddButton.AnchorSide[akLeft].Control := BtnAddDLLButton; BtnAddButton.AnchorSide[akLeft].Side := asrRight; BtnAddButton.BorderSpacing.Left := 10; PnlParent := TPanel.Create(Self); PnlParent.Parent := Self; PnlParent.AnchorSide[akTop].Control := BtnShow; PnlParent.AnchorSide[akTop].Side := asrBottom; PnlParent.BorderSpacing.Top := 10; PnlParent.Width := 220; end; procedure CreateButtonCallBack(ACaption: PChar; AOnClick: TProcedure); var Btn: TButton; MyMethod: TMethod; begin Btn := TButton.Create(MainForm); Btn.Caption := ACaption; Btn.Left := 100; Btn.Width := 100; Btn.Height := 20; MyMethod.Code := AOnClick; MyMethod.Data := nil; Btn.OnClick := TNotifyEvent(MyMethod); Btn.Parent := MainForm.PnlParent; end; procedure TMainForm.BtnAddButtonClick(Sender: TObject); begin DLLDialog_CreateButton(@CreateButtonCallBack); end; procedure TMainForm.BtnAddDLLButtonClick(Sender: TObject); begin DLLDialog_CreateDLLButton(PnlParent.Handle); end; procedure TMainForm.ShowDLLDialog(Sender: TObject); begin DLLDialog_Show(0); end; procedure TMainForm.ShowModalDLLDialog(Sender: TObject); begin DLLDialog_ShowModal(Self.Handle); end; begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); DLLDialog_Init(@DisableFormsCallBack, @EnableFormsCallback); try Application.Run; finally DLLDialog_Final; end; end.
библиотека DLL с формой:
library DllDialog; uses Interfaces, Classes, LCLType, StdCtrls, Controls, Forms, Dialogs; type TDLLDialog = class(TForm) protected procedure CreateParams(var Params: TCreateParams); override; public procedure BtnShowMessageClick(Sender: TObject); constructor Create(aOwner: TComponent); override; public ParentFormHandle: HWND; end; TEnableDisableFormsCallBack = procedure(var FormList: Pointer); TCreateButtonCallBack = procedure(Caption: PChar; OnClick: TProcedure); TApplicationCallback = class(TComponent) private DisableFormsCallBack: TEnableDisableFormsCallBack; EnableFormsCallback: TEnableDisableFormsCallBack; FormList: Pointer; public procedure DisableForms(Sender: TObject); procedure EnableForms(Sender: TObject); procedure BtnClick(Sender: TObject); constructor Create(aOwner: TComponent); override; destructor Destroy; override; end; var ApplicationCallback: TApplicationCallback; procedure DLLDialog_Init(DisableFormsCallBack, EnableFormsCallback: TEnableDisableFormsCallBack); begin ApplicationCallback := TApplicationCallback.Create(nil); ApplicationCallback.DisableFormsCallBack := DisableFormsCallBack; ApplicationCallback.EnableFormsCallback := EnableFormsCallback; end; procedure DLLDialog_Final; begin ApplicationCallback.Free; end; procedure DLLDialog_ShowModal(ParentWindow: HWND); var DLLDialog: TDLLDialog; begin DLLDialog := TDLLDialog.Create(ApplicationCallback); try DLLDialog.ParentFormHandle := ParentWindow; DLLDialog.ShowModal; finally DLLDialog.Free; end; end; procedure DLLDialog_Show(ParentWindow: HWND); var DLLDialog: TDLLDialog; begin DLLDialog := TDLLDialog.Create(ApplicationCallback); DLLDialog.ParentFormHandle := ParentWindow; DLLDialog.Show; end; procedure DLLDialog_CreateDLLButton(ParentWindow: HWND); var Btn: TButton; BtnParentForm: TForm; begin BtnParentForm := TForm.CreateNew(ApplicationCallback); BtnParentForm.ParentWindow := ParentWindow; BtnParentForm.Width := 100; BtnParentForm.Height := 20; BtnParentForm.BorderStyle := bsNone; BtnParentForm.Visible := True; Btn := TButton.Create(ApplicationCallback); Btn.Caption := 'Real DLL Button'; Btn.Width := BtnParentForm.Width; Btn.Height := BtnParentForm.Height; Btn.OnClick := @ApplicationCallback.BtnClick; Btn.Parent := BtnParentForm; end; procedure FakeBtnClick; begin ShowMessage('You clicked a fake button from a DLL!'); end; procedure DLLDialog_CreateButton(CreateButtonCallBack: TCreateButtonCallBack); begin CreateButtonCallBack('Fake DLL Button', @FakeBtnClick); end; exports DLLDialog_Init, DLLDialog_Final, DLLDialog_ShowModal, DLLDialog_Show, DLLDialog_CreateButton, DLLDialog_CreateDLLButton; constructor TApplicationCallback.Create(aOwner: TComponent); begin inherited Create(aOwner); Application.AddOnModalBeginHandler(@DisableForms); Application.AddOnModalEndHandler(@EnableForms); end; procedure TApplicationCallback.BtnClick(Sender: TObject); begin ShowMessage('You clicked a real button from a DLL!'); end; destructor TApplicationCallback.Destroy; begin Application.RemoveOnModalBeginHandler(@DisableForms); Application.RemoveOnModalEndHandler(@EnableForms); inherited Destroy; end; procedure TApplicationCallback.DisableForms(Sender: TObject); begin DisableFormsCallBack(FormList); end; procedure TApplicationCallback.EnableForms(Sender: TObject); begin EnableFormsCallback(FormList); end; constructor TDLLDialog.Create(aOwner: TComponent); var BtnShowMessage: TButton; begin inherited CreateNew(aOwner); Caption := 'This form is in a DLL . '; Position := poWorkAreaCenter; Width := 200; Height := 100; BtnShowMessage := TButton.Create(Self); BtnShowMessage.Parent := Self; BtnShowMessage.Caption := 'Show message'; BtnShowMessage.AutoSize := True; BtnShowMessage.OnClick := @BtnShowMessageClick; end; procedure TDLLDialog.BtnShowMessageClick(Sender: TObject); begin ShowMessage('Hello from DLL!'); end; procedure TDLLDialog.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.WndParent := ParentFormHandle; end; begin Application.Initialize; end.
Как создать форму в фрипаскале
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Динамическое создание формы, Создать форму во время выполнения проги
17.01.2005 5:54
Группа: Пользователи
Сообщений: 34
Пол: Мужской
Репутация: -1
Чуваки, а кто-нить знает, как во время выполнения проги, создать еще одну форму?
Как обратиться к этой форме, как создать элементы на этой форме.
Заранее всем пасибо.
17.01.2005 6:38
AlexPS
А кто мешает тебе сделать что-то типа такого:
Первый Unit
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var Form1: TForm1;
implementation
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMyForm;
end;
end.
Второй Unit
unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm2 = class(TForm)
private
public
end;
var Form2: TForm2;
procedure ShowMyForm;
implementation
procedure ShowMyForm;
begin
Form2:=TForm2.Create(nil);
try
Form2.ShowModal;
finally Form2.Free; end;
end;
end.
Только не забудь выключить автоматическое создание для Form2
Для элементов формы аналогично .
17.01.2005 6:57
Группа: Пользователи
Сообщений: 34
Пол: Мужской
Репутация: -1
Это не совсем то, что мне надо. Тут я должен предварительно создать все формы, которые будут использоваться. А мне нужно, чтобы этих форм могло быть ОЧЕНЬ много, ну типа, чтобы мне их все вручную не создавать.
А может, я че не так понял.
Ну так надо было уточнять, есть несколько способов динамического создания форм, откуда я должен знать, о каком идет речь.
Сообщение отредактировано: volvo — 17.01.2005 13:07
17.01.2005 8:33
Группа: Пользователи
Сообщений: 737
Пол: Мужской
Репутация: 26
1) создаешь форму;
2) Project/Options/Forms: переносишь её из «Auto-create» в «Available»;
3) в нужном месте подключаешь модуль с формой (uses) и создаешь её с помощью метода Application.CreateForm. В принципе, можно обойтись вызовом конструктора самой формы — создавать последнюю как любой другой объект.
Целиком автономную форму можно создать как объект класса TForm. Элементы на нее добавляются методом TForm.InsertControl.
Сообщение отредактировано: xds — 17.01.2005 8:37
The idiots are winning.
17.01.2005 14:44
Группа: Пользователи
Сообщений: 180
Пол: Мужской
Репутация: 2
Вот этот метод (обработчик нажатия кнопки) создает с нуля форму с надписью:
procedure TForm1.Button1Click(Sender: TObject);
var frm: TForm;
lbl: TLabel;
begin
frm:=TForm.Create(Application);
frm.BoundsRect:=Rect(100,100,500,300);
lbl:=TLabel.Create(frm);
lbl.Left:=50; lbl.Top:=50;
lbl.Caption:=’proba’;
lbl.Parent:=frm; // или frm.InsertControl(lbl); — одно и то же
frm.Show;
end;
17.01.2005 23:53
Группа: Пользователи
Сообщений: 34
Пол: Мужской
Репутация: -1
Чуваки, я знал, что вы мне поможете, теперь все просто зашибись.
Пасибо.
21.01.2005 21:57
Группа: Пользователи
Сообщений: 34
Пол: Мужской
Репутация: -1
Конечно все ето крута, только вот я че не понял: а как бы мне управлять элементами н фозданной форме, например, создаю я Memo
var
mem:TMemo;
.
mem:=TMemo.Create(frm);
mem.Left:=2; Mem.Top:=2;
Mem.Height:=200; Mem.Width:=388;
Mem.ScrollBars:=SsVertical;
Mem.Parent:=frm;
.
А как бы мн в этот Memo добавить че-нить с главной формы.
Или, еще, например на этой форму есть кнопка, как обработать ее нажатие
Естественно, всем еще раз заранее пасибо большое.
Сообщение отредактировано: volvo — 21.01.2005 22:27
24.01.2005 13:03
Группа: Пользователи
Сообщений: 180
Пол: Мужской
Репутация: 2
чтобы кнопки обрабатывать, напиши заранее обработчик события:
type
TForm1=class(TForm)
.
procedure MyButtonClick(Sender: TObject);
.
end;
.
implementation
.
procedure TForm1.MyButtonClick(Sender: TObject);
begin
// . обращение к вызвавшей обработчик кнопке:
TButton(Sender).Caption:=’Нажата’;
end;
и назначь его кнопке при создании:
.
bt:=TButton.Create(frm);
.
bt.OnClick:=MyButtonClick;
.
а в Memo как обычно пиши — Memo.Lines.Add(‘aaa’);
только для этого придется переменную описать не в процедуре, а, например, в классе, чтоб ссылка не потерялась
Сообщение отредактировано: P@sh@ — 24.01.2005 13:38
Введение. Средства разработки программ на языке Free Pascal
Окно редактора (рис. 1.14) тесно связано с формой приложения (рис. 1.18) и появляется вместе с ним при создании нового проекта. Окно редактора по умолчанию находится на первом плане и закрывает окно формы. Переключаться между этими окнами можно командой Просмотр — Переключить модуль / форму, клавишей F12 или просто щелчком мыши.
Окно редактора предназначено для создания и редактирования текста программы, который создается по определённым.правилам и описывает некий алгоритм. Если окно формы определяет внешний вид будущей программы, то программный код, записанный в окне редактора, отвечает за её поведение.
Вначале окно редактора содержит текст, обеспечивающий работу пустой формы. Этот программный код появляется в окне редактора автоматически, а программист в ходе работы над проектом вносит в него дополнения, соответствующие функциям создаваемой программы.
Обратите внимание, что при загрузке Lazarus автоматически загружается последний проект, с которым работал пользователь. Происходит это благодаря отмеченному пункту Открывать последний проект при запуске (рис. 1.19), который находится на вкладке Файлы меню Окружение — Настройки окружения. Если убрать метку рядом с командой Открывать последний проект при запуске, то при загрузке Lazarus будет создавать новый проект.
Рис. 1.18. Окно формы и окно редактора
Рис. 1.19. Окно настройки файлов в среде Windows
Рис. 1.20. Настройки окна редактора программного кода
Настроить окно редактора можно с помощью вкладки Общие меню Окружение — Настройки редактора. (рис. 1.20). Для того чтобы установить (отменить) ту или иную настройку, достаточно установить (убрать) маркер рядом с её названием и подтвердить изменения нажатием кнопки Ok.
На вкладке Дисплей меню Окружение — Настройки редактора. (рис. 1.21) можно изменить шрифт текста программного кода.
Как и в большинстве текстовых редакторов, в редакторе программного кода Lazarus предусмотрена работа с шаблонами. Здесь под шаблоном подразумевается автоматический ввод конструкций языка программирования. Например, пользователь вводит символ b , затем символ пробел, а на экране появляется конструкция begin. end . Настройку шаблонов можно выполнить в диалоговом окне (рис. 1.22), которое появится после выполнения команды Окружение — Шаблоны кода. Например, чтобы заработал рассмотренный шаблон, нужно выбрать (щёлкнуть по нему мышкой) в списке шаблонов строку b — begin. end и установить маркер рядом с командой Включить макросы. Затем в группе команд Автозавершение при обнаружении. выбрать слово пробела. Если среди команд автозавершения выбрать конец строки, то шаблон будет появляться в тексте программы после ввода символа b и нажатия клавиши Enter.
Рис. 1.21. Окно настройки редактора программного кода, вкладка Дисплей
Рис. 1.22. Окно настройки шаблонов редактора программного кода в среде Linux
Рис. 1.23. Окно создания шаблона программного кода
Шаблоны можно добавлять, удалять и править. Для этого в окне Шаблоны кода предусмотрены специальные кнопки. В нижней части окна, над кнопками Ok и Отмена, расположено поле ввода и редактирования шаблонов с активным курсором. Если выделить любой шаблон из списка, щёлкнув по нему мышкой, то в поле ввода появится соответствующая конструкция.
Если воспользоваться кнопкой Добавить, то появится диалоговое окно (рис. 1.23) для создания шаблона. Здесь в поле Элемент следует указать символ или группу символов, ввод которых будет связан с создаваемым шаблоном. В поле Комментарий можно дать краткое описание шаблона и нажать кнопку Добавить. Элемент и комментарий к нему будут добавлены в список шаблонов в окне Шаблоны кода. Теперь нужно создать сам шаблон, то есть указать, какая именно конструкция языка появится при вводе элемента в текст программы. Для этого надо выделить вновь созданный шаблон и в поле ввода, расположенном в нижней части окна Шаблоны кода, ввести соответствующий текст.
Например, создадим шаблон для конструкции repeat..until , которая будет добавлена в текст, если пользователь введёт символ r . Выполним следующую последовательность действий:
- щёлкнем по кнопке Добавить в окне Шаблоны кода (см. рис. 1.22);
- в появившемся диалоговом окне Добавить шаблон кода (рис. 1.23) в поле Элемент введём символ r , а в поле Комментарий фразу repeat until , и нажмём кнопку Добавить;
- в окне Шаблоны кода (рис. 1.24—1.25) выделим в списке шаблонов строку r — repeat until ;
- введём в поле ввода, расположенном в нижней части окна, конструкцию языка repeat until ;
- нажмём кнопку Ok в окне Шаблоны кода.
Для изменения шаблона служит кнопка Правка. Шаблон, который нужно откорректировать, должен быть выделен. Дальнейшие действия аналогичны тем, которые выполняются при создании шаблона.
Рис. 1.24. Создание нового шаблона в Linux
Рис. 1.25. Создание нового шаблона в среде Windows
Для того чтобы удалить шаблон из списка, его нужно выделить, а затем нажать кнопку Удалить.
1.4.7 Панель компонентов
Панель компонентов расположена 16 Включить (выключить) Панель компонентов можно, установив (убрав) маркер рядом с командой Показать палитру компонентов меню Просмотр. под главным меню (рис. 1.14). Она состоит из большого числа групп, в которых располагаются соответствующие компоненты (рис. 1.26).
Рис. 1.26. Панель компонентов
Компонент — это некий функциональный элемент интерфейса, обладающий определенными свойствами. Размещая компоненты на форме, программист создаёт элементы внешнего вида своей будущей программы — окна, кнопки, переключатели, поля ввода и т. п.
Компоненты на панели объединяются в группы по функциональному признаку. После создания проекта по умолчанию открывается список группы Standard, содержащий основные элементы диалоговых окон. Просмотреть другие группы можно, раскрывая их щелчком по соответствующей вкладке.
Для того чтобы расположить новый компонент на форме нужно сделать два щелчка мышью:
- в панели компонентов — для выбора компонента;
- в рабочем пространстве формы — для указания положения левого верхнего угла компонента.
1.4.8 Инспектор объектов
Окно инспектора объектов располагается слева от окна редактирования. Как правило, оно содержит информацию о выделенном объекте. На рис. 1.27 представлен инспектор объектов с информацией о вновь созданной форме.
Окно инспектора объектов имеет три вкладки: Свойства, События, Избранное, которые используются для редактирования свойств объекта и описания событий, на которые будет реагировать данный объект. Совокупность свойств отображает внешнюю сторону объекта, совокупность событий — его поведение.
Вкладки инспектора объектов представляют собой таблицу. В левой колонке расположены названия свойств или событий, в правой — конкретные значения свойств или имена подпрограмм, обрабатывающих события.
Рис. 1.27. Окно инспектора объектов
Чтобы выбрать свойство или событие, необходимо щёлкнуть левой кнопкой мыши по соответствующей строке.
Свойства, отображённые в таблице, могут быть простыми или сложными. Простые свойства определены единственным значением. Например, свойство Caption (Заголовок) определяется строкой символов, свойства Height (Высота) и Width (Ширина) — числом, свойство Enabled (Допустимость) — значениями True (Истина) и False (Ложь). Сложные свойства определяются совокупностью значений. Например, свойство Font (Шрифт). Слева от имени этого свойства стоит знак «+». Это означает, что свойство сложное, и при щелчке по значку «+» откроется список его составляющих.
Активизировать значение любого свойства можно обычным щелчком мыши. При этом в конце строки может появиться либо кнопка с символом многоточия , либо кнопка со стрелкой, направленной вниз. Щелчок по многоточию откроет диалоговое окно для установки значений сложных свойств (например Font ). Обращение к стрелке приведёт к раскрытию списка возможных значений простого свойства (например Enabled ).
1.4.9 Первая программа в Lazarus
Процесс создания программы в Lazarus состоит из двух этапов:
- формирования внешнего вида программы, её интерфейса;
- написания программного кода на языке программирования Free Pascal, заставляющего работать элементы интерфейса.
Как мы уже выяснили, для создания интерфейса программы существует окно формы, а для написания программного кода — окно редактора. Эти окна тесно связаны между собой, и размещение компонентов на форме приводит к автоматическому изменению программного кода.
Рис. 1.28. Создание нового проекта в Linux
Рис. 1.29. Создание нового проекта в среде Windows
Начнём знакомство с визуальным программированием с создания простой программы про кнопку, которая хочет, чтобы по ней щёлкнули. После чего появляется сообщение о работе программы.
Начнём с создания нового проекта. Для этого выполним команду главного меню Проект — Создать проект. В появившемся диалоговом окне (рис. 1.28—1.29) выберем из списка слово Приложение и нажмём кнопку Создать. Результатом этих действий будет появление окна формы и окна редактора программного кода.
Сохраним созданный проект, воспользовавшись командой Проект — Сохранить проект как. Откроется окно сохранения программного кода Сохранить Unit1 (рис. 1.30—1.31).
Создадим в нём новую папку Primer_1 (можно воспользоваться кнопкой Создание новой папки (Создание каталога)), откроем её и щёлкнем по кнопке Сохранить. Тем самым мы сохраним файл Unit1.pas , содержащий текст программы. Сразу же откроется окно Сохранить проект (рис. 1.32—1.33), в котором также необходимо щёлкнуть по кнопке Сохранить. Теперь мы сохранили файл Project1 , содержащий общие сведения о проекте.
Рис. 1.30. Окно сохранения модуля в Windows
Рис. 1.31. Окно сохранения модуля в Linux
Рис. 1.32. Окно сохранения проекта в Windows
Рис. 1.33. Окно сохранения проекта в Linux
Рис. 1.34. Файлы проекта в Windows
Рис. 1.35. Файлы проекта в Linux
На самом деле все наши манипуляции привели к сохранению более чем двух файлов. Теперь в каталоге Primer_1 (рис. 1.34—1.35) хранится файл с текстом программы unit1.pas , файл unit1.lfm 17 Можно задать и имена файлов, отличные от стандартных Unit1. со сведениями о форме Form1, а также файлы project1.lpn и project1.lpi , содержащие настройки системы программирования и параметры конфигурации проекта.
Итак, проект сохранён. Все дальнейшие изменения будем сохранять командой Проект — Сохранить проект.
Теперь можно приступить к визуальному программированию. У нас есть один объект — форма Form1. Изменим некоторые его свойства с помощью инспектора объектов.
Перейдём в окно инспектора объектов и найдем в нём свойство Caption (Заголовок). Свойство формы Caption отвечает за текст, выводимый в заголовке формы. По умолчанию оно имеет значение Form1 . Изменим его на слово ПРИМЕР 1 (рис. 1.36). Это изменение сразу же отразится на форме — в поле заголовка появится надпись «ПРИМЕР 1» (рис. 1.38). Аналогично можно изменить размеры формы, присвоив новые значения свойствам Height (Высота) и Width (Ширина), ещё проще это сделать, изменив положение границы формы с помощью кнопки мыши, как это делается со всеми стандартными окнами.
Рис. 1.36. Изменение свойства формы Caption
Рис. 1.37. Изменение свойства формы Position
Рис. 1.38. Изменение заголовка формы
Рис. 1.39. Размещение кнопки на форме
Изменим ещё одно свойство формы — Position (положение формы на экране). Значения этого свойства не вводятся вручную, а выбираются из списка (рис. 1.37). Если выбрать свойство poScreenCenter , то форма всегда будет появляться в центре экрана.
Напомним, что мы пишем программу про кнопку. Пришло время поместить её на форму. Для этого обратимся к панели компонентов (рис. 1.26) и найдём там компонент Tbutton. Чтобы разместить компонент на форме, нужно сделать два щелчка мышью: первый — по компоненту, второй — по окну формы. В результате форма примет вид, представленный на рис. 1.39.
Теперь у нас два объекта: форма Form1 и кнопка Button1. Напомним, что изменения значений свойств в окне инспектора объектов относятся к выделенно му объекту. Поэтому выделим объект Button1 и изменим его заголовок Caption и размеры Height (высота формы), Width (Ширина формы). В заголовке напишем фразу «Щёлкни мышкой. «, установим ширину 135 пикселей, а высоту — 25 пикселей. Сохраним проект (Проект — Сохранить проект).
Рис. 1.40. Кнопка Запуск на панели инструментов Lazarus
Рис. 1.41. Результат работы программы
Для того чтобы посмотреть, как работает наша программа, её необходимо запустить на выполнение. Сделать это можно командой Запуск — Запуск, функциональной клавишей F9 или кнопкой Запуск на панели инструментов (рис. 1.40). Созданное окно с кнопкой должно выглядеть, как на рис. 1.41.
Теперь щёлкнем по кнопке и убедимся, что ничего не произойдет. В этом нет ничего удивительного, ведь мы ещё не написали ни одной строчки программного кода. Можно сказать, что мы разработали только внешнюю часть программы, но не позаботились о функциональной. Несмотря на это, в окне редактора появился текст программы:
unit Unit1; interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls; type < TForm1 >TForm1 = class (TForm) Button1 : TButton; private < private declarations >public < public declarations >end; var Form1 : TForm1; implementation initialization end;
О назначении всех перечисленных в листинге команд мы поговорим позже. Вернёмся к программе и подумаем, что же мы хотим от нашей кнопки. Скорее всего, это должна быть реакция на какое то событие, например на щелчок мыши. После запуска программы на экране появилось окно, на котором расположена кнопка с надписью «Щёлкни мышкой. «. Предположим, что если мы щёлкнем по ней, она «обрадуется» и сообщит: «УРА! ЗАРАБОТАЛО!».
Для воплощения этой идеи завершим работу программы, закрыв окно с кнопкой обычным способом (щелчком по крестику в правом верхнем углу) и перейдём в режим редактирования. Перейдём к инспектору объектов, выделим кнопку Button1 и обратимся к вкладке События инспектора объектов. Напомним, что здесь расположены описания событий. Выберем событие OnClick — обработка щелчка мыши и дважды щёлкнем в поле справа от названия (рис. 1.42).
Рис. 1.42. Выбор события OnClick
В результате описанных действий в окне редактора появится следующий текст:
procedure TForm1. Button1Click ( Sender : TObject ); begin end;
На данном этапе изложения материала данный текст — это фрагмент программного кода, именуемый подпрограммой. О назначении этой подпрограммы можно догадаться по её имени TForm1.Button1Click : на форме Form1 для объекта кнопка Button1 обрабатывается событие «щелчок мыши» Click . Все команды, написанные между словами begin и end , будут выполняться при наступлении указанного события (щелчка мыши).
Теперь установим курсор между словами begin и end созданной подпрограммы и напишем:
Button1. Caption:= ’УРА! ЗАРАБОТАЛО! ’;
Эта запись означает изменение свойства кнопки. Только теперь мы выполнили его не с помощью инспектора объектов, а записав оператор языка программирования. Прочитать его можно так: присвоить (:=) свойству Caption объекта Button1 значение ’УРА! ЗАРАБОТАЛО!’ . Поскольку присваиваемое значение — строка, оно заключено в одинарные кавычки.
Теперь текст подпрограммы в окне редактора имеет вид:
procedure TForm1. Button1Click ( Sender : TObject ); begin Button1. Caption := ’УРА! ЗАРАБОТАЛО! ’; end;
Сохраним созданную программу, запустим её на выполнение и убедимся, что кнопка реагирует на щелчок мыши (рис. 1.43). Закрыть проект можно командой Проект — Закрыть проект.