Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Динамическое создание объектов

Автор: Unconnected 17.02.2010 3:08

Привет всем.

Такой вопрос: как можно динамически создавать много объектов? Допустим, нажали на кнопку - создался объект, ещё раз нажали - ещё раз создался, новый, такой же.. Можно, конечно, создать массив нужного типа и конструировать по одному элементу, но мне кажется, это как-то не комильфо в плане экономии памяти. Как быть?

Добавлено через 14 мин.
Сейчас я так попробовал:

var images:array of TImage;
...
getmem(images[val],sizeof(TImage)); //val - номер создаваемого элемента


Ошибка Incompatible Types, на индекс указывает. Может, нельзя выделять память именно для элемента массива?

Автор: volvo 17.02.2010 3:31

Вообще-то у класса есть конструктор.

var
count: integer =0;

procedure TForm1.Button1Click(Sender: TObject);
var memo: TMemo;
begin
memo := TMemo.Create(Form1);
memo.Parent := Form1;

memo.Visible := true;
memo.Text := IntToStr(count);
memo.Top := 10 * count;
memo.Left := 10 * count;
inc(count);
end;
Идея понятна?

Автор: Unconnected 17.02.2010 3:38

Ну это да, конструктор есть. А ведь переменная в обработчике кнопки одна, а мне надо много объектов создавать. И как я потом смогу обратиться к нужному?

Автор: volvo 17.02.2010 3:46

Цитата
А ведь переменная в обработчике кнопки одна, а мне надо много объектов создавать. И как я потом смогу обратиться к нужному?
А по имени и сможешь. Скажем, так:

procedure TForm1.Button1Click(Sender: TObject);
var memo: TMemo;
begin
memo := TMemo.Create(Form1);
memo.Parent := Form1;
memo.Name := Format('MyMemo%.2d', [count]); // Назначаешь нужное имя.

memo.Visible := true;
memo.Text := IntToStr(count);

memo.Top := 20 * count;
memo.Left := 20 * count;
inc(count);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
(Form1.FindComponent('MyMemo02') as TMemo).Text := 'Oops'; // И обращаешься по нему к компоненту...
end;

Автор: Unconnected 17.02.2010 3:55

Оо здорово, спасибо smile.gif

Автор: Unconnected 17.02.2010 23:10

Я решил оформить поиск компонента по имени функцией, так как строка длинная, а использоваться будет часто, получилось это:

Function TForm1.find_comp(name:string):TImage;
begin
result:=(Form1.FindComponent(name) as TImage);
end;


Компилируется, но вылетает AV. Компонент с именем name я создавал, только без format, а просто присваивал img.name:='name';. Нужный компонент точно типа TImage.

Добавлено через 7 мин.
Да, кажется, это из-за формата.. А нельзя без этого? Я так-то знаю, что эта функция делает, но зачем это для свойства name, которое, как я понял, имеет строковый тип?

Автор: Unconnected 17.02.2010 23:45

Сделал с форматом. format('road_1%.2d',[1]); Ищу по road_101, всё равно АВ, в моей функции result содержит nil, типа не находит. У меня всё это дело находится внутри моего класса, может, это мешает?

Добавлено через 12 мин.
lol.gif в последних моих постах можете проследить, к чему может привести невнимательность)) Ищу компонент на форме, хотя в качестве парента указывал не форму...

Извиняюсь за кросспостинг.