自定义组件的事件响应问题,急!急!急!(80分)

M

mxYaYa

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己做了一个组件,是从TPanel继承下来的,该组件上还方了ListBox等组件,即Panel
是一个背景。我在应用程序中用了这个组件,并想在自制组件的ListBox被Double Click时,
在应用程序中作一些其它操作,所以问题是:如何在应用程序中获取自定义组件中的子组件
的DblClick事件。
我本来想,在组件中将panel的dblclick事件赋给listbox的DblClick,这样当ListBox
被双击时,引发Panel的DblClick,然后,我只需要在自定义组件的DblClick事件中编写代
码即可。但实践失败。
请问,我该如何改造我的组件。谢谢!!!
 
这样定义,不过最好从TCustomPanel继承以获得更大的灵活性。如果只是几个控件的简单
组合,Frame是不错的选择.

TYourComponent = class(TPanel)
private
FOnListBoxDblClick: TNofifyEvent;
procedure SetOnListBoxDblClick(const Value: TNotifyEvent);
.....
published
property OnListBoxDblClick: TNotifyEvent read FOnListBoxDblClick
write SetOnListBoxDblClick;
end;

procedure TYourConpoment.SetOnListBoxDblClick(const Value: TNotifyEvent);
begin
FListBox.OnDblClick := Value;
end;
 
非常感谢OpuBF给我的回答,很抱歉我到今天才有回应,主要是我一直没有收到你回答
我问题的EMail,大概是信箱问题。
今天我按你的提示试了一下,组件外面确实引出了OnListBoxDblClick事件,但我在外
面程序该组件的这个事件中写了代码,运行后,当我双击组合组件的ListBox时,事件中
的代码未被触发。请问这是为什么,我是不是在组件中还少了一些代码?
但愿能及时给我帮助,非常感谢。
 
我想知道,你这个LISTBOX应该是你自己在程序中创建的呢还是你在DESIGN时手动从面板中
拖上去的。如果是前者,应该是Opubf的方法,后者的话,用属性编辑器不可以指定吗:)
 
To:iamfly
我这个控件是从静态加到应用界面上的——拖上去的。但是该组件是组合组件,上面说得
很清楚,有Panel、label、combobox、和ListBox,基类是从TPanel继承下来的,所以属性
编辑器中的事件是针对Panel的,双击LIstBox时不能直接激发panel的双击事件。
 
我想,listbox不可能从panel继承吧:)
在你设计这个组件时,既然你的listbox是从面板上拖下来的,那应该可以从object inspector
上来修改属性的啊 ^_^
不管是不是组合组件,你的LISTBOX的CLASSPARENT不可能是PANEL,PANEL只能是你的LISTBOX
的PARENT或OWNER而已:)
对了,有一点我想清楚,你自制的PANEL上的LISTBOX是你在设计这个PANEL时放上去的还是
你在编程用到你的自制PANEL时,再放上去的:)
 
To:iamfly
我的自定义组件是个组合组件,Panel是基础,上面放了listBox等组件,其Parent是
Panel,组件是从TPanel继承下来的,所以ObjectInspector上看到的是Panel的属性。
我的组合组件中的ListBox当然是设计Panel时放上去的,组合组件嘛,我已说得很清楚。
 
不知道你的listbox是不是空的(就是items没有东西),空的listbox是不响应dbclick的
dbclick是响应你在listbox的items上的双击,OpuBF说的没错
 
unit Base;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,Forms,
StdCtrls, Dialogs;
type
TBaseData = class(tpanel)
Button1 : TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
Protected
{ Protected declarations }
public
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('work', [TBaseData]);
end;

constructor TBaseData.Create(Owner: TComponent);
begin
inherited Create(Owner);
Button1 :=TButton.Create(Self);
Button1.Parent :=self;
Button1.Left:=10;
Button1.Top:=10;
Button1.OnClick :=Button1Click; //这句是关键
end;

destructor TBaseData.Destroy;
begin
Button1.Free;
inherited Destroy;
end;


procedure TBaseData.Button1Click(Sender: TObject);
begin
ShowMessage('a');
end;
end.

一定行的,我试过不知几遍了。
 
free_knight说的没错,你的程序在OpuBF回答的基础上加上这句话应该可以:
在组件的创建方法中:
constructor Txxxxx.Create(Owner: TComponent);
begin
...
YourListBox1.OnDblClick := OnListBoxDblClick;
...
end;
 
To: free_knight(以及其他热心的讨论者)
这样不能解决我的问题,以你的例程为例。我当前需要把Button1的Click事件引到组合组件
外部,应用程序外部可以看到,并在该事件中任意扩展,而不是固定的在组件中内含Button1
的Click事件。
 
你可以把
............
procedure Button1Click(Sender: TObject);
............
Button1.OnClick :=Button1Click; //这句是关键
...........
procedure TBaseData.Button1Click(Sender: TObject);
begin
ShowMessage('a');
end;
..............
删掉,在自己程序中加,如下:


unit Unit1;

interface

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

type
TForm1 = class(TForm)
BaseData1: TBaseData;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
BaseData1.Button1.OnClick:=button1.OnClick;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('bb');
end;

end.


 
procedure TForm1.Button1Click(Sender: TObject);
也可是自定义过程
 
多人接受答案了。
 
顶部