如何改变数据感知控件的颜色,如TDBEDIT控件?(50分)

  • 主题发起人 主题发起人 songxiao
  • 开始时间 开始时间
S

songxiao

Unregistered / Unconfirmed
GUEST, unregistred user!
数据感知控件如:TDBEDIT在Enabled:=Flase时的Font.Color总为灰色
我想使它在Enabled=Flase时也能设置颜色.
哪位大侠能帮我解决?
 
windows灰色表示不可用.你要是换成别的颜色了就可以使用了(感觉上)
 
TDBEdit 是 Windows 标准控件,字体颜色在 Disable 后是不能改变的,只能是灰色。
不要白费心思了,除非自己写或者用第三方的控件。
 
我的客户有特殊的要求,那我应该怎么办?
 
不是不可以,但要自己动手,从DBEdit继承下来,改写他的Paint方法(重载),
在里面根据控件状态用Canvas自己输出就行了,没有好办法
 
to:wangjiamin

如果我的程序已经有很多的TDBEDIT,请问在不修改源码的基础上如何重载
TDBEDIT 的PAINT方法。能否为我举例?
 
那办法就是你可以将DELPHI自己的dbedit源代码重写一次,这样你自己的源码就不用改了
//当然你也可以自己继承一个DBEDIT,然后自己将自己所有DBEDIT控件换成你自己的
 
不修改源码的基础上重载 TDBEDIT 的 PAINT 方法基本上不现实,不过事在人为嘛。
用 SetWindowLong 方法重新设置 Edit 的 WndProc ,把 WM_Paint 截获也可以。但是这个
办法打死我也不会采用的。:-(
强烈建议你继承 TDBEdit ,写一个新类,这才是正道。
 
songxiao:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
我还不死心,不想结束帖子。
 
找到一个 WM_CTLCOLOREDIT 消息的例子,应该可以实现一部分要求的,关键在于 WM_CTLCOLOREDIT 消息的处理:
虽然还是不能处理 Enabled = False 的情况,但是我只能做到这一步了,自己再想想办法吧。
TEdit 和 TDBEdit 应该是一样的。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FBrush: HBRUSH;
procedure WMCTLCOLOREDIT(var Msg: TMessage); message WM_CTLCOLOREDIT;
procedure WMCTLCOLORBTN(var Msg: TMessage); message WM_CTLCOLORBTN;
procedure WMCTLCOLORLISTBOX(var Msg: TMessage); message WM_CTLCOLORLISTBOX;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMCTLCOLOREDIT(var Msg: TMessage);
begin
SetTextColor(Msg.wParam, clWhite);
SetBkColor(Msg.wParam, clGreen);
SetBkMode(Msg.wParam, OPAQUE);
Msg.Result := FBrush;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FBrush := CreateSolidBrush(clRed);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(FBrush);
end;

procedure TForm1.WMCTLCOLORBTN(var Msg: TMessage);
begin
SetTextColor(Msg.wParam, clRed);
SetBkColor(Msg.wParam, clRed);
Msg.Result := FBrush;
end;

procedure TForm1.WMCTLCOLORLISTBOX(var Msg: TMessage);
begin
SetTextColor(Msg.wParam, clWhite);
SetBkColor(Msg.wParam, clGreen);
SetBkMode(Msg.wParam, OPAQUE);
Msg.Result := FBrush;
end;

end.
 
songxiao:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
设置readonly不行么,变通一下。
 
接受答案了.
 
后退
顶部