Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2011, 18:09   #1
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию Программное создание компонентов на форме

Здравствуйте. Я пишу в Delphi 7. В ходе работы пользователя с моей программой, на форме должны создаваться новые объекты(это правда необходимо). Создавать их довольно просто, это я понял как делать, но мне необходимо затем программно обращаться к свойствам вновь созданных объектов. И в этом загвоздка. Я пробовал через FindComponent(позволяет обратиться к компоненту по его имени указанном в строке), но выдаются ошибки или delphi ведет себя так как будто компонента не существует. Может так оно и есть ведь в Object TreeView его не появляется. Как мне можно разрешить эту проблему? И можно ли как то добавлять созданные объекты в дерево объектов и сохранять их на форме при следующих запусках. Может как то надо работать с dfm файлом? Что бы пояснить о чем я говорю приведу пример кода.
Создаю компоненты так:

Код:
for i:=3 to 8 do begin
 ga:=Tbutton.Create(nil);
 ga.Top:=Random(200);
 ga.Width:= 45;
 ga.Height:= 45;
 ga.Left:=Random(200);
 ga.Name:='Button'+IntToStr(i);
 ga.Caption:='ß òóò!';
 ga.Parent:=Form1;
end;
А вот так пытаюсь обращаться к новому объекту

Код:
Label1.Caption:=((FindComponent('Button5')as TButton)).Caption;
так в label1 просто ничего не выводиться, а если допустим попытаться обратиться с свойству Name

Код:
Label1.Caption:=((FindComponent('Button5')as TButton)).Name;
то будет ошибка Access violation.

Может кто-нибудь знает в чем дело и как можно исправить положение? Заранее спасибо за помощь.

Последний раз редактировалось Stilet; 08.03.2011 в 20:01.
Leiph вне форума Ответить с цитированием
Старый 08.03.2011, 18:28   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
ga:=Tbutton.Create(nil);
ga.Parent:=Form1;
nil означает что создаваемая кнопка никому не принадлежит и соответственно этому ее нельзя найти с помощью findcomponent который ищет только среди своих подопечных.
При этом она может отображаться на форме, за это "отвечает" свойство parent
Код:
ga:=Tbutton.Create(self);
ga:=Tbutton.Create(form1);
Цитата:
и сохранять их на форме при следующих запусках.
рот закрытии формы сохранять информацию о кнопке в INI файл.
Код:
button:=self.findComponent('Buttom5');
sname:=button.name;
ini.writeInteger(sname,'top, button.top);
при старте и создании кнопок считывать и использовать эту информацию.
Код:
sname:='Button'+IntToStr(i);
ga.Top:= ini.ReadInteger(sname,'width', Random(200) );
ga.Width:= ini.ReadInteger(sname,'width', 45);
ga.Height:= ini.ReadInteger(sname,'height', 45);;
ga.Left:=ini.readInteger(Random(200);
ga.Name:=sname;
ga.Caption:='ß òóò!';
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.03.2011 в 18:47.
evg_m вне форума Ответить с цитированием
Старый 08.03.2011, 18:40   #3
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

Спасибо большое! Буду знать.
Leiph вне форума Ответить с цитированием
Старый 08.03.2011, 19:12   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Еще можно обращаться к компонентам на форме (или другом контроле) при помощи свойства Controls[I] и ControlsCount, при этом, необходимо проверить принадлежность компонента к конкретному классу при помощи is
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 08.03.2011, 21:06   #5
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
ga:=Tbutton.Create(nil);
Метод CREATE имеет параметром OWNER - "собственник", которое значительно отличается от свойства PARENT - "родитель".
Свойство PARENT выражает лишь визуальные отношения между компонентами. В то время как свойство OWNER управляет памятью, выделяемой под компонент. Когда компонент-собственник уничтожается (например, при помощи FREE), автоматически освобождаются не только его ресурсы, но и ресурсы его дочерних компонентов.
А теперь подумайте, что будет при закрытии программы с ресурсами созданного вами компонента, который имеет собственника NIL - то есть никого.
Он так и "зависнет" в памяти, поскольку он "сам по себе"...
Не поняли ?
А почему тогда строчите темы типа "Куда девается память после нескольких запусков моей программы ?"...
asmodey1 вне форума Ответить с цитированием
Старый 09.03.2011, 12:26   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
что будет при закрытии программы с ресурсами созданного вами компонента
они освободятся.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.03.2011, 12:29   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тем не менее асмодей прав, лучше не забывать освобождать ресурсы, а то могут накапливатся утечки во время работы программы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смещение компонентов на форме ProgDel Общие вопросы Delphi 3 24.10.2010 16:51
Программное создание БД phpusr БД в Delphi 10 01.02.2010 07:41
Поиск компонентов на форме Des Общие вопросы Delphi 10 29.04.2009 11:17
Программное копирование компонентов Frishka Компоненты Delphi 0 23.02.2009 00:28
Выбор компонентов на форме HPS Общие вопросы Delphi 6 28.01.2009 14:34