Sams
20.05.2010, 15:26
Раньше никогда не было потребности, но вот сейчас понадобился такой прекрасный "режим" как Run-Time, тобишь создание компонентов/окон в уже запущенной программе.
1. Начнём с компонентов:
Создаю я например компонент TEdit вот таким способом
var
x: TEdit;
procedure TForm1.Button1Click(Sender: TObject);
begin
x := TEdit.Create(self);
x.Parent := Form1;
x.Left := 10;
x.Top := 10;
end;
Если много раз клацать на кнопку, то создаётся много текстовых полей (правда в данной примере они налаживаются друг на друга, то как координаты всегда будут (10; 10), но я проверял, заменив координаты переменными, которые при каждом нажатии увеличивал). И собственно от сюда вытекает вопрос:
Какие имена присваиваются второму, третьему и т.д. полям, ведь я указал имя "x" ( var x: TEdit; ) то есть это имя первого поля, а остальные-то не могут быть названы так же :confused:
Я думал, может x[номер поля], но ничего подобного.
---------------------------------------------------------------------------------------------------------
С этим вопросом разобрался, вот ответ:
А конкретнее х будет указывать уже на новый компонент, а к старому ты никак не сможешь обратится, только по имени. Потеряется ссылка на него.(с) GhostOnline
Как положено - разобрался сам, помоги другим. Потому чуток пораскинув мозгами и почитав дополнительную литературу, пришел к выводу, что работать с компонентами не обязательно через массив.
Можно сделать по такой схеме:
1. Создаём компонент.
2. Заносим в объект TList указатель на этот компонент.
3. Для обращения к любому из компонентов вытягиваем указатель из TList.
Таким образом мы не ограничиваемся размером массива.
Покажу на примере (кинем на форму не одну кнопку, а две. Одна будет создавать поля, а другая - поменяет текст в определенном поле):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a, y: integer;
ListComp: TList;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ListComp := TList.Create;
a := 10;
y := 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x: TEdit;
begin
x := TEdit.Create(self);
x.Parent := Form1;
x.Top := y;
x.Left := a;
ListComp.Add(x);
a := a + 20;
y := y + 20;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TEdit(CompList.Items[2]).Text := 'lol'; //Эта строка меняет текст в третьем текстовом поле. Номер текстового поля указываем в CompList.Items[номер полня] (счет ведется с нуля).
end;
end.
Создаём первой кнопкой несколько полей (больше, чем 3) и клацаем вторую кнопку - меняется содержимое третьего поля.
2. Проблема с дочерними MDI окнами:
1. Создаю основную форму ( Form.Style := fsMDIForm ).
2. Создаю MDI форму ( From.Style := fsMDIChild ).
3. В Project - Options перекидываю MDIchild форму в раздел Available forms.
4. По идее на основной форме нужно создать кнопку с кодом:
<имя дочерней формы> := TChildForm.Create(Owner);
Но надо как-то связать основную форму с MIDChild. Пробовал прописать в разделе uses модуль с MIDChild, но нихрена не дало :mad:
---------------------------------------------------------------------------------------------------------
С этим вопросом тоже разобрался, вот ответ:
Такс, с MDI окнами тоже разобрался.
Создаём две формы - Form1, Form2.
Form1.FormStyle := fsMDIForm;
Form2.FormStyle := fsMDIChild;
В Unit1, в разделе uses дописываем Unit2:
uses
......, Unit2;
На Form1 кидаем две кнопки (первая создаёт окна, вторая меняет заголовок определенного ока):
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Owner);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.MDIChildren[2].Caption := 'Woohoo'; // Номер MDI окна указываем тут MDIChildren[номер окна]
end;
1. Начнём с компонентов:
Создаю я например компонент TEdit вот таким способом
var
x: TEdit;
procedure TForm1.Button1Click(Sender: TObject);
begin
x := TEdit.Create(self);
x.Parent := Form1;
x.Left := 10;
x.Top := 10;
end;
Если много раз клацать на кнопку, то создаётся много текстовых полей (правда в данной примере они налаживаются друг на друга, то как координаты всегда будут (10; 10), но я проверял, заменив координаты переменными, которые при каждом нажатии увеличивал). И собственно от сюда вытекает вопрос:
Какие имена присваиваются второму, третьему и т.д. полям, ведь я указал имя "x" ( var x: TEdit; ) то есть это имя первого поля, а остальные-то не могут быть названы так же :confused:
Я думал, может x[номер поля], но ничего подобного.
---------------------------------------------------------------------------------------------------------
С этим вопросом разобрался, вот ответ:
А конкретнее х будет указывать уже на новый компонент, а к старому ты никак не сможешь обратится, только по имени. Потеряется ссылка на него.(с) GhostOnline
Как положено - разобрался сам, помоги другим. Потому чуток пораскинув мозгами и почитав дополнительную литературу, пришел к выводу, что работать с компонентами не обязательно через массив.
Можно сделать по такой схеме:
1. Создаём компонент.
2. Заносим в объект TList указатель на этот компонент.
3. Для обращения к любому из компонентов вытягиваем указатель из TList.
Таким образом мы не ограничиваемся размером массива.
Покажу на примере (кинем на форму не одну кнопку, а две. Одна будет создавать поля, а другая - поменяет текст в определенном поле):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a, y: integer;
ListComp: TList;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ListComp := TList.Create;
a := 10;
y := 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x: TEdit;
begin
x := TEdit.Create(self);
x.Parent := Form1;
x.Top := y;
x.Left := a;
ListComp.Add(x);
a := a + 20;
y := y + 20;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TEdit(CompList.Items[2]).Text := 'lol'; //Эта строка меняет текст в третьем текстовом поле. Номер текстового поля указываем в CompList.Items[номер полня] (счет ведется с нуля).
end;
end.
Создаём первой кнопкой несколько полей (больше, чем 3) и клацаем вторую кнопку - меняется содержимое третьего поля.
2. Проблема с дочерними MDI окнами:
1. Создаю основную форму ( Form.Style := fsMDIForm ).
2. Создаю MDI форму ( From.Style := fsMDIChild ).
3. В Project - Options перекидываю MDIchild форму в раздел Available forms.
4. По идее на основной форме нужно создать кнопку с кодом:
<имя дочерней формы> := TChildForm.Create(Owner);
Но надо как-то связать основную форму с MIDChild. Пробовал прописать в разделе uses модуль с MIDChild, но нихрена не дало :mad:
---------------------------------------------------------------------------------------------------------
С этим вопросом тоже разобрался, вот ответ:
Такс, с MDI окнами тоже разобрался.
Создаём две формы - Form1, Form2.
Form1.FormStyle := fsMDIForm;
Form2.FormStyle := fsMDIChild;
В Unit1, в разделе uses дописываем Unit2:
uses
......, Unit2;
На Form1 кидаем две кнопки (первая создаёт окна, вторая меняет заголовок определенного ока):
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Owner);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.MDIChildren[2].Caption := 'Woohoo'; // Номер MDI окна указываем тут MDIChildren[номер окна]
end;