2013-11-09 86 views
0

我需要在Item.Caption和SubItems上添加600多個(或更多)字符,但是我發現如果TListView的長度超過N個字符,則會完全切割文本。TListView在項目標題上添加600多個字符

我嘗試這樣做:

procedure TForm1.FormCreate(Sender: TObject); 
var 
i1: Integer; 
s: String; 
begin 
for i1 := 0 to 690 do 
    s := s + IntToStr(i1) + '-'; 

with ListView1.Items.Add do 
begin 
    Caption := s; 
    SubItems.Add(s); 
end; 
end; 

然後我啓用了ListView1.OwnerDraw:= TRUE;

正如你可以從下面的圖片中看到,從列1文雲在列2:

enter image description here

任何人都可以幫我解決這個問題?

+0

原生列表視圖不顯示超過260個字符。至於所有者繪圖,您可能想要顯示您正在使用的代碼。 –

回答

3

在Delphi 2007中使用以下(更合理)代碼的快速測試應用程序顯示ListView停止在88-8處顯示Ansi字符,該長度爲259個字符。

procedure TForm4.FormCreate(Sender: TObject); 
var 
    s: string; 
    i: Integer; 
    Item: TListItem; 
begin 
    s := ''; 
    for i := 0 to 89 do 
    s := s + '-' + IntToStr(i); 

    // Set the width of the first column so there's room for all 
    ListView1.Columns[0].Width := ListView1.Canvas.TextWidth(s) + 10; 

    Item := ListView1.Items.Add; 
    Item.Caption := s; 
    Item.SubItems.Add(s); 

    // Display length of string actually displayed, which 
    // is one short of the total length (the final '9' in '89' 
    // is truncated), in the form's caption. 
    Caption := IntToStr(Length(s) - 1); 
end; 

添加空終止於(根據需要由Windows API)意味着它260個字符,根據MSDN文檔這是所顯示的文本的最大長度; LVITEM.pszText成員可以存儲更多,但不會顯示它。

(感謝@SertacAkyuz的鏈接,所以我沒有找到它。)

您可以使用註冊表編輯器驗證這一點你自己。找到超過該限制的註冊表值(例如,我很快找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Arbiters\AllocationOrder)。無論您拖動Data列的寬度如何,RegEdit都會截斷顯示,但如果將鼠標懸停在其上,則會在單行提示中顯示全文。 (當然,除非你有多個寬屏顯示器,否則無法滾動提示窗口。)

不可能說你的OwnerDraw代碼有什麼問題(如果有的話),因爲你沒有發佈。僅僅設置OwnerDraw := True;在沒有提供繪製事件的情況下不會做任何事情。

正如評論:如果我是你,我會重新考慮你的設計。從用戶界面的角度來看這很糟糕,我可以證明爲什麼。將上面的代碼更改爲您的原始690值並運行代碼。即使文本在同一點停止(88-8),您會看到第一列的寬度足以顯示所有內容。但是,請注意您必須保持滾動才能找到第二列?如果我正在使用你的軟件,那就太臭了。

IMO會在標題中顯示少量文本,並在標籤或備忘錄控件中顯示全文,如果用戶單擊它以表明他們實際上想要閱讀它,或者在彈出窗口中顯示它。

+0

我想就是這樣,沒有繪製處理程序 - OP可能只是設置OwnerDraw。 –

+0

@Sertac:這幾乎是我的想法。 :)爲自己修改或新的帖子要求一個ListView列中所有者繪製超過600個字符的示例。 :D –

+0

謝謝Ken和Sertac,非常感謝你的回答和建議:)我接受了答案。 – user2972081