Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.23;
Скачать: CL | DM;

Вниз

Освобождение объектов   Найти похожие ветки 

 
Smok_er   (2003-01-13 01:39) [0]

Мастера! Создаю TMenuItem и добавляю в массив след. образом:

Array[1] := TMenuItem.Create(Self);
.... //изменение свойств


А как освободить память?
Array[1].Free выдает исключение "Invalid pointer operation"


 
Думкин   (2003-01-13 06:26) [1]

self когда грохается - грохает и Array[1].


 
Юрий Зотов ©   (2003-01-13 09:58) [2]

Как объявлен Array?


 
Думкин   (2003-01-13 10:00) [3]

Тут не только как объявлен - тут где его пытаются убить.


 
smok_er   (2003-01-13 10:01) [4]

Array1: Array [0..9] of TMenuItem

Думкин (13.01.03 06:26)
self когда грохается - грохает и Array[1].

Self грохнется не скоро :(


 
MBo ©   (2003-01-13 10:13) [5]

a:array[0..9] of tmenuitem;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=0 to 9 do begin
a[i]:=TMenuitem.create(self);
a[i].Caption:=IntTostr(i);
MainMenu1.Items.Add(a[i]);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
for i:=0 to 9 do
a[i].Free;
end;

ничего не виснет


 
Anatoly Podgoretsky ©   (2003-01-13 10:20) [6]

А ты сделай как у него a[1].Free; и у тебя тоже грохнется.


 
smok_er   (2003-01-13 10:24) [7]

Блин, забыл сказать.
У меня создается в одной форме, а грохается в другой.
Может из-за этого? Ведь в массиве же всего указатель на объект...


 
Думкин   (2003-01-13 10:27) [8]


> Anatoly Podgoretsky © (13.01.03 10:20)
> А ты сделай как у него a[1].Free; и у тебя тоже грохнется.

Только что попробовал - не грохается. Или это шутка?


 
Delirium^.Tremens ©   (2003-01-13 10:29) [9]

Думкин (13.01.03 10:27)

> Только что попробовал - не грохается. Или это шутка?

Надо долго пробовать, желательно в цикле :-)


 
Думкин   (2003-01-13 10:32) [10]

:-)
Я сначала прочитал "в цирке".


 
Anatoly Podgoretsky ©   (2003-01-13 10:38) [11]

Не знаю, может у него и правильно, может действительно хочет Array[1]
В общем надо привести достаточно кода, а не эти огрызки


 
smok_er   (2003-01-13 11:18) [12]

Извиняюсь за огрызки...
Просто думал, что весь код приводить нет смысла.
есть 2 формы: Form1 (MDI form) и Form2 (MDI child)
Декларация:
Form1:
Array1: array [0..9] of TMenuItem;

При определенных условиях (например по нажатию на какую-то кнопку) в Form2 произвожу след. действия:

Form1.array[1] := TMenuItem.Create(self)
Form1.array[1].caption := "1";
Form1.array[1].hint := "1 hint";
Form1.array[1].onclick := Form1.onmenuitemclick;
Form1.MainMenu1.items.Add(Form1.array[1]);

Таким образом получается, что объект я создаю в одной форме, а уничтожаю в другой по такому принципу:

for i:=0 to 9 do
if array1[i] <> nil then array1[i].Free;


 
Anatoly Podgoretsky ©   (2003-01-13 11:20) [13]

А что у тебя с элементами 0 и 2..9, когда и как они заполняются.


 
Думкин   (2003-01-13 11:39) [14]

Проверки на nil не достаточно. Если бы ты делал FreeAndNil - тогда да.

Проблема возникает точно в этом месте? И где у тебя Form2 задействована - в коде не видно. Где уничтожаешь?


 
smok_er   (2003-01-13 11:40) [15]

Дело в том, что исходники дома, а я сейчас на работе.
Я думаю, это не столь важно, но вот как оно выглядит, с учетом заполнения:

есть 2 формы: Form1 (MDI form) и Form2 (MDI child)
Декларация:

Form1 (Public):
Array1: array [0..9] of TMenuItem;
Counter: Integer;


При определенных условиях (например по нажатию на какую-то кнопку) в Form2 произвожу след. действия:


Form1.array[Form1.Counter] := TMenuItem.Create(self)
Form1.array[Form1.Counter].caption := "1";
Form1.array[Form1.Counter].hint := "1 hint";
Form1.array[Form1.Counter].onclick := Form1.onmenuitemclick;
Form1.MainMenu1.items.Add(Form1.array[Form1.Counter]);
Inc(Form1.Counter);

Таким образом получается, что объект я создаю в одной форме, а уничтожаю в другой по такому принципу:


for i:=0 to 9 do
if array1[i] <> nil then array1[i].Free;


Теперь все один в один. за исключением названий переменных.


 
smok_er   (2003-01-13 11:42) [16]

Думкин (13.01.03 11:39)
Проверки на nil не достаточно. Если бы ты делал FreeAndNil - тогда да.

Проблема возникает точно в этом месте? И где у тебя Form2 задействована - в коде не видно. Где уничтожаешь?

Ошибка вылазит не периодически...
Она появляется при первом уничтожении объекта, допустим сразу после создания. При этом Form2 остается не уничтоженной.


 
Думкин   (2003-01-13 11:59) [17]

Надо смотреть - я побаловался чуток - все как по маслу.
Ты дома посмотри - завтра опять народ загрузишь. %-)


 
smok_er   (2003-01-13 13:18) [18]

Думкин (13.01.03 11:59)
Надо смотреть - я побаловался чуток - все как по маслу.
Ты дома посмотри - завтра опять народ загрузишь. %-)

Да, плохо что сейчас я не дома, не могу проверить :(


 
Anatoly Podgoretsky ©   (2003-01-13 13:29) [19]

Ты не ответил на Anatoly Podgoretsky © (13.01.03 11:20)


 
smok_er   (2003-01-13 14:01) [20]

Anatoly Podgoretsky © (13.01.03 11:20)
А что у тебя с элементами 0 и 2..9, когда и как они заполняются.

Ответ здесь:
smok_er (13.01.03 11:40)
Извиняюсь, что не выделил, что это ответ на Ваш пост.


 
Anatoly Podgoretsky ©   (2003-01-13 14:15) [21]

В (13.01.03 11:40) ответа нет, идет инициализация отдельного элемента, притом неизвестного. До этого шла инициализация только первого элемента. А вот высбождение всех.


 
smok_er   (2003-01-13 15:34) [22]

В общем, не буду ходить вокруг да около.
Делаю так, как в IE - история посещений (выплывающий список при нажатии на Back или Forward).
Т.е. мы их добавляем при нажатии на кнопку, при этом ограничивая список только до 10 последних изменений.
Так вот, при нажатии на кнопку надо санчала уничтожить объекты, дабы не засорять и без того малое количество драгоценной памяти.
Вот при уничтожении первого же элемента происходит эта ошибка.


 
Anatoly Podgoretsky ©   (2003-01-13 15:41) [23]

Ну сколько можно просить, приведи полный код создания элементнов, а не огрызки, которыве вызывают сильное подозрение.


 
gsu ©   (2003-01-13 15:46) [24]

сильное подозрение на убийство пустоты


 
smok_er   (2003-01-13 16:13) [25]

Anatoly Podgoretsky © (13.01.03 15:41)
Ну сколько можно просить, приведи полный код создания элементнов, а не огрызки, которыве вызывают сильное подозрение.


Я дома посмотрю и точно скажу, хотя будет тоже самое с другими названиями переменных и объектов.
--------------------------------------------------------------------------------
gsu © (13.01.03 15:46)
сильное подозрение на убийство пустоты

Нет, я проверял!



 
smok_er   (2003-01-15 10:05) [26]

Мастера, в особенности Анатолий!
Бес меня попутал. Я перед уничтожением делал так:
Form1.MainMenu1.items.Clear.
Кстати, вопрос:
Если я создаю это в дочерней форме и при создании в качестве аргумента указываю Self, то удалится ли созданный menuitem на главной форме?


 
Anatoly Podgoretsky ©   (2003-01-15 10:21) [27]

Если Self указан, то компонент удалится автоматически при удалении владельца.


 
smok_er   (2003-01-15 10:51) [28]

ОК!
Спасибо!


 
Думкин   (2003-01-15 10:52) [29]

Удалится, если ты на него сошлешься.


 
Думкин   (2003-01-15 11:00) [30]

Предыдущий пост не видел, так о чем в этом свете речь шла?


 
smok_er   (2003-01-15 11:17) [31]

Думкин (15.01.03 11:00)
Предыдущий пост не видел, так о чем в этом свете речь шла?

В смысле? Посмотрите ветку с самого первого поста.


 
Думкин   (2003-01-15 11:24) [32]

Звиняюсь - Clear, не заметил.
А ветку смотрел - и вроде как учавствовал.


 
smok_er   (2003-01-15 11:59) [33]

Думкин (15.01.03 11:24)
Звиняюсь - Clear, не заметил.
А ветку смотрел - и вроде как учавствовал.

Так я и удивился. Ведь знаю же, что принимал в ней активное участие :)



Страницы: 1 вся ветка

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.022 c
8-72416
step[B.M.]
2002-10-07 11:53
2003.01.23
Надо писать звук со входа звуковой карты в mp3


3-72090
vvolkov
2002-12-28 16:12
2003.01.23
Можно ли к TQuery добавить калькулируемое поле?


14-72539
Дмитрий К.К.
2003-01-07 06:26
2003.01.23
Именинники 7 января


4-72609
DAnton
2002-12-05 15:10
2003.01.23
SetLocalTime?


7-72558
Senator
2002-11-13 11:34
2003.01.23
Service