Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Вниздинамически созданные элементы Найти похожие ветки
← →
sten (2004-12-02 15:58) [0]Предположим, есть такой код :
var i:integer=0;
procedure TForm1.Button1Click(Sender: TObject);
var b:tbutton;
begin
i:=i+50;
b:=tbutton.Create(self);
b.Parent:=self;
b.Top:=i;
b.Show;
end;
Т.е. при нажатии на Button1, создается еще одна кнопка. Если нажать кнопку несколько раз, появиться
несколько кнопок. Не понятно, что происходит с памятью, в памяти находиться только одна переменная b,
или все созданные кнопки ? (т.е. если нажать button1 например 100 раз, сколько памяти будет занято ?)
← →
Алхимик © (2004-12-02 16:06) [1]b - указатель на созданую кнопку. Так как b- локальная переменная, то при выходе из процедуры указатель на созданную кнопку теряется.
> если нажать button1 например 100 раз, сколько памяти будет
> занято ?)
b.InstantSize*100 байт
← →
sten (2004-12-02 16:23) [2]т.е. каждый экземпляр кнопки занимает место, спасибо понятно.
Тогда обьясните пожалуйста, почему следующий код вызывает ошибку :
var l:tlistbox;
procedure tform1.lkey(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// some actions
l.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
l:=tlistbox.Create(self);
l.Parent:=self;
l.AddItem("hello",self);
l.OnKeyDown:=lkey;
l.Show;
end;
т.е. динамически создается listbox, с ним производяться некоторые действия, после чего я хочу его разрушить, а он вместо этого выдает ошибку. Разрушать надо, т.к. этот listbox создаваться будет произвольное число раз, и в соответствии с вашими словами, занимать память.
← →
Алхимик © (2004-12-02 16:54) [3]Для снятия лишних вопросов:
Цель статьи ответить на вопросы и показать :
Каким образом можно создавать и располагать на форме визуальные компоненты?
Каким образом обрабатывать группы компонент, меняя их свойства "одним махом"?
Как назначать обработчики для разных событий?
Зачем нужно свойство Tag?
Как можно двигать компоненты по форме?
http://www.delphikingdom.ru/helloworld/runtime_comp.htm
← →
sten (2004-12-02 17:28) [4]прочитал, однако так и не понял, почему у меня в коде вылетает ошибка при попытке разрушить обьект
Тупой наверное ;)
← →
begin...end © (2004-12-02 20:02) [5]> [2] sten (02.12.04 16:23)
> почему следующий код вызывает ошибку :
>
> procedure tform1.lkey(Sender: TObject; var Key: Word;
> Shift: TShiftState);
> begin
> // some actions
> l.Free;
> end;
Пошли Вы утром на работу, а вечером пришли обратно, и выяснилось, что дом, откуда Вы на эту самую работу выходили, разрушен. Вам бы такое понравилось?
Нельзя уничтожать объект в собственном обработчике события.
← →
raidan © (2004-12-02 21:00) [6]>begin...end © (02.12.04 20:02) [5]
Гораздо правильнее разрушить дом, когда он уже придет с работы и ляжет спать.
Я с вами полностью согласен! :)
← →
DrPass © (2004-12-02 22:12) [7]
> прочитал, однако так и не понял, почему у меня в коде вылетает
> ошибка при попытке разрушить обьект
>
> Тупой наверное ;)
Допустим, ты нажал кнопку AnyKey. В нормальной программе объект l получил сообщение WM_KEYDOWN в своей оконной функции, оттуда запустил обработчик OnKeyDown, обработчик отработал, вернул управление оконной функции l, оконная функция завершила работу. У тебя же обработчик прибивает объект, потом возвращается в оконную функцию - а ее (представьте себе!) больше нет. Она умерла вместе с объектом. Вот тебе и ошибка
← →
sten (2004-12-04 07:38) [8]Да не, ситуация здесь сложнее, чем кажется.
Во первых, элементы могут себя убивать:
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Button2.Destroy;
end;
Кнопка, очевидно, по дому не скучает ;)
Во вторых, listbox, даже динамически созданный, тоже в состоянии себя уничтожить:
var ch:tchecklistbox;
procedure tform1.chdown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
ch.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ch:=tchecklistbox.Create(self);
ch.Parent:=self;
ch.OnKeyDown:=chdown;
end;
Этот код работает как надо, если на форме только одна кнопка button1.
Но стоит добавить в design time на форму еще какой-нибудь компонент (любой ! например
еще одну кнопку), при выполнении ch.Free вылетает ошибка.
Вот и непонятно, как с этим бороться
← →
SergP © (2004-12-04 09:21) [9]
> [8] sten (04.12.04 07:38)
> Да не, ситуация здесь сложнее, чем кажется.
>
> Во первых, элементы могут себя убивать:
Лучше возьми книгу и почитай что происходит при уничтожении объекта.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c