Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.23;
Скачать: CL | DM;

Вниз

Простой вопрос.   Найти похожие ветки 

 
solo ©   (2002-12-13 23:11) [0]

Здравствуйте уважаемые, вроде на первый взгляд все просто, но торможу :((
КОД:
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-14 03:21) [1]

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


 
oldman ©   (2002-12-14 06:03) [2]

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


 
Fantasist ©   (2002-12-14 06:26) [3]


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


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


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


> FPanel:= TPanel.Create(Form3);


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

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


 
oldman ©   (2002-12-14 06:50) [4]

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"


 
oldman ©   (2002-12-14 07:05) [5]

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


 
Song ©   (2002-12-14 10:53) [6]

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


 
Fantasist ©   (2002-12-14 23:40) [7]


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.12.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
1-74744
Tik
2002-12-14 17:26
2002.12.23
TreeView


1-74789
Dmitriy
2002-12-11 13:13
2002.12.23
Из области геометрии


7-75000
saf
2002-10-17 18:51
2002.12.23
Принтер


1-74667
Supreme
2002-12-13 09:59
2002.12.23
Как загрузить все значения из INI-файла в Listbox1?


1-74742
a-leksey
2002-12-14 15:25
2002.12.23
Как создать указатель на обьект внутри метода этого обьекта? Замы