Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.046 c
3-1100581648
DWW
2004-11-16 08:07
2004.12.19
инкрементирования


14-1101720792
_1008_
2004-11-29 12:33
2004.12.19
Вопрос жителям востока Украины


3-1101114512
Владимир С.
2004-11-22 12:08
2004.12.19
Изменение запроса - возможно ли?


1-1101636516
Piter
2004-11-28 13:08
2004.12.19
Работа с классами в DLL


1-1102423590
Zloy
2004-12-07 15:46
2004.12.19
Как проверить Edit, введен текст или цифры?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский