读书人

怎么在组件中加入自定义处理程序

发布时间: 2012-02-07 17:45:36 作者: rapoo

如何在组件中加入自定义处理程序
unit Edit1A;

interface

uses
Windows, SysUtils, Classes, Controls, StdCtrls, Buttons, Dialogs;

type

TEditButtonEvent =
procedure(Sender: TObject) of Object; //我想在中间嵌入处理代码,但这里(也)加不了

TEditButtonStyle = (ebsAuto, ebsEllipsis, ebsNone);

TEdit1A = class(TEdit)
private
{ Private declarations }
FEditButton: TSpeedButton;
//FOnEditButtonClick: TNotifyEvent;
FOnEditButtonClick: TEditButtonEvent;
FButtonStyle: TEditButtonStyle;
procedure SetButtonStyle(Value: TEditButtonStyle);
protected
{ Protected declarations }
procedure Loaded; override;
procedure DoEditButtonClick; dynamic;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
// property OnEditButtonClick: TNotifyEvent read FOnEditButtonClick
// write FOnEditButtonClick;
property OnEditButtonClick: TEditButtonEvent read FOnEditButtonClick
write FOnEditButtonClick;
property ButtonStyle: TEditButtonStyle read FButtonStyle write SetButtonStyle
default ebsAuto;
procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override;
procedure DoEnter; override;
procedure DoExit; override;
end;

procedure Register;

implementation

constructor TEdit1A.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FButtonStyle := ebsAuto;
end;

procedure TEdit1A.Loaded;
begin
inherited Loaded;
if not (csDesigning in ComponentState) then
begin
FEditButton:=TSpeedButton.Create(self);
FEditButton.Visible:=false;
FEditButton.Parent:=self.Parent;
FEditButton.SetBounds(Left+Width,Top+1,Height-2,Height-2);
FEditButton.Caption:='...';
FEditButton.OnClick:=OnEditButtonClick; //我想在中间嵌入处理代码,但这里(也)加不了
end;
end;

procedure TEdit1A.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
P: TPoint;
begin
//FEditButton
if FEditButton<>nil then
begin
P := Point(ALeft+AWidth, ATop+1);
FEditButton.SetBounds(P.X, P.Y, FEditButton.Width, FEditButton.Height);
end;

inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

procedure TEdit1A.DoEditButtonClick;
begin
//我想在此嵌入处理代码,FEditButton.OnClick不会进入这里
{do something}

if Assigned(FOnEditButtonClick) then
FOnEditButtonClick(Self)
;//else
// showmessage('do if not assigned');//ShowPopupEditor(Columns[SelectedIndex]);
end;

procedure TEdit1A.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (FButtonStyle = ebsEllipsis) and (Key = VK_RETURN) and (Shift = [ssCtrl]) then
begin
DoEditButtonClick;
// KillMessage(Handle, WM_CHAR);
end
else
inherited KeyDown(Key, Shift);
end;

procedure TEdit1A.SetButtonStyle(Value: TEditButtonStyle);
begin
if Value = FButtonStyle then Exit;
FButtonStyle := Value;
// Changed(False);
end;

procedure TEdit1A.DoEnter;
begin
inherited;
if FButtonStyle=ebsEllipsis then
begin
FEditButton.Visible:=true;
end;
//if Assigned(FOnEnter) then FOnEnter(Self);


end;

procedure TEdit1A.DoExit;
begin
inherited;
begin
FEditButton.Visible:=false;
end;
end;

procedure Register;
begin
RegisterComponents('FrVCL', [TEdit1A]);
end;

end.



总之:FEditButton.OnClick不会处理DoEditButtonClick
或说:我要在FEditButton.OnClick时处理{do something}

[解决办法]
dingyixia
[解决办法]
FEditButton.OnClick:=你的过程或者函数(注意这里不需要写参数表)

只要你自定义的函数或者过程的参数类型和顺序和EditButton空间的onclick事件里面的参数类型和顺序一致就行

读书人网 >.NET

热点推荐