{
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.

解决方案 »

  1.   

    重写一下控件就可以了unit DBGridEx;interfaceuses
      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.
      

  2.   

    这个方法想到过。但是这个也属于“不想通过其他办法使其变为 [color=#0000FF]Public”[/color]
    目前我只想用API和消息解决,不知有这个可能性吗
      

  3.   

    好像不行,所以的单元格只有一个句柄,是个TInplaceEdit类的窗口,如果要改变颜色的话,所有单元格会一齐变色,而不是正在编辑的那个格子在变色。
      

  4.   

    目前的难题是难以更改TInplaceEdit的全部背景色。
    单元格的颜色不用变化啊
      

  5.   


    正常情况下. TInplaceEdit的容器是DBGrid. 并且 DBGrid.ControlCount=0当访问DBGrid的InplaceEdit属性时.如果 FInplaceEdti=NIL, 就会建立一个InplaceEdit.DBGRID.Controls[0]或 Components[0]不可以得到TInplaceEdit.
      

  6.   

    DBGRID.Controls[0]或 Components[0]就可以得到TInplaceEdit.
      

  7.   

    谢谢两位的参与,解决了。
    按照 jjwwang 的方法解决的
    TInplaceEdit(DBGrid1.Controls[0]).Brush.Color := clBlue;
    这样就可以了。