Форум: "Начинающим";
Текущий архив: 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