Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
3-23859
Misa
2002-07-19 16:17
2002.08.08
ADO под XP


1-24123
Nox
2002-07-26 19:28
2002.08.08
<<<Вопрос по canvas>>>


14-24217
IlyaA
2002-07-12 12:52
2002.08.08
Программерский клуб.


3-23885
First_May
2002-07-16 10:11
2002.08.08
Прерывание запроса


1-24065
Andrew_
2002-07-26 10:52
2002.08.08
Неправильное выравнивание создаваемых компонентов на лету





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский