首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-02-07 
如何在组件中加入自定义处理程序unit Edit1AinterfaceusesWindows, SysUtils, Classes, Controls, StdCtr

如何在组件中加入自定义处理程序
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事件里面的参数类型和顺序一致就行

热点排行