怎么让TDBEdit控件右边添加一个按钮? ( 积分: 100 )

  • 主题发起人 主题发起人 bbscom
  • 开始时间 开始时间
B

bbscom

Unregistered / Unconfirmed
GUEST, unregistred user!
也就是说TDBEdit控件的最右边添加TSpeedButton点击控件两者合为一体,具有两者各自相同的方法。

效果介绍:TComboBox控件右边有一个按钮,这个按钮要有TSpeedButton的方法,但点击时不要有下列表显示。

这里面共有750分 http://www.delphibbs.com/delphibbs/listq.asp?type=1&userfrom=bbscom
 
一定要自己做还是要第三方的控件?
 
我当然希望自己会做,但有第三方源代码也可以。
 
有第三方源代码指对此一个问题解决就行。
不要搞一个巨物让我查得头晕。
 
我用的Rz的有源代码,不过自己做一个也不难
 
lake_cx,太感谢你了,帮我做一个吧。
Rz源代码可以发给我吗?Delphi2005@163.com
 
unit DBButtonEdit;

interface

uses
Windows, SysUtils, Classes, Controls, Messages, StdCtrls, Mask, DBCtrls,
Buttons;

type
TDBButtonEdit = class(TDBEdit)
private
FButton: TSpeedButton;
function GetOnButtonClick: TNotifyEvent;
procedure SetOnButtonClick(const Value: TNotifyEvent);
procedure SetEditRect;
protected
procedure CreateParams( var Params: TCreateParams ); override;
procedure CreateWnd; override;
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
procedure CMEnter(var Msg: TCMEnter); message CM_ENTER;
procedure CMExit(var Msg: TCMExit); message CM_EXIT;
procedure CMEnabledChanged(var Msg: TMessage); message CM_ENABLEDCHANGED;
procedure CMFontChanged(var Msg: TMessage); message CM_FONTCHANGED;
public
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
published
property Button: TSpeedButton read FButton;
property OnButtonClick: TNotifyEvent read GetOnButtonClick write SetOnButtonClick;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TDBButtonEdit]);
end;

{ TDBButtonEdit }

procedure TDBButtonEdit.CMEnabledChanged(var Msg: TMessage);
begin
SetEditRect;
end;

procedure TDBButtonEdit.CMEnter(var Msg: TCMEnter);
begin
SetEditRect;
end;

procedure TDBButtonEdit.CMExit(var Msg: TCMExit);
begin
SetEditRect;
end;

procedure TDBButtonEdit.CMFontChanged(var Msg: TMessage);
begin
SetEditRect;
end;

constructor TDBButtonEdit.Create(Owner: TComponent);
begin
inherited;
FButton := TSpeedButton.Create(Self);
FButton.Parent := Self;
FButton.Cursor := crArrow;
end;

procedure TDBButtonEdit.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or WS_CLIPCHILDREN;
end;

procedure TDBButtonEdit.CreateWnd;
begin
inherited;
SetEditRect;
end;

destructor TDBButtonEdit.Destroy;
begin
FButton.Free;
inherited;
end;

function TDBButtonEdit.GetOnButtonClick: TNotifyEvent;
begin
Result := FButton.OnClick;
end;

procedure TDBButtonEdit.SetEditRect;
begin
if not UseRightToLeftAlignment then
begin
SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN, 0);
SendMessage(Handle, EM_SETMARGINS, EC_RIGHTMARGIN, MakeLong(0, Height + 2));
end
else
begin
SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN, MakeLong(Height + 2, 0));
SendMessage(Handle, EM_SETMARGINS, EC_RIGHTMARGIN, 0 );
end;
end;

procedure TDBButtonEdit.SetOnButtonClick(const Value: TNotifyEvent);
begin
FButton.OnClick := Value;
end;

procedure TDBButtonEdit.WMSize(var Msg: TWMSize);
begin
if Assigned(FButton) then
begin
if Ctl3D then
FButton.SetBounds(Width - Height, 0, (Height - 4), (Height - 4))
else
FButton.SetBounds(Width - Height + 1, 1, Height - 1, Height - 1);
end;
end;

end.

似乎有点问题,单击Edit框多次为什么Button会不刷新?
 
lake_cx,你好!
我已经测试N次了,也在网上找了一些,但还是没有更好的。

测试我也发现有几个问题:
[blue]1、TDBButtonEdit创建的控件,当连接数据库ID字段时就失去效果(右边的按钮消失了)。
2、由于EDIT编写状态与按钮状态的光标状态不一样,在转换时出错。
3、对于EDIT重画的颜色线,右边的按钮消失。[/blue]

解决办法看能不能将右边的[red]按钮放到DBEDIT外右边[/red](不要放到DBEDIT内右边)试一试!
 
用Ehlib里面的DBEditEh吧
 
看了下DBEdit的源码他有这么句话
{ Since edit controls do not handle justification unless multi-line (and
then only poorly) we will draw right and center justify manually unless
the edit has the focus. }
似乎在字符串靠右的时候是自己绘制的文本,所以button没了,所以要自己搞的话,连DBEdit都得自己写
 
参照labeledit
 
聯繫我的QQ:138268
我幫你解決問題,但你的分都給我吧。
 
解决过这个问题 呵呵
 
多人接受答案了。
 
后退
顶部