在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會在標題中顯示少量文本,並在標籤或備忘錄控件中顯示全文,如果用戶單擊它以表明他們實際上想要閱讀它,或者在彈出窗口中顯示它。
原生列表視圖不顯示超過260個字符。至於所有者繪圖,您可能想要顯示您正在使用的代碼。 –