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

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

Простой вопрос. [D5, Win2k]


solo ©   (2002-12-13 23:11:00) 

Здравствуйте уважаемые, вроде на первый взгляд все просто, но торможу :((
КОД:
TObj = class
private
FButton: TButton;
FPanel: TPanel;
procedure OnButtonClick(Sender: TObject);
public
constructor Create;
end;
<Skip>
constructor TObj.Create;
begin
FPanel:= TPanel.Create(Form3);
FPanel.Parent:= Form3;

FButton:= TButton.Create(FPanel);
FButton.Parent:= FPanel;
FButton.OnClick:= OnButtonClick;
end;

procedure TObj.OnButtonClick(Sender: TObject);
begin
FPanel.Free;
end;
<Skip>

Вообщем понятно, есть панель, и лежащая на ней кнопка. Надо, по щелчку на

кнопке закрывать панель. Вылетает "Access violation". Подскажите:
1) как реализовать задуманное
2) почему "Access violation"
3) что почитать, чтобы получше разобраться в подобных вещах.


Тем   (2002-12-15 02:50:00) [1]

не менее!
Убивать в обработчике OnClick кнопки ее владельца (Owner) - ???
Просто нет слов!


Fantasist   (2002-12-14 23:40:00) [2]


> Самому можно удалять с любым Parent"ом


Parent и Owner - совершенно разные вещи.


Song   (2002-12-14 10:53:00) [3]

2Fantasist © (14.12.02 06:26)
>>Так что если хочешь сам удалять панель пиши: FPanel:= TPanel.Create(nil).
Самому можно удалять с любым Parent"ом.


oldman   (2002-12-14 07:05:00) [4]

Если SpeedButton1 выкинуть, а его OnClick повесить на Form1.OnActivate тоже работает...


oldman   (2002-12-14 06:50:00) [5]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure OnButtonClick(Sender: TObject);
private
FPanel: TPanel;
FButton: TButton;
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
FPanel:= TPanel.Create(Form1);
FPanel.Parent:= Form1;
FButton:= TButton.Create(FPanel);
FButton.Parent:= FPanel;
FButton.OnClick:= OnButtonClick
end;

procedure TForm1.OnButtonClick(Sender: TObject);
begin
FPanel.Free;
end;

end.


И что интересно, никакого "Access violation"


Fantasist   (2002-12-14 06:26:00) [6]


> oldman © (14.12.02 06:03)
> Стандартная ошибка!!!


Хороший ответ. :)


Прежде всего:


> FPanel:= TPanel.Create(Form3);


вот таким кодом ты делаешь Form3 владельцем FPanel. Владелец удаляет все свои компоненты при разрушении. Так что если хочешь сам удалять панель пиши: FPanel:= TPanel.Create(nil).

Второе: может тебе не нужно удалять панель, а всего лишь сделать ее невидимой?


oldman   (2002-12-14 06:03:00) [7]

Стандартная ошибка!!!


Вообще   (2002-12-14 03:21:00) [8]

говоря - "закрывать" панель и FPanel.Free - это "Две Большие Разницы"!


Наверх

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