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

Вниз

Invalid pointer operation   Найти похожие ветки 

 
anod ©   (2002-07-28 18:27) [0]

При закрытии вываливается ошибка.

Эта фигня появилась после сл строчек кода
var mitems: array of TMenuItem;

в Project1.dpr
...
SetLength(mitems,plist.path.count-1);
for i:= 0 to plist.path.count-1 do begin
...
mitems[i]:=TMenuItem.Create(Form1);
mitems[i].OnClick:=Form1.plMenuClick;
mitems[i].Caption:=IntToStr(i+1)+". "+ExtractFileName(s);
Form1.plmenu.Items.Insert(i,mitems[i]);
end;
...
Application.Run;

В onDestroy:

procedure TForm1.FormDestroy(Sender: TObject);
var i:integer;
begin
plist.path.Destroy;
for i:= 0 to length(mitems)-1 do
mitems[i].Destroy;
end;


Люди, где ошибка???


 
Юрий Зотов ©   (2002-07-28 19:21) [1]

Строка
mitems[i]:=TMenuItem.Create(Form1);
говорит о том, что каждому mitems[i] назначен владелец - форма Form1. Следовательно, все они будут автоматически уничтожены вместе с самим владельцем. Вручную этого делать не нужно, иначе происходит попытка уничтожить уже уничтоженный объект - отсюда и ошибка.

Уберите цикл из FormDestroy и все должно стать нормально.


 
anod ©   (2002-07-28 19:29) [2]

В том то и дело - убирал.


 
Юрий Зотов ©   (2002-07-28 19:35) [3]

Тогда что такое plist и plist.path?


 
anod ©   (2002-07-28 19:37) [4]

type playlist = record
...
path: TStrings;
end;

plist : playlist;


 
Юрий Зотов ©   (2002-07-28 19:57) [5]

ОК, уточняем дальше.

1. Где конкретно объявлена переменная plist?
2. Где и КАК создается plist.path?

А чтобы сэкономить наше время, поставьте в FormDestroy точку останова пройдите по F8 и уточните, на какой конкретно строке возникает ошибка и чему равно Plist.Path.Count ПЕРЕД ее возникновением.

Еще - замените Plist.Path.Destroy на Plist.Path.Free


 
anod ©   (2002-07-28 20:36) [6]

1)переменная plist объявленна в unit1.pas в var
2)в dpr:
plist.path := TStringList.Create;
plist.path.loadFromFile(ExtractFilePath(ParamStr(0))+defplst);

Хмм, ошибка вылетает ещё до FormDestroy оказывается

Ставлю точку на close; И вываливается ошибка, до Destroy не доходит.
В onClose ничего нет.


 
Юрий Зотов ©   (2002-07-28 20:50) [7]

Похоже, с plist.path все в порядке (особенно порадовало, что абстракный класс все же не создается - все сделано грамотно).

Видимо, ошибка в чем-то другом. И все же цикл из FormDestroy надо убрать, а Destroy заменить на Free. Это вне сомнений.


 
anod ©   (2002-07-28 21:01) [8]

Все убрал и заменил.

При коментировании этих строк ошибка исчезает
mitems[i]:=TMenuItem.Create(form1);
mitems[i].OnClick:=Form1.plMenuClick;
mitems[i].Caption:=IntToStr(i+1)+". "+ExtractFileName(s);
Form1.plmenu.Items.Insert(i,mitems[i]);


Я не могу понять в чем причина??


 
reonid ©   (2002-07-28 21:14) [9]

Совсем убери цикл
for i:= 0 to length(mitems)-1 do
mitems[i].Destroy;

При закрытии plmenu сам уничтожит все внедрённые в него пункты меню.

Даже если ты сделаешь Free - сами ссылки mitems[i] - сами ссылки, хранящиеся в массиве, никто не обнулит при автоматическом уничтожении пунктов меню.


 
anod ©   (2002-07-28 21:46) [10]

Да я давно уже его убрал :(


 
anod ©   (2002-07-28 21:57) [11]

Большое спасибо, я нашел ошибку:

SetLength(mitems,plist.path.count-1);
->
SetLength(mitems,plist.path.count);


 
Юрий Зотов ©   (2002-07-28 22:05) [12]

Точно!
И в FormDestroy добавить уничтожение самого массива:
mitems := nil;
Для строгости.
:о)


 
reonid ©   (2002-07-28 22:12) [13]

Чёрт возьми :)



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
3-23857
kserg@ukr.net
2002-07-19 13:46
2002.08.08
Хочу узнать мнение в подходах решения след.задачи


6-24153
Akni
2002-05-26 14:39
2002.08.08
Передача данных из одной программы в другую


3-23921
Alex9801
2002-07-18 11:14
2002.08.08
Пустая строка в DBGrid


3-23914
FLIZ
2002-07-18 10:54
2002.08.08
Как выполнить V.Basic-ский код, хранящейся в базе Access ?


6-24160
начинающий програмер
2002-05-24 22:29
2002.08.08
Баннеры