![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонимаю почему не работает [D7]
boleg © (2006-12-29 10:40:00)Страннно компилятор пропускает, а на епапе выполнения выдается ошибка типа "Access violation at address". Если уважаемому ALL эти потуги новичка не покажутся скучными :-) то объясните почему не работает:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure PanelDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Panel: TPanel;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel:=TPanel.Create(Self);
Panel.Top:=100;
Panel.Left:=100;
Panel.Parent:=Self;
Panel.OnDblClick:=PanelDblClick;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Panel.Free;
end;
procedure TForm1.PanelDblClick(Sender: TObject);
begin
// TPanel(Sender).Caption:='rrrrrrrrrr';
TPanel(Sender).Free; // выдает ошибку, хотя верхняя рабртает
end;
end.
С (2006-12-29 11:16:00) [21]>boleg © (29.12.06 10:40)
procedure TForm1.PanelDblClick(Sender: TObject);
begin
// TPanel(Sender).Caption:='rrrrrrrrrr';
TPanel(Sender).Free; // выдает ошибку, хотя верхняя рабртает
end;
После возврата из обработчика метод TPanel, который этот обработчик вызывает, пытается обратиться к полям объекта, для которого и произошло событие, а объект оказывается уже уничтоженным, отсюда и ошибка.
umbra (2006-12-29 11:11:00) [22]
> procedure TForm1.PanelDblClick(Sender: TObject);
> begin
> // TPanel(Sender).Caption:='rrrrrrrrrr';
> TPanel(Sender).Free; // выдает ошибку, хотя верхняя
> рабртает
> end;
>
не стоит уничтожать объект в его обработчике события
Palladin (2006-12-29 11:04:00) [23]
> [3] boleg ©
по встречной полосе тоже можно ехать, факт!
ЮЮ (2006-12-29 11:01:00) [24]
> Верхняя работает! факт!
Кто верхняя?
объяви Panel: TPanel; как локальную в методе TForm1.Button1Click. Глобальная нафиг не нужна, т.к. панелей может быть много, а ссылка только на последнюю созданную.
Джо (2006-12-29 10:59:00) [25]> [3] boleg © (29.12.06 10:54)
> Верхняя работает! факт!
Не факт.
> А вот на счет освобождения экземпляра объекта прошу поподробнее
> ответить
procedure TForm1.Button2Click(Sender: TObject);
begin
Panel.Free;
end;
boleg (2006-12-29 10:54:00) [26]Верхняя работает! факт! А вот на счет освобождения экземпляра объекта прошу поподробнее ответить. Я в терминологии не силен (маловато наверно книжек читал).
Джо (2006-12-29 10:45:00) [27]И совершенно не факт, что «верхняя» будет работать.
Джо (2006-12-29 10:42:00) [28]А откуда компилятору знать, что в процессе выполнения ты освободил экземпляр объекта до вызова его методов?