обращаться к нему по этому имени, а не по имени переменной-создателя. Delphi в таком случае ругается на неизвестный идентификатор. http://www.delphi-manual.ru/dynamically-created-components.php - тут ознакомлялся. Как я понял, объекту в любом случае нужна переменная, через которую к нему можно обратиться? В таком случае можно ли её так же динамически создать и на нее переназначить создаваемый объект?
Хочу динамически создавать много одинаковых объектов, при этом иметь возможность обращаться к ним по необходимости.
Код где Delphi ругается на Name объекта {Del} вместо имени переменной:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure Boom(Sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Button1: TButton;
Panel1: TPanel;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1:=TButton.Create(Form1);
Button1.Name:='Del';
Button1.Parent:=Form1;
Button1.Top:=10;
Button1.Left:=10;
Button1.Width:=75;
Button1.Height:=30;
Button1.OnClick:=Boom;
end;
procedure TForm1.Boom(Sender: TObject);
begin
FreeAndNil(Panel1);
Del.Caption:='+';
end;
end.
Другие языки программирования и технологии
Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->
Обращение по такому имени делается не так, поскольку это - не имя переменной, а имя самого объекта. Чтобы обратиться к объекту по его имени, надо найти его среди всех объектов программы, например, в цикле перебирая все дочерние компоненты и сверяя свойство Name с нужным. Подробнее сейчас не могу сказать, потому что дома Delphi не ставил. Возможно, что у объекта Application найдётся метод, находящий объект по свойству Name.
PS
Сейчас выполнил поиск в Яндексе и нашёл вот что: http://www.sql.ru/forum/33133/kak-obratitsya-k-komponentu-po-ego-imeni
То есть там рекомендуют такой способ:
(FindComponent('Del') as TButton).Caption:='+';
Проверить сейчас не могу.
PPS
Сейчас обратил внимание, что действительно в интернете хватает высказываний типа "Свойство Name содержит имя (идентификатор) компонента, по которому в программном коде производится обращение к этому компоненту". Но это - полная глупость, потому что преобразование имени в собственно обращение к объекту производится на этапе компиляции, когда ещё неизвестно, какое значение при выполнении будет иметь свойство Name. Люди, которые пишут такие фразы, явно не понимают разницы между именем объектной переменной, которое существует только до компиляции, и свойством Name, которое реально получает значение уже при выполнении программы.
PS
Сейчас выполнил поиск в Яндексе и нашёл вот что: http://www.sql.ru/forum/33133/kak-obratitsya-k-komponentu-po-ego-imeni
То есть там рекомендуют такой способ:
(FindComponent('Del') as TButton).Caption:='+';
Проверить сейчас не могу.
PPS
Сейчас обратил внимание, что действительно в интернете хватает высказываний типа "Свойство Name содержит имя (идентификатор) компонента, по которому в программном коде производится обращение к этому компоненту". Но это - полная глупость, потому что преобразование имени в собственно обращение к объекту производится на этапе компиляции, когда ещё неизвестно, какое значение при выполнении будет иметь свойство Name. Люди, которые пишут такие фразы, явно не понимают разницы между именем объектной переменной, которое существует только до компиляции, и свойством Name, которое реально получает значение уже при выполнении программы.
Александр Храмцов
Строго говоря, обращение по свойству Name действительно присутствует. но только в том смысле, что программы-обработчики событий данного компонента создаются с именем, содержащим его свойство Name на момент разработки.
Данила, свойство Name никак Вам не поможет. Есть варианты:
1) Массив, как подсказали выше, ИМХО оптимальный путь для динамических элементов.
2) Создавайте Ваши кнопки на панели, присвойте для каждой кнопки Parent:=MyPanel, и работайте со списком MyPanel.Controls.
3) У всех кнопок Owner=Form1, можно просматривать список Form1.Components, и проверять: является ли элемент кнопкой.
1) Массив, как подсказали выше, ИМХО оптимальный путь для динамических элементов.
2) Создавайте Ваши кнопки на панели, присвойте для каждой кнопки Parent:=MyPanel, и работайте со списком MyPanel.Controls.
3) У всех кнопок Owner=Form1, можно просматривать список Form1.Components, и проверять: является ли элемент кнопкой.
создай массив
var arr:array [1..10] of TButton;
var arr:array [1..10] of TButton;
Похожие вопросы
- Delphi. Динамическое создание формы
- как организивать на С++ Динамическое создание массива, (количество элеметнтов - как задать динамически?)
- Новичку по java трудно уяснить значение терминов класс, объект, метод, конструктор и тд -->
- PHP foreach($this->arFields as $name=>$structure)
- delphi, динамические списки
- Как загрузить базу данных *.xls в компонент TListView (Delphi)?
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- delphi, динамические списки
- delphi, динамические списки
- <<<delphi,>>>