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

Вниз

Почему лезет ошибка Access violation?   Найти похожие ветки 

 
Lebedev   (2007-10-21 17:37) [0]

Подскажите, пожалуйста, почему лезет ошибка при удалении динамически созданной метки.

Код следующий:
При создании формы (модальная) создаётся метка и кнопка:

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-21 19:19) [1]

кажется потому что владелец newst тот который Panel1 сам освобождает его (newst). Поэтому это newst.free лишнее.
ЗЫ
При ошибках нечего не виснет, кроме ошибившейся проги. В делфи при этом ctrl+F2 нажимать пробовал?


 
Плохиш ©   (2007-10-21 21:27) [2]


> newb.OnClick:=OnClickButton;
> newb.Parent:=Panel1;
>
> end;
>
> Если в обработки нажатия созданной кнопки удалять это строку,
>  то как раз ошибка и лезет
>
> Procedure TForm3.OnClickButton( Sender : TObject );
> Begin
> newst.free;

Всё правильно, кнопку удалил, обработка продолжается, а объект не существует...


 
Германн ©   (2007-10-22 00:53) [3]


> Всё правильно, кнопку удалил, обработка продолжается, а
> объект не существует...
>

Сколько было затрачено человекочасов и сколько было кнопконажатий в
http://delphimaster.net/view/2-1192180654/
а воз и ныне там :(


 
Lebedev   (2007-10-22 05:58) [4]

>кажется потому что владелец newst тот который Panel1 сам освобождает его (newst). Поэтому это newst.free лишнее

а где и как Panel1 освобождает newst?


 
Lebedev   (2007-10-22 08:01) [5]

>При ошибках нечего не виснет, кроме ошибившейся проги. В делфи при этом ctrl+F2 нажимать пробовал?
Нет, не помогает.


 
KSergey ©   (2007-10-22 09:54) [6]

> Lebedev   (21.10.07 17:37)  
> Procedure TForm3.OnClickButton( Sender : TObject );
> Begin
> newst.free;

Вопроса два:
1) нафиг это надо?? т.е. что за задача-то стоит?
2) а если кнопку не в run-time создать - неужели такой же ошибки ен вылезает? Что-то я сильно в том сомневаюсь.


 
temp_and_test   (2007-10-22 10:27) [7]

Здаврвствуйте... я тут столкнулся только что с такой же проблеммой (вернее задача похожа). Пишет ошибку 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 10:40) [8]

> temp_and_test   (22.10.07 10:27) [7]

Расскажите, плиз, что вы этим кодом хотели сказать? Особенно вот этим:

  except
    Exit;
  end;


К стати, справка по finally - мощная штука, однако :)


 
KSergey ©   (2007-10-22 10:41) [9]

> KSergey ©   (22.10.07 10:40) [8]
> К стати, справка по finally - мощная штука, однако :)

Равно как и по Exit


 
Lebedev   (2007-10-22 12:54) [10]


> Вопроса два:
> 1) нафиг это надо?? т.е. что за задача-то стоит?
> 2) а если кнопку не в run-time создать - неужели такой же
> ошибки ен вылезает? Что-то я сильно в том сомневаюсь.


Это всё из-за динамически меняющегося интерфейса на одной форме. Просто вначале создаётся statictext и кнопка, при нажатии на эту кнопку должны исчезать как и этот текст, так и эта кнопка. Удалять саму кнопку в её же событии - это конечно нереально. А вот почему текст удалить нельзя?

Либо у меня уже проект глючить стал. Теперь та же ошибка выводиться, если я их удаляю даже из другой процедуры. Ничего понять не могу! В чём дело?


 
KSergey ©   (2007-10-22 13:00) [11]

А не достаточно просто Visible := False этим компонентам? Начем непременно уничтожать?


 
Ins ©   (2007-10-22 13:09) [12]


> Сколько было затрачено человекочасов и сколько было кнопконажатий
> в
> http://delphimaster.net/view/2-1192180654/
> а воз и ныне там :(

И не говорите...


 
Johnny Cash   (2007-10-22 13:14) [13]

Мужик, тебе же сказали русским языком, обнуляй все ссылки на удаляемые объекты и не обращайся к ним никогда без проверки на nil


 
vpbar ©   (2007-10-22 13:56) [14]

вот здесь
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;

Но это к теме не относится. Ибо если компонент создается в рантайм то он удаляется корректно. При дестрое убирает себя из списка копонент владельца.
Ошибку вашу воспроивести не удалось. Так что глюк гдето. Делайте наследника с переопределенным дестроем - ведите логи и смотрите то где удаляет его



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

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

Наверх




Память: 0.5 MB
Время: 0.021 c
2-1193126123
фыва
2007-10-23 11:55
2007.11.18
ограничение ввода


6-1173437167
sairus
2007-03-09 13:46
2007.11.18
Получение данных от формы HTTPServer om


4-1178892438
P
2007-05-11 18:07
2007.11.18
IShellFolder незакрытые хендлеры


2-1192988502
Stella
2007-10-21 21:41
2007.11.18
Моделирование движения зарядов


15-1192185959
oldman
2007-10-12 14:45
2007.11.18
Предлагают работу на Оракле (че-то там, связанное с SQL).