Sign in Join
Wiki copytemporary

Frames/ru: what changed

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

OldNewLine
11**[[TFrame/ru|Фреймы]]** являются именованными контейнерами для компонентов и очень похожи на [[TForm/ru|Формы]]. Их уникальная способность заключается в том, что они могут быть встроены в формы или другие фреймы в дизайнере. В виде форм они хранятся в двух файлах: код хранится в файле .pas, а дизайн - в файле .lfm.
22
33## Как создать фрейм?
44
55Нажмите пункт меню File-\>New... и откройте диалоговое окно, выбрав пункт "Frame".
66
7-<figure>
8-<img src="Frame_new.PNG" title="Frame_new.PNG" />
9-<figcaption>Frame_new.PNG</figcaption>
10-</figure>
7+![](/wiki-images/6/6d/Frame_new.PNG)
118
129## Как поместить фрейм на форму или в другой фрейм?
1310
1411Вкладка [[Standard tab/ru|Standard]] в [[Component Palette/ru|Палитре компонентов]] имеет специальный компонентный элемент «[[TFrame/ru|TFrame]]». Когда вы перетаскиваете его на форму или фрейм, IDE предлагает вам выбрать один из фреймов проекта. Вы должны сначала сохранить проект и новый фрейм, потому что только предварительно сохраненные фреймы могут появиться в списке выбора. Фреймы в пакетах пока не реализованы. Но вы можете создавать фреймы в коде даже в пакетах. Вы не можете создавать циклические фреймы - IDE запретит это, т.е. вы не можете поместить FrameA в FrameA, и вы не можете поместить любой фрейм, который содержит FrameA, в FrameA.
1512
16-<figure>
17-<img src="Frame_add.PNG" title="Frame_add.PNG" />
18-<figcaption>Frame_add.PNG</figcaption>
19-</figure>
13+![](/wiki-images/3/35/Frame_add.PNG)
2014
2115## Для чего их можно использовать?
2216
2317Они необходимы, когда у вас есть группа компонентов, которые вы хотите повторно использовать в нескольких формах. Группа должна иметь одинаковый набор элементов управления и логику между ними в разных окнах (формах) вашего приложения. Вы можете сгруппировать повторяющиеся элементы управления и логику в один фрейм и использовать этот фрейм в разных местах. Поэтому вам не нужно повторять работу по разметке элементов управления и написанию их логики.
2418
2519Например, у вас есть два списка и кнопки для перемещения элементов между ними. Таким образом, вы можете создать фрейм с двумя списками и необходимыми кнопками, написать логику для перемещения элементов, а затем использовать свой фрейм во всех формах, где это необходимо. Более того, если вы обнаружите ошибку в коде фрейма, вы можете исправить ее один раз в коде фрейма вместо того, чтобы исправлять ее n раз среди всех форм.
2620
2721Фрейм в дизайнере:
2822
29-<figure>
30-<img src="Frame_example.PNG" title="Frame_example.PNG" />
31-<figcaption>Frame_example.PNG</figcaption>
32-</figure>
23+![](/wiki-images/1/13/Frame_example.PNG)
3324
3425Фрейм, размещенный на форме:
3526
36-<figure>
37-<img src="Frame_embedded.PNG‎" title="Frame_embedded.PNG‎" />
38-<figcaption>Frame_embedded.PNG‎</figcaption>
39-</figure>
27+![](/wiki-images/d/d4/Frame_embedded.PNG%E2%80%8E)
4028
4129Тот же фрейм помещен в другую форму:
4230
43-<figure>
44-<img src="Frame_embedded2.PNG‎" title="Frame_embedded2.PNG‎" />
45-<figcaption>Frame_embedded2.PNG‎</figcaption>
46-</figure>
31+![](/wiki-images/3/36/Frame_embedded2.PNG%E2%80%8E)
4732
4833## Инициализация частных переменных
4934
5035TFrame не имеет событий `OnCreate` или `OnDestroy`, в которых могут быть инициализированы и освобождены частные переменные. Для этого необходимо [[Override|переопределить]] [[Constructor/ru|constructor]] и [[Destructor|destructor]] по умолчанию.
5136
5237``` pascal
5338TFrame1 = class(TFrame)
5439 private
5540 MyObj: TObject;
5641 public
5742 constructor Create(TheOwner: TComponent); override;
5843 destructor Destroy; override;
5944 end;
6045
6146constructor TFrame1.Create(TheOwner: TComponent);
6247begin
6348 inherited Create(TheOwner);
6449 MyObj := TObject.Create;
6550end;
6651
6752destructor TFrame1.Destroy;
6853begin
6954 MyObj.Free
7055 inherited Destroy;
7156end;
7257```
7358
7459## Пример динамического создания
7560
7661Еще проще. Поскольку компонент TFrame из палитры компонентов не требуется. И вы можете создать приложение типа изменения страницы (например, приложение для смартфона) с сохранением ресурса.
7762
7863``` pascal
7964unit Unit1;
8065
8166{$mode objfpc}{$H+}
8267
8368interface
8469
8570uses
8671 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
8772
8873type
8974
9075 { TForm1 }
9176
9277 TForm1 = class(TForm)
9378 Button1: TButton;
9479 GroupBox1: TGroupBox;
9580 procedure Button1Click(Sender: TObject);
9681 procedure FormCreate(Sender: TObject);
9782 private
9883 { private declarations }
9984 Frame: TFrame;
10085 public
10186 { public declarations }
10287 end;
10388
10489var
10590 Form1: TForm1;
10691
10792implementation
10893uses
10994 Unit2{TFrame1}, Unit3{TFrame2}, Unit4{TFrame3};
11095
11196{$R *.lfm}
11297
11398{ TForm1 }
11499
115100procedure TForm1.FormCreate(Sender: TObject);
116101begin
117102 Frame := TFrame1.Create(GroupBox1);
118103 Frame.Parent := GroupBox1;
119104end;
120105
121106procedure TForm1.Button1Click(Sender: TObject);
122107begin
123108 if not Assigned(Frame) then
124109 begin
125110 Frame := TFrame1.Create(GroupBox1);
126111 Frame.Parent := GroupBox1;
127112 end else if Frame is TFrame1 then begin
128113 Frame.Free;
129114 Frame := TFrame2.Create(GroupBox1);
130115 Frame.Parent := GroupBox1;
131116 end else if Frame is TFrame2 then begin
132117 Frame.Free;
133118 Frame := TFrame3.Create(GroupBox1);
134119 Frame.Parent := GroupBox1;
135120 end else begin
136121 FreeAndNil(Frame);
137122 end;
138123end;
139124
140125end.
141126```
142127
143128## См.также
144129
145130- [[TFrame/ru|TFrame]]
146131
147132---
148133*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