![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему лезет ошибка Access violation? [D7, XP]
Lebedev © (2007-10-21 17:37:00)Подскажите, пожалуйста, почему лезет ошибка при удалении динамически созданной метки.
Код следующий:
При создании формы (модальная) создаётся метка и кнопка:
procedure TForm3.FormCreate(Sender: TObject);
begin
…
newst:=TStaticText.Create(Panel1);
newst.Parent:=Panel1;
…
newb:=TButton.Create(Panel1);
newb.OnClick:=OnClickButton;
newb.Parent:=Panel1;
end;
Если в обработки нажатия созданной кнопки удалять это строку, то как раз ошибка и лезет
Procedure TForm3.OnClickButton( Sender : TObject );
Begin
newst.free;
…
Причём при отладке в среде Delphi компилятор после ошибки указывает на строку кода в главной форме:
procedure TForm1.FormShow(Sender: TObject);
begin
Form3.ShowModal;
if Form3.ModalResult = mrIgnore then Close; //вот на эту строку
...
Если же метку удалять из другой процедуры, то никакая ошибка не происходит.
PS Заодно, подскажите, можно ли бороться с «зависанием» среды Delphi в случае ошибок? То есть происходит ошибка, всё виснет. А когда пытешься выйди из среды появляется диалоговое окно «Debug session in progress. Terminate?» Просто надоело уже перезапускать среду.
vpbar (2007-10-22 13:56:00) [1]вот здесь
procedure TComponent.DestroyComponents;
var
Instance: TComponent;
begin
while FComponents <> nil do
begin
Instance := FComponents.Last;
if (csFreeNotification in Instance.FComponentState)
or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then
RemoveComponent(Instance)
else
Remove(Instance);
Instance.Destroy;
end;
end;
Но это к теме не относится. Ибо если компонент создается в рантайм то он удаляется корректно. При дестрое убирает себя из списка копонент владельца.
Ошибку вашу воспроивести не удалось. Так что глюк гдето. Делайте наследника с переопределенным дестроем - ведите логи и смотрите то где удаляет его
Johnny Cash (2007-10-22 13:14:00) [2]Мужик, тебе же сказали русским языком, обнуляй все ссылки на удаляемые объекты и не обращайся к ним никогда без проверки на nil
Ins (2007-10-22 13:09:00) [3]
> Сколько было затрачено человекочасов и сколько было кнопконажатий
> в
> http://delphimaster.ru/cgi-bin/forum.pl?id=1192180654&n=18
> а воз и ныне там :(
И не говорите...
KSergey (2007-10-22 13:00:00) [4]А не достаточно просто Visible := False этим компонентам? Начем непременно уничтожать?
Lebedev (2007-10-22 12:54:00) [5]
> Вопроса два:
> 1) нафиг это надо?? т.е. что за задача-то стоит?
> 2) а если кнопку не в run-time создать - неужели такой же
> ошибки ен вылезает? Что-то я сильно в том сомневаюсь.
Это всё из-за динамически меняющегося интерфейса на одной форме. Просто вначале создаётся statictext и кнопка, при нажатии на эту кнопку должны исчезать как и этот текст, так и эта кнопка. Удалять саму кнопку в её же событии - это конечно нереально. А вот почему текст удалить нельзя?
Либо у меня уже проект глючить стал. Теперь та же ошибка выводиться, если я их удаляю даже из другой процедуры. Ничего понять не могу! В чём дело?
KSergey (2007-10-22 10:41:00) [6]> KSergey © (22.10.07 10:40) [8]
> К стати, справка по finally - мощная штука, однако :)
Равно как и по Exit
KSergey (2007-10-22 10:40:00) [7]> temp_and_test (22.10.07 10:27) [7]
Расскажите, плиз, что вы этим кодом хотели сказать? Особенно вот этим:
except
Exit;
end;
К стати, справка по finally - мощная штука, однако :)
temp_and_test (2007-10-22 10:27:00) [8]Здаврвствуйте... я тут столкнулся только что с такой же проблеммой (вернее задача похожа). Пишет ошибку Access violation at address 00403858 in module project1.exe. Read of address fffffffc. Это если запускать скопилированный exe файл. А если запускать со среды то пишет Priveleged Instruction И НИКАКОГО НАМЁКА НА ОШИБКУ (в плане указания).
Я запускаю Search-> Find Error и попадаю в код что то Free. Вот как узнать какой объект уничтожается (или неуничтожается)??? Я и Dr Watson запускал - ничего не находит.
У меня есть предположение что это кусочек кода глючит, но это только предположение. А как узнать точно? С ассемблером ато туго (впрочем как и с Дельфи)
procedure Link;
begin
try
try
NMEchoAdr_Link := TNMEcho.Create(Form1);
NMEchoAdr_Link.TimeOut := 150;
NMEchoAdr_Link.Port := 139;
NMEchoAdr_Link.Host := IP;
NMEchoAdr_Link.OnConnect :=Form1.test_IP;
NMEchoAdr_Link.Connect;
except
Exit;
end;
finally
NMEchoAdr_Link.Free;
end;
end;
KSergey (2007-10-22 09:54:00) [9]> Lebedev (21.10.07 17:37)
> Procedure TForm3.OnClickButton( Sender : TObject );
> Begin
> newst.free;
Вопроса два:
1) нафиг это надо?? т.е. что за задача-то стоит?
2) а если кнопку не в run-time создать - неужели такой же ошибки ен вылезает? Что-то я сильно в том сомневаюсь.
Lebedev (2007-10-22 08:01:00) [10]>При ошибках нечего не виснет, кроме ошибившейся проги. В делфи при этом ctrl+F2 нажимать пробовал?
Нет, не помогает.
Lebedev (2007-10-22 05:58:00) [11]>кажется потому что владелец newst тот который Panel1 сам освобождает его (newst). Поэтому это newst.free лишнее
а где и как Panel1 освобождает newst?
Германн (2007-10-22 00:53:00) [12]
> Всё правильно, кнопку удалил, обработка продолжается, а
> объект не существует...
>
Сколько было затрачено человекочасов и сколько было кнопконажатий в
http://delphimaster.ru/cgi-bin/forum.pl?id=1192180654&n=18
а воз и ныне там :(
Плохиш (2007-10-21 21:27:00) [13]
> newb.OnClick:=OnClickButton;
> newb.Parent:=Panel1;
>
> end;
>
> Если в обработки нажатия созданной кнопки удалять это строку,
> то как раз ошибка и лезет
>
> Procedure TForm3.OnClickButton( Sender : TObject );
> Begin
> newst.free;
Всё правильно, кнопку удалил, обработка продолжается, а объект не существует...
vpbar (2007-10-21 19:19:00) [14]кажется потому что владелец newst тот который Panel1 сам освобождает его (newst). Поэтому это newst.free лишнее.
ЗЫ
При ошибках нечего не виснет, кроме ошибившейся проги. В делфи при этом ctrl+F2 нажимать пробовал?