Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 926

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Подскажите пожалуйста, как правильно создавать и удалять компоненты, динамически.
TLabel,TButoon и т.д.

Ham_ele_on Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ham_ele_on (статус: Посетитель)
Вопрос отправлен: 17 января 2011, 10:01
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Ham_ele_on!
Для большинства компонентов это выглядит так

var
comp:TSomeComp; //объявили
begin
  comp := TSomeComp.create(Form1);// либо другой компонент-собственник. можно nil.
  comp.parent := Form1; //а это компонент, который приютит наш компонент. В большинстве случаев именно на нем и будет
располагаться созданный компонент и координаты будут отсчитываться именно от него.
  comp.top := 10;
  comp.left := 20;
  comp.show; // показать компонент. обычно этого не нужно.
  // в большинстве случаев этого уже достаточно
  // возможно нужно ещё обработчики прицепить.
  comp.OnClick := somoClick; // внимание - тут пишется имя МЕТОДА и без СКОБОК и параметров.
  // а теперь удаление компонента
  comp.free;
end;
А теперь маленький сборник вопросов-ответов:)
Вопрос: что будет, если указать nil в строке comp := TSomeComp.create(nil);
Ответ: у компонента не будет "хозяина". Когда какой то компонент удаляется, он удаляет все компоненты, для которых он "хозяин". Этот процесс рекурсивный. Поэтому, когда мы удаляем форму, то она удаляет все компоненты, которые принадлежат ей. Следует заметить, что "принадлежат" не равно "лежат на ней".

Вопрос: а что же тогда Parent?
Ответ: а это ссылка на компонент, где будет лежать компонент. Например, можно поставить две панели на форме. и создав кнопку, у которой parent = panel1, мы увидим кнопку на первой панели. В процессе работы можно сделать
Button.Parent := Panel2 и кнопка перепрыгнет на другую панель.

Вопрос: обязательно ли удалять за собой созданный компонент.
Ответ: да, если у него "Хозяин" выставлен в nil или созданный компонент больше не нужен.

Вопрос: а сколько компонентов я могу насоздавать?
Ответ: в штатных условиях на одной форме пару тысяч. Дело в том, что в винде есть понятие handle - некого такого указателя. Для формы их обычно нужно около 5 (один для окна формы, один для "карандаша" и один для "кисти". ещё один для шрифтов и где то ещё один). для кнопок нужно как минимум один. А может и два.
В Винде кол-во хендлов ограничено в 10000 на одно приложение. И как хочешь, так и трать.
На практике больше 2000 форм создать не удалось.
Но нужно помнить, что есть неоконные комопоненты (например TLabel) - на них подобные ограничения не распространяются. Они не тратят ни одного дополнительного хендла. С точки зрения винды - это просто нарисованый текст. не более.

Вопрос: с какими компонентами бывают трудности?
Ответ: обычно с различными ActiveX. К примеру TWebBrowser. Там обычно нужно совершить пару дополнительных шагов.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 17 января 2011, 11:06
Оценка за ответ: 5

Комментарий к оценке: Отличный ответ, развёрнутый и понятный.
А то я весь И-нет перерыл и ничего похожего не нашёл.

а чем отличается строка
comp := TSomeComp.create(Form1);, от
comp := TSomeComp.create(Self); ?

Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 19 января 2011, 19:46; участников в обсуждении: 1.
bugmenot

bugmenot (статус: 3-ий класс), 19 января 2011, 02:56 [#1]:

ВНЕЗАПНО, F1:
http://docwiki.embarcadero.com/RADStudio/en/Testing_Uninstalled_Components
виконання програми розпочинається з того самого мiсця, де призупинилося.

bugmenot

bugmenot (статус: 3-ий класс), 19 января 2011, 19:46 [#2]:

Хорошо, я тебе больше не буду помогать.

> А то я весь И-нет перерыл и ничего похожего не нашёл.
Ложь, на первой странице гоогле есть подборка.

> а не ссылками на сторонние сайты
I LOLD
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.