Sign in Join
Wiki copytemporary

Frames/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Frames/ru

OldNewLine
1+**[[TFrame/ru|Фреймы]]** являются именованными контейнерами для компонентов и очень похожи на [[TForm/ru|Формы]]. Их уникальная способность заключается в том, что они могут быть встроены в формы или другие фреймы в дизайнере. В виде форм они хранятся в двух файлах: код хранится в файле .pas, а дизайн - в файле .lfm.
2+
3+## Как создать фрейм?
4+
5+Нажмите пункт меню File-\>New... и откройте диалоговое окно, выбрав пункт "Frame".
6+
7+<figure>
8+<img src="Frame_new.PNG" title="Frame_new.PNG" />
9+<figcaption>Frame_new.PNG</figcaption>
10+</figure>
11+
12+## Как поместить фрейм на форму или в другой фрейм?
13+
14+Вкладка [[Standard tab/ru|Standard]] в [[Component Palette/ru|Палитре компонентов]] имеет специальный компонентный элемент «[[TFrame/ru|TFrame]]». Когда вы перетаскиваете его на форму или фрейм, IDE предлагает вам выбрать один из фреймов проекта. Вы должны сначала сохранить проект и новый фрейм, потому что только предварительно сохраненные фреймы могут появиться в списке выбора. Фреймы в пакетах пока не реализованы. Но вы можете создавать фреймы в коде даже в пакетах. Вы не можете создавать циклические фреймы - IDE запретит это, т.е. вы не можете поместить FrameA в FrameA, и вы не можете поместить любой фрейм, который содержит FrameA, в FrameA.
15+
16+<figure>
17+<img src="Frame_add.PNG" title="Frame_add.PNG" />
18+<figcaption>Frame_add.PNG</figcaption>
19+</figure>
20+
21+## Для чего их можно использовать?
22+
23+Они необходимы, когда у вас есть группа компонентов, которые вы хотите повторно использовать в нескольких формах. Группа должна иметь одинаковый набор элементов управления и логику между ними в разных окнах (формах) вашего приложения. Вы можете сгруппировать повторяющиеся элементы управления и логику в один фрейм и использовать этот фрейм в разных местах. Поэтому вам не нужно повторять работу по разметке элементов управления и написанию их логики.
24+
25+Например, у вас есть два списка и кнопки для перемещения элементов между ними. Таким образом, вы можете создать фрейм с двумя списками и необходимыми кнопками, написать логику для перемещения элементов, а затем использовать свой фрейм во всех формах, где это необходимо. Более того, если вы обнаружите ошибку в коде фрейма, вы можете исправить ее один раз в коде фрейма вместо того, чтобы исправлять ее n раз среди всех форм.
26+
27+Фрейм в дизайнере:
28+
29+<figure>
30+<img src="Frame_example.PNG" title="Frame_example.PNG" />
31+<figcaption>Frame_example.PNG</figcaption>
32+</figure>
33+
34+Фрейм, размещенный на форме:
35+
36+<figure>
37+<img src="Frame_embedded.PNG‎" title="Frame_embedded.PNG‎" />
38+<figcaption>Frame_embedded.PNG‎</figcaption>
39+</figure>
40+
41+Тот же фрейм помещен в другую форму:
42+
43+<figure>
44+<img src="Frame_embedded2.PNG‎" title="Frame_embedded2.PNG‎" />
45+<figcaption>Frame_embedded2.PNG‎</figcaption>
46+</figure>
47+
48+## Инициализация частных переменных
49+
50+TFrame не имеет событий `OnCreate` или `OnDestroy`, в которых могут быть инициализированы и освобождены частные переменные. Для этого необходимо [[Override|переопределить]] [[Constructor/ru|constructor]] и [[Destructor|destructor]] по умолчанию.
51+
52+``` pascal
53+TFrame1 = class(TFrame)
54+ private
55+ MyObj: TObject;
56+ public
57+ constructor Create(TheOwner: TComponent); override;
58+ destructor Destroy; override;
59+ end;
60+
61+constructor TFrame1.Create(TheOwner: TComponent);
62+begin
63+ inherited Create(TheOwner);
64+ MyObj := TObject.Create;
65+end;
66+
67+destructor TFrame1.Destroy;
68+begin
69+ MyObj.Free
70+ inherited Destroy;
71+end;
72+```
73+
74+## Пример динамического создания
75+
76+Еще проще. Поскольку компонент TFrame из палитры компонентов не требуется. И вы можете создать приложение типа изменения страницы (например, приложение для смартфона) с сохранением ресурса.
77+
78+``` pascal
79+unit Unit1;
80+
81+{$mode objfpc}{$H+}
82+
83+interface
84+
85+uses
86+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
87+
88+type
89+
90+ { TForm1 }
91+
92+ TForm1 = class(TForm)
93+ Button1: TButton;
94+ GroupBox1: TGroupBox;
95+ procedure Button1Click(Sender: TObject);
96+ procedure FormCreate(Sender: TObject);
97+ private
98+ { private declarations }
99+ Frame: TFrame;
100+ public
101+ { public declarations }
102+ end;
103+
104+var
105+ Form1: TForm1;
106+
107+implementation
108+uses
109+ Unit2{TFrame1}, Unit3{TFrame2}, Unit4{TFrame3};
110+
111+{$R *.lfm}
112+
113+{ TForm1 }
114+
115+procedure TForm1.FormCreate(Sender: TObject);
116+begin
117+ Frame := TFrame1.Create(GroupBox1);
118+ Frame.Parent := GroupBox1;
119+end;
120+
121+procedure TForm1.Button1Click(Sender: TObject);
122+begin
123+ if not Assigned(Frame) then
124+ begin
125+ Frame := TFrame1.Create(GroupBox1);
126+ Frame.Parent := GroupBox1;
127+ end else if Frame is TFrame1 then begin
128+ Frame.Free;
129+ Frame := TFrame2.Create(GroupBox1);
130+ Frame.Parent := GroupBox1;
131+ end else if Frame is TFrame2 then begin
132+ Frame.Free;
133+ Frame := TFrame3.Create(GroupBox1);
134+ Frame.Parent := GroupBox1;
135+ end else begin
136+ FreeAndNil(Frame);
137+ end;
138+end;
139+
140+end.
141+```
142+
143+## См.также
144+
145+- [[TFrame/ru|TFrame]]
146+
147+---
148+*From the Free Pascal wiki, page "Frames/ru", as it stood on 2021-10-19 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history