有一个memo输入文字时自动适应输入的文字总宽度.或者说有没有很好的算法获取文字的总宽度.需要注意的是:文字的大小和字体都不是确定的.不甚感激...

解决方案 »

  1.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Memo1Change(Sender: TObject);
      private
        { Private declarations }
        procedure mTempMemoChange(Sender: TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      mTempMemo: TMemo;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
            Memo1.WordWrap := False;
            mTempMemo := TMemo.Create(nil);
            mTempMemo.Visible := False;
            mTempMemo.Parent := Form1;
            mTempMemo.Width := Memo1.Width;
            mTempMemo.ScrollBars := ssBoth;
            mTempMemo.Font.Assign(Memo1.Font);
            mTempMemo.OnChange := mTempMemoChange;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
            mTempMemo.Destroy;
    end;procedure TForm1.mTempMemoChange(Sender: TObject);
    var
            mSI: TScrollInfo;
    begin
            mSI.cbSize := Sizeof(mSI);
            mSI.fMask := SIF_RANGE;
            GetScrollInfo(mTempMemo.Handle, SB_HORZ, mSI);
            if mSI.nMax > Memo1.Width-10 then
                    Memo1.Width := mSI.nMax+10;
    end;procedure TForm1.Memo1Change(Sender: TObject);
    begin
            mTempMemo.Text := Memo1.Text;
    end;end.
      

  2.   

    优化了一下:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Memo1Change(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      mTempMemo: TMemo;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
            Memo1.WordWrap := False;
            Memo1.ScrollBars := ssVertical;        mTempMemo := TMemo.Create(nil);
            mTempMemo.Visible := False;
            mTempMemo.Parent := Form1;
            mTempMemo.Width := Memo1.Width;
            mTempMemo.ScrollBars := ssBoth;
            mTempMemo.Font.Assign(Memo1.Font);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
            mTempMemo.Destroy;
    end;procedure TForm1.Memo1Change(Sender: TObject);
    var
            mSI: TScrollInfo;
    begin
            mTempMemo.Text := Memo1.Text;
            mSI.cbSize := Sizeof(mSI);
            mSI.fMask := SIF_RANGE;
            GetScrollInfo(mTempMemo.Handle, SB_HORZ, mSI);
            if mSI.nMax > Memo1.Width-30 then
                    Memo1.Width := mSI.nMax+30;
    end;end.
      

  3.   

    又优化了一下,呵呵unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Memo1Change(Sender: TObject);
      private
        mTempMemo: TMemo;
        mSI: TScrollInfo;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
            Memo1.WordWrap := False;
            Memo1.ScrollBars := ssVertical;        mTempMemo := TMemo.Create(nil);
            mTempMemo.Visible := False;
            mTempMemo.Parent := Form1;
            mTempMemo.Width := Memo1.Width;
            mTempMemo.ScrollBars := ssBoth;
            mTempMemo.Font.Assign(Memo1.Font);        mSI.cbSize := Sizeof(mSI);
            mSI.fMask := SIF_RANGE;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
            mTempMemo.Destroy;
    end;procedure TForm1.Memo1Change(Sender: TObject);
    begin
            mTempMemo.Text := Memo1.Text;
            GetScrollInfo(mTempMemo.Handle, SB_HORZ, mSI);
            if mSI.nMax > Memo1.Width-30 then
                    Memo1.Width := mSI.nMax+30;
    end;end.
      

  4.   

    感谢erhan兄,代码有点靠谱,但是不是很靠谱~~谢谢erhan兄~...
      

  5.   

    memo输入文字的时候文字的大小和字体可以不确定吗?
      

  6.   


    Canvas.TextWidth('计算文字宽度')