unit Edit1A;interfaceuses
  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;implementationconstructor 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}

解决方案 »

  1.   

    实现:在{do something}处弹出 TDataTimePicker、TDBGrid、TTreeView、TStringGrid之类的东东
    目的:替代TComboBox、TDBComboBox、TDBLookupComboBox、T**ComboBox**
      

  2.   

    主题的基本功能实现了,与在窗体设计中一样操作,只是不知大家有没有更好的方法(优化)。以下是改过的代码:
    unit Edit1A;interfaceuses
      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);
        procedure BtnClick(Sender: TObject); //++++++++++++++++
      protected
        { Protected declarations }
        procedure Loaded; override;
    //    procedure EditButtonClick; 
        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;implementationconstructor 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:=BtnClick; //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
      showmessage('DoEditButtonClick'); //++++++++++++++++
      if Assigned(FOnEditButtonClick) then
        FOnEditButtonClick(Self)
      ;//else
      //  showmessage('do if not assigned');//ShowPopupEditor(Columns[SelectedIndex]);
    end;//++++++++++++++++
    procedure TEdit1A.BtnClick(Sender: TObject);
    begin
      DoEditButtonClick;  
    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.
      

  3.   

    FEditButton.OnClick:=你的过程或者函数(注意这里不需要写参数表)只要你自定义的函数或者过程的参数类型和顺序和EditButton空间的onclick事件里面的参数类型和顺序一致就行
      

  4.   

    你在创建控件的时候就需要指定该控件的事件相应的函数或者过程,比如FEditButton:=Teditbutton.create(self);
    FEditButton.OnClick:=DoEditButtonClick;(注意这里不需要写参数表)当然如果FEditButton.OnClick的事件里面有参数表,那么你的DoEditButtonClick里面业一定要有,而且 只要你自定义的函数或者过程的参数类型和顺序和EditButton空间的onclick事件里面的参数类型和顺序一致就行