这是一个老问题了,我以前也问过,也在网上搜索过,但一直没有找到答案,
希望高手回答。
也许有人说这个问题无聊,其实在实际中很多时候需要,否则设计的东西不好看。

解决方案 »

  1.   

    用第三方就可以了,如 cxTextEdit 和 cxDBTextEdit
      

  2.   


    type
        TDBEdit=class(DBCtrls.TDBEdit)//设置DBEdit的对齐问题
        private
          FAlignment:TAlignment;
          procedure SetAlignment(Value:TAlignment);
        protected
          procedure CreateParams(var Params:TCreateParams);override;
        public
          property Alignment:TAlignment read FAlignment write SetAlignment;
      end;implementation{ TDBEdit }procedure TDBEdit.CreateParams(var Params: TCreateParams);
    const
    Alignments:array[TAlignment] of LongWord=(ES_Left,ES_Right,ES_Center);
    begin
    inherited   CreateParams(Params);
    Params.Style:=Params.Style or Alignments[FAlignment];
    end;procedure TDBEdit.SetAlignment(Value: TAlignment);
    begin
      if FAlignment<>Value then
      begin
       FAlignment:=Value;
       RecreateWnd;
      end;
    end;
    重载原来的,然后自己加个属性进去
      

  3.   

    谢谢指教!!!我对编写组件不熟悉(曾仔细学习过,并且也弄懂了,但1年多了忘了),
    根据朋友写的 ES_Left,ES_Right,ES_Center 这些属性,应该是左右居中的吧。
    继续请教上下居中的方法。
      

  4.   

    用API解决。procedure TForm1.Button1Click(Sender: TObject);
    begin
    SetWindowLong(Edit1.Handle, GWL_STYLE,
                  GetWindowLong(Edit1.Handle,   GWL_STYLE)  Or   ES_center);
    Edit1.SetFocus;
    end;测试OK。
      

  5.   


    var
     DC: HDC;
     SaveFont: HFont;
     Sin: Integer;
     SysMetrics, Metrics: TTextMetric;
     Rct: TRect;
    begin
     DC := GetDC(0);
     GetTextMetrics(DC, SysMetrics);
     SaveFont := SelectObject(DC, Font.Handle);
     GetTextMetrics(DC, Metrics);
     SelectObject(DC, SaveFont);
     ReleaseDC(0, DC);
     if Ctl3D then Sin := 8 else Sin := 6;
     Rct := ClientRect;
     Sin := Height - Metrics.tmHeight - Sin;
     Rct.Top := Sin div 2;
     SendMessage(Handle, EM_SETRECT, 0, Integer(@Rct)); 
    end;
      

  6.   

    SendMessage(Handle, EM_SETRECT, 0, Integer(@Rct));
    这个里面的Handle是Edit.Handle
      

  7.   


    edit1中的内容没有反映????
      

  8.   


    把Edit的自动大小设置为False
    然后每次设置高度的时候,调用一下这个玩意
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
     DC: HDC;
     SaveFont: HFont;
     Sin: Integer;
     SysMetrics, Metrics: TTextMetric;
     Rct: TRect;
    begin
     DC := GetDC(0);
     GetTextMetrics(DC, SysMetrics);
     SaveFont := SelectObject(DC, Font.Handle);
     GetTextMetrics(DC, Metrics);
     SelectObject(DC, SaveFont);
     ReleaseDC(0, DC);
     if Ctl3D then Sin := 8 else Sin := 6;
     Rct := ClientRect;
     Sin := Height - Metrics.tmHeight - Sin;
     Rct.Top := Sin div 2;
     SendMessage(edit1.Handle, EM_SETRECT, 0, Integer(@Rct));
    end;end.
    Edit的自动大小设置为False 
    已设置,按下按钮后,还是没变化?
    求解,高手
      

  10.   

    hjkto 好久不见,看你的发言,知道你又回来了!
      

  11.   

    EM_SETRECT消息是应用于memo或RichEdit上的,而Edit不接受此消息。因此 不得闲 的代码用不成。
    如果是memo或RichEdit控件的话,下面代码可简单实现:procedure TForm1.Button1Click(Sender: TObject);
    var
      Rect: TRect;
    begin
    SendMessage(RichEdit1.Handle, EM_GETRECT, 0, LongInt(@Rect));
    Rect.Top :=Rect.Top+20;//这里要加多少自己算,随便加个20就可以下移。
    Rect.Bottom := Rect.Bottom - 19;
    SendMessage(RichEdit1.Handle, EM_SETRECT, 0, LongInt(@Rect));
    end;
      

  12.   

    哎,还是传递一个完整代码吧!unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TEdit = class(StdCtrls.TEdit)
      protected
        procedure CreateParams(var Params: TCreateParams); override;
        procedure KeyPress(var Key: Char); override;
        procedure WMSize(var msg: TWMSize);message WM_SIZE;
        procedure SetParent(AParent: TWinControl);override;
        procedure SetCenter;
      end;
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
      private
        { Private declarations }
      public
        { Public declarations }
         Edt: TEdit;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key = #13 then
        ShowMessage('asdf');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Edt := TEdit.Create(self);
      Edt.Parent := self;
      Edt.AutoSize := False;
      Edt.Height := 50;
    end;{ TEdit }procedure TEdit.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.Style := Params.Style or ES_MULTILINE;
    end;procedure TEdit.KeyPress(var Key: Char);
    begin
      inherited;
      if Key = #13 then
        key := #0;
    end;procedure TEdit.SetCenter;
    var
     DC: HDC;
     SaveFont: HFont;
     Sin: Integer;
     SysMetrics, Metrics: TTextMetric;
     Rct: TRect;
    begin
     DC := GetDC(0);
     GetTextMetrics(DC, SysMetrics);
     SaveFont := SelectObject(DC, Font.Handle);
     GetTextMetrics(DC, Metrics);
     SelectObject(DC, SaveFont);
     ReleaseDC(0, DC);
     if Ctl3D then Sin := 8 else Sin := 6;
     Rct := ClientRect;
     Sin := Height - Metrics.tmHeight - Sin;
     Rct.Top := Sin div 2;
     SendMessage(Handle, EM_SETRECT, 0, Integer(@Rct));
    end;procedure TEdit.SetParent(AParent: TWinControl);
    begin
      inherited;
      if Parent <> nil then
      begin
        SetCenter;
      end;end;procedure TEdit.WMSize(var msg: TWMSize);
    begin
      inherited;
      SetCenter;
    end;end.
      

  13.   

    果然能上下居中,非常感谢!!!
    不知我发的图能不能看见,难道该论坛不是所见所得模式??http://hi.csdn.net/attachment/200911/20/1795483_1258682154Rj7T.jpg
      

  14.   

    超连接下的能看。
    大家看清楚了,每行应有20个DBEdit,所以DBEdit控件宽度已经不能再宽了(增大字体的做法显然不行),高度如果能再高点就好看了。
    如果分辨率是1024×768 ,那“一览表”的宽度基本正好,但高度就有点不够了,这时就需要增高DBEdit了,否则就太难看了。(这么多的DBEdit,难道得自己做个控件?)看超连接下的图:
    http://hi.csdn.net/attachment/200911/20/1795483_1258688122bSX8.jpg