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

Вниз

Почему лезет ошибка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.056 c
8-1169730583
olegnik
2007-01-25 16:09
2007.11.18
Трансформирование растров


2-1193385053
Андрей
2007-10-26 11:50
2007.11.18
Положение курсора.


1-1188407910
Farel
2007-08-29 21:18
2007.11.18
firebird


2-1193398035
Alex_C
2007-10-26 15:27
2007.11.18
Как в своей форме перехватить открытие диалога выбора файла?


15-1192177213
KSergey
2007-10-12 12:20
2007.11.18
Планирование системой тработы одного потока в многопроц. системе





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