![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid pointer operation [D6, WinXP]
anod © (2002-07-28 18:27:00)При закрытии вываливается ошибка.
Эта фигня появилась после сл строчек кода
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;
Люди, где ошибка???
reonid (2002-07-28 22:12:00) [1]Чёрт возьми :)
Юрий Зотов (2002-07-28 22:05:00) [2]Точно!
И в FormDestroy добавить уничтожение самого массива:
mitems := nil;
Для строгости.
:о)
anod (2002-07-28 21:57:00) [3]Большое спасибо, я нашел ошибку:
SetLength(mitems,plist.path.count-1);
->
SetLength(mitems,plist.path.count);
anod (2002-07-28 21:46:00) [4]Да я давно уже его убрал :(
reonid (2002-07-28 21:14:00) [5]Совсем убери цикл
for i:= 0 to length(mitems)-1 do
mitems[i].Destroy;
При закрытии plmenu сам уничтожит все внедрённые в него пункты меню.
Даже если ты сделаешь Free - сами ссылки mitems[i] - сами ссылки, хранящиеся в массиве, никто не обнулит при автоматическом уничтожении пунктов меню.
anod (2002-07-28 21:01:00) [6]Все убрал и заменил.
При коментировании этих строк ошибка исчезает
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]);
Я не могу понять в чем причина??
Юрий Зотов (2002-07-28 20:50:00) [7]Похоже, с plist.path все в порядке (особенно порадовало, что абстракный класс все же не создается - все сделано грамотно).
Видимо, ошибка в чем-то другом. И все же цикл из FormDestroy надо убрать, а Destroy заменить на Free. Это вне сомнений.
anod (2002-07-28 20:36:00) [8]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 19:57:00) [9]ОК, уточняем дальше.
1. Где конкретно объявлена переменная plist?
2. Где и КАК создается plist.path?
А чтобы сэкономить наше время, поставьте в FormDestroy точку останова пройдите по F8 и уточните, на какой конкретно строке возникает ошибка и чему равно Plist.Path.Count ПЕРЕД ее возникновением.
Еще - замените Plist.Path.Destroy на Plist.Path.Free
anod (2002-07-28 19:37:00) [10]type playlist = record
...
path: TStrings;
end;
plist : playlist;
Юрий Зотов (2002-07-28 19:35:00) [11]Тогда что такое plist и plist.path?
anod (2002-07-28 19:29:00) [12]В том то и дело - убирал.
Юрий Зотов (2002-07-28 19:21:00) [13]Строка
mitems[i]:=TMenuItem.Create(Form1);
говорит о том, что каждому mitems[i] назначен владелец - форма Form1. Следовательно, все они будут автоматически уничтожены вместе с самим владельцем. Вручную этого делать не нужно, иначе происходит попытка уничтожить уже уничтоженный объект - отсюда и ошибка.
Уберите цикл из FormDestroy и все должно стать нормально.