{
DBGrid的编辑框是个 TInplaceEdit 类。而且Delphi7自带的DBGrid的 FInplaceEdit 是
private 级别的,不能直接访问。而且我也不想通过其他办法使其变为 Public目前是通过API更改其背景色的,可以说目前已经实现了一半了。
但是设置了背景色之后。那个编辑框四周大概还有一个像素宽度的区域不是我所设置的背
景色。鼓捣了好几天了,一直没有弄好。但是同样继承于 TCustomEdit 的 TEdit 却可以通过API的方法(不是直接设置其 Color
属性)使全部区域变为我设置的颜色。下面是我写的代码,运行之前需要用 ADOQuery 和 DataSource 连接到数据库。让 DBGrid
可以变为编辑状态。这样那个编辑框才会出现。请大家帮忙解决一下,先行谢过!
}
unit Unit1;interfaceuses
Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls, Grids,
DBGrids, DB, ADODB;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
edt1: TEdit;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
FirstShow: Boolean;
public
{ Public declarations }
end;var
Form1: TForm1;
OldWndProc: Pointer;
OldWndProc2: Pointer;
hBrush1: HBRUSH;implementation{$R *.dfm}function NewWndProc(hwnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
begin
if Msg = WM_CTLCOLOREDIT then
begin
SetBkMode(wParam, TRANSPARENT);
Result := hBrush1;
end
else
Result := CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam);
end;function NewWndProc2(hwnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
begin
if Msg = WM_CTLCOLOREDIT then
begin
SetBkMode(wParam, TRANSPARENT);
Result := hBrush1;
end
else
Result := CallWindowProc(OldWndProc2, hwnd, Msg, wParam, lParam);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(hBrush1);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
hBrush1 := CreateSolidBrush(clRed);
FirstShow := True;
end;procedure TForm1.FormShow(Sender: TObject);
var
h: HWND;
begin
if FirstShow then
begin
FirstShow := False; edt1.BorderStyle := bsNone;
edt1.Ctl3D := False; DBGrid1.SetFocus;
DBGrid1.EditorMode := True;
h := DBGrid1.Handle;
OldWndProc := Pointer(GetWindowLong(h, GWL_WNDPROC));
SetWindowLong(h, GWL_WNDPROC, Integer(@NewWndProc)); h := Handle;
OldWndProc2 := Pointer(GetWindowLong(h, GWL_WNDPROC));
SetWindowLong(h, GWL_WNDPROC, Integer(@NewWndProc2));
end;
end;end.
DBGrid的编辑框是个 TInplaceEdit 类。而且Delphi7自带的DBGrid的 FInplaceEdit 是
private 级别的,不能直接访问。而且我也不想通过其他办法使其变为 Public目前是通过API更改其背景色的,可以说目前已经实现了一半了。
但是设置了背景色之后。那个编辑框四周大概还有一个像素宽度的区域不是我所设置的背
景色。鼓捣了好几天了,一直没有弄好。但是同样继承于 TCustomEdit 的 TEdit 却可以通过API的方法(不是直接设置其 Color
属性)使全部区域变为我设置的颜色。下面是我写的代码,运行之前需要用 ADOQuery 和 DataSource 连接到数据库。让 DBGrid
可以变为编辑状态。这样那个编辑框才会出现。请大家帮忙解决一下,先行谢过!
}
unit Unit1;interfaceuses
Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls, Grids,
DBGrids, DB, ADODB;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
edt1: TEdit;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
FirstShow: Boolean;
public
{ Public declarations }
end;var
Form1: TForm1;
OldWndProc: Pointer;
OldWndProc2: Pointer;
hBrush1: HBRUSH;implementation{$R *.dfm}function NewWndProc(hwnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
begin
if Msg = WM_CTLCOLOREDIT then
begin
SetBkMode(wParam, TRANSPARENT);
Result := hBrush1;
end
else
Result := CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam);
end;function NewWndProc2(hwnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
begin
if Msg = WM_CTLCOLOREDIT then
begin
SetBkMode(wParam, TRANSPARENT);
Result := hBrush1;
end
else
Result := CallWindowProc(OldWndProc2, hwnd, Msg, wParam, lParam);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(hBrush1);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
hBrush1 := CreateSolidBrush(clRed);
FirstShow := True;
end;procedure TForm1.FormShow(Sender: TObject);
var
h: HWND;
begin
if FirstShow then
begin
FirstShow := False; edt1.BorderStyle := bsNone;
edt1.Ctl3D := False; DBGrid1.SetFocus;
DBGrid1.EditorMode := True;
h := DBGrid1.Handle;
OldWndProc := Pointer(GetWindowLong(h, GWL_WNDPROC));
SetWindowLong(h, GWL_WNDPROC, Integer(@NewWndProc)); h := Handle;
OldWndProc2 := Pointer(GetWindowLong(h, GWL_WNDPROC));
SetWindowLong(h, GWL_WNDPROC, Integer(@NewWndProc2));
end;
end;end.
解决方案 »
- C的代码转换成delphi代码
- delphi 如何改变edit 的高度?
- delohi 求可以随时退出程序的解决 办法。
- Fastreport中把表中的1列数据分4列打印在整张纸上怎么做
- 使用ADOConnect + AdoQuery + sqlserver2000 ,多次调用时,报告"连接被占用,不能执行下一命令"
- ms soap 3.0问题
- 请大家帮忙
- 有谁喜欢听R.E.M.的《Everybody Hurts》和R.Kelly的《I Believe I Can Fly》?
- 怎么将Treeview.Items.Item[i].data的值赋给一个record类型的变量啊?
- 关于BD和EADO的疑问
- 谁有dephi5的ado的所有补丁啊....在线等!急!
- 按《Delphi串口及语音传真高级编程》所讲方法补丁打不上啊
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids;type
TMyInplaceEdit = class(TInplaceEdit)
published
property Color;
end; TMyDBGrid = class(TDBGrid)
protected
function CreateEditor: TInplaceEdit; override;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Standard', [TMyDBGrid]);
end;function TMyDBGrid.CreateEditor: TInplaceEdit;
var
aEdit: TMyInplaceEdit;
begin
aEdit := TMyInplaceEdit.Create(Self);
aEdit.Color := clGreen; //单元格设置成绿色
Result := aEdit;
end;end.
目前我只想用API和消息解决,不知有这个可能性吗
单元格的颜色不用变化啊
正常情况下. TInplaceEdit的容器是DBGrid. 并且 DBGrid.ControlCount=0当访问DBGrid的InplaceEdit属性时.如果 FInplaceEdti=NIL, 就会建立一个InplaceEdit.DBGRID.Controls[0]或 Components[0]不可以得到TInplaceEdit.
按照 jjwwang 的方法解决的
TInplaceEdit(DBGrid1.Controls[0]).Brush.Color := clBlue;
这样就可以了。