2012-06-20 117 views
2

可能重複:
Can I make a TMemo size itself to the text it contains?自動調整備忘錄

需要做自動調整備忘錄:高度和寬度。

我自動調整高度如下:

function TForm1.AutoSizeMemoY(Memo: TMemo): word; 
begin 
    Canvas.Font := Memo.Font; 
    Result := Canvas.TextExtent(Memo.Lines.Strings[0]).cy * Memo.Lines.Count + 
    Canvas.TextExtent(Memo.Lines.Strings[0]).cy; 
end; 

但我不知道該怎麼做自動調整寬度。我有一個想法:如果滾動條被激活,然後增加寬度,直到它變爲不活動,但我不知道如何實現。

+2

Austosizing只能在一個方向上實現。要麼固定高度並調整寬度或固定寬度並調整高度。 – hubalu

+0

@SimaWB,我需要,並在寬度和高度。 +字體可以不同! – dedoki

回答

3

不是最好的解決方案,但它的工作原理:

function GetTextWidth(F: TFont; s: string): integer; 
var 
    l: TLabel; 
begin 
    l := TLabel.Create(nil); 
    try 
    l.Font.Assign(F); 
    l.Caption := s; 
    l.AutoSize := True; 
    result := l.Width + 8; 
    finally 
    l.Free; 
    end; 
end; 

並添加以下代碼Memo1.Onchange事件的結束this answer

LineInd := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);//focused Memo1 line Index 
    Wd := GetTextWidth(Memo1.Font, Memo1.Lines[LineInd]); 
    //MaxWidthLineInd = index of the line which has the largest width. 
    //Init value of MaxWidthLineInd = 0 
    if MaxWidthLineInd = LineInd then 
    Memo1.Width := Wd 
    else begin 
    if Wd > Memo1.Width then 
    begin 
     Memo1.Width := Wd; 
     MaxWidthLineInd := LineInd; 
    end; 
    end; 
+0

我猜不到使用該標籤。謝謝! – dedoki

+2

等待,您將實例化TLabel以獲取外部控件的文本寬度。天啊... – TLama