用Panel,背景白色,设边框,看起来和TEdit一样

解决方案 »

  1.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        edt1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        OldWndProc: TWndMethod;
        procedure NewWndProc(var m: TMessage);
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.NewWndProc(var m: TMessage);
    begin
      // 滤掉 WM_SETFOCUS 消息
      if m.Msg <> WM_SETFOCUS then
        OldWndProc(m);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      // 接管 edt1 的窗口过程
      OldWndProc := edt1.WindowProc;
      edt1.WindowProc := NewWndProc;
    end;end.
      

  2.   


    光标是没有了,但是焦点还在,
    如何让edit只起lable的作用?
      

  3.   

    你同时再设置 edit 的 readonly:=true 就得了
      

  4.   


    已经是True了,但是还有焦点;
      

  5.   


    procedure TForm1.FormCreate(Sender: TObject);
    begin
    // 加一句
      SetWindowLong(edt1.Handle, GWL_STYLE,
        GetWindowLong(edt1.Handle, GWL_STYLE) or WS_EX_NOACTIVATE);
      // 接管 edt1 的窗口过程
      OldWndProc := edt1.WindowProc;
      edt1.WindowProc := NewWndProc;
    end;
      

  6.   


    感谢,问题基本解决,不过有个问题,
    我有20个edit,每个都要这么干?
    有简单批量的方法?
      

  7.   

    你要是像设置WS_EX_NOACTIVATE 样式这么干,就不用子类化edit了。要批量设置的话可以这样procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
      edit: TEdit;
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TEdit then
        begin
          edit := Controls[i] as TEdit;
          SetWindowLong(edit.Handle, GWL_STYLE,
            GetWindowLong(edit.Handle, GWL_STYLE) or WS_EX_NOACTIVATE);
        end;
      end;
    end;
      

  8.   


    非常感谢sololie 大侠。。