如何正確實現組合控件的onclick事件。 (50分)

L

leway

Unregistered / Unconfirmed
GUEST, unregistred user!
寫了一個組合控件TEditGauge1,該控件由TMaskEdit、TGauge組成。
目前遇到的困難是無法正確實現控件TEditGauge1的onClick事件,我要達到的目的是鼠標無論點到
TMaskEdit區域還是TGauge區域都能響應。請各位幫忙。一下是控件原碼。

unit TEditGauge;

interface

uses
SysUtils, Classes, Controls,Mask,Gauges,ExtCtrls,strUtils;

type
TEditGauge1 = class(TCustomControl)
private
{ Private declarations }
fMaskEdit:TMaskEdit;
fGauge:TGauge;

fminValue,fMaxValue,fValue:integer;

procedure fsetMinValue(n:integer);
procedure fsetmaxValue(n:integer);
procedure fsetValue(n:integer);

procedure fMaskEditChange(Sender:TObject);
protected
{ Protected declarations }
procedure Click;override;
public
{ Public declarations }
constructor create(AOwner:TComponent);override;
published
{ Published declarations }
property MinValue:integer read fminValue write fSetMinValue;
property MaxValue:integer read fMaxValue write fSetMaxValue;
property Value:integer read fValue write fSetValue;
property OnClick;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Standard', [TEditGauge1]);
end;

constructor TEditGauge1.create(AOwner:TComponent);
begin
inherited;
setBounds(0,0,160,20);
fMinValue:=0;
fMaxValue:=100;
fValue:=50;

//create MaskEdit;
fMaskEdit:=TMaskEdit.Create(self);

//fMaskEdit.EditMask:='0000';
fMaskEdit.Text:='50';
fMaskEdit.Left:=0;
fMaskEdit.Top:=0;
fMaskEdit.Width:=32;
fMaskEdit.OnChange:=fMaskEditChange;
fMaskEdit.Anchors:=[akLeft,akTop,akBottom];
fMaskEdit.Parent:=self;

//create gauge
fGauge:=TGauge.Create(self);
fGauge.Parent:=self;
fGauge.Left:=fMaskedit.Width+2;
fGauge.Top:=0;
fGauge.Width:=self.Width-2-fMaskedit.Width-1;
fGauge.Height:=12;
fGauge.Anchors:=[akLeft,akTop,akBottom,akRight];
fGauge.Progress:=50;

end;

procedure TEditGauge1.fsetMinValue(n:integer);
begin
if (fMinValue<>n) and (n<fMaxValue) then
begin
fMinValue:=n;
if n>fValue then
begin
fValue:=n;
fGauge.Progress:=0;
end
else
begin
fGauge.Progress:=((fValue-fMinValue)*100) div (fMaxValue-fMinValue);
end;
end;
end;

procedure TEditGauge1.fsetmaxValue(n:integer);
begin
if (fMaxValue<>n) and (n>FMinValue) then
begin
fMaxValue:=n;
if n<fValue then
begin
fValue:=n;
fGauge.Progress:=100;
end
else
begin
fGauge.Progress:=((fValue-fMinValue)*100) div (fMaxValue-fMinValue);
end;
end;
end;

procedure TEditGauge1.fsetValue(n:integer);
begin
if n=fValue then exit;
if (n<fMinValue) or (n>fMaxValue) then exit;
fValue:=n;
fGauge.Progress:=((fValue-fMinValue)*100) div (fMaxValue-fMinValue);
fMaskEdit.Text:=intToStr(fValue);
end;

procedure TEditGauge1.fMaskEditChange(Sender:TObject);
var
n:integer;
s:string;
begin
s:=fMaskEdit.Text;
s:=ansireplaceText(s,' ','');
n:=strToInt(s);
if (n<fMinValue) or (n>fMaxValue) then exit;
fValue:=n;
fGauge.Progress:=((fValue-fMinValue)*100) div (fMaxValue-fMinValue);
end;

procedure TEditGauge1.Click;
begin
inherited click;
end;
end.
 
定義兩個控件 OnCLick事件不就行了
procedure TEditGauge1.MyOnClick(Sender:Object);
fMaskEdit.OnCLick:=MyOnClick;
fGauge.OnCLick:=MyOnClick;

procedure TEditGauge1.MyOnClick(Sender:Object);
begin
//做事
end;
 
lqy老兄:
這種方法我試過,雖然無論點什麼區域都可響應OnClick,但不能滿足我的要求,因為我的Onclick事件比較特別,
要求當TEditGauge被點種時,TEditGauge控件被八個點的矩形框住,如果按你的方法,那被框住的是TMaskEdit或TGauge,
而不是無論點到哪裡都框住TEditGauge。看是否有實質些的方法。
 
要实现这样的功能也许只能重载Paint方法了
 
控件從 Panel Override 下來
再從Panel建兩控件
把兩控件的 OnClick把信息傳給 Panel
panel處理
 
lqy老兄:
您說的令我大受啟發,但怎樣把兩控件的 OnClick把信息傳給 Panel,請指教。
 
就是TEditGauge1 = class(Tpanel)
 
我也说说我的思路:
1。添加一个你自己控件的ONCLICK事件(如果他的父类有的话还不用添加)。
2。编写两个控件的ONCLICK事件的响应过程,要添加两个新的方法。再在构造时添加将
这两个方法设为两个控件的ONCLICK事件。这两个方法可能仅仅是调用你的控件的ONCLICK事件。
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
576
import
I
I
回复
0
查看
826
import
I
I
回复
0
查看
467
import
I
I
回复
0
查看
584
import
I
I
回复
0
查看
440
import
I
顶部