|
Вопрос # 4 926/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Подскажите пожалуйста, как правильно создавать и удалять компоненты, динамически.
TLabel,TButoon и т.д.
 |
Вопрос задал: 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 (статус: 3-ий класс), 19 января 2011, 19:46 [#2]:
Хорошо, я тебе больше не буду помогать.
> А то я весь И-нет перерыл и ничего похожего не нашёл.
Ложь, на первой странице гоогле есть подборка.
> а не ссылками на сторонние сайты
I LOLD
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|