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}
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}
目的:替代TComboBox、TDBComboBox、TDBLookupComboBox、T**ComboBox**
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.
FEditButton.OnClick:=DoEditButtonClick;(注意这里不需要写参数表)当然如果FEditButton.OnClick的事件里面有参数表,那么你的DoEditButtonClick里面业一定要有,而且 只要你自定义的函数或者过程的参数类型和顺序和EditButton空间的onclick事件里面的参数类型和顺序一致就行