![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Простой вопрос. [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 - это "Две Большие Разницы"!