Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непонимаю почему не работает [D7]


Страницы:   1 2

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]

А откуда компилятору знать, что в процессе выполнения ты освободил экземпляр объекта до вызова его методов?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо