如何在TTreeview中剪辑文本

时间:2011-09-17 00:37:36

标签: delphi

如果Name列太窄,Delphi IDE Locals窗口会剪切局部变量的名称:

enter image description here

我想在我的计划中做同样的事情。目前我正在使用TMS THTMLTreeList,我得到的结果如下:

enter image description here

是否可以像IDE一样剪辑文本?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我不知道如何使用TMS树视图,但对于标准的TTreeView,你必须手动拥有 - 绘制文本,然后你可以随意剪辑它。我现在忘记了它的名字,但是RTL确实有一个函数,它将文本绘制到TCanvas上,用户指定的剪切宽度为你绘制省略号。

答案 1 :(得分:1)

试试这个:

function AbbrText(const AText : string; ACanvas : TCanvas; const AMaxWidthPixels : Integer) : string;
begin
  Result := AText;
  if ACanvas.TextWidth(Result) > AMaxWidthPixels do
    begin
      while (Length(Result) <> 0) and (ACanvas.TextWidth(Result + '...') > AMaxWidthPixels) do
        SetLength(Result, Length(Result) - 1);
      if Result <> '' then
        Result := Result + '...';
    end;
end;

我不会说这是最有效的代码,但它应该做你需要它做的事情。将您的文本和THTMLTreeList画布传递给该函数,您将获得适合AMaxWidthPixels的文本。如果省略号的空间不够,那么它将返回一个空字符串。

答案 2 :(得分:0)

谢谢大家的意见。我猜DrawText就是我要找的东西。 TMS Treelist似乎几乎是标准控件,具有为文本添加一些HTML格式的功能,这可能会在这个小项目开发时派上用场。

我担心这听起来真的很蹩脚,但我的事件处理程序并没有受到影响,我不知道为什么。我将其设置为覆盖OnCustomDrawItem的事件处理程序:

procedure TForm1.trXMLCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
  State: TCustomDrawState; var DefaultDraw: Boolean);
var hContext: HDC;
    s: PChar;
    iLength: Integer;
    uRect: TRect;
begin
  DefaultDraw := False;
  hContext := trXML.Canvas.Handle;
  s := PChar(Node.Text);
  iLength := Length(Node.Text);
  uRect := Node.DisplayRect(True);
  DrawText(hContext, s, iLength, uRect, DT_END_ELLIPSIS);
end;

在我看来,只要需要重绘节点,就会触发此事件。第一次加载树时,我没有看到它,当我更改列的大小时,我也没有看到它,因此会有或多或少的覆盖。我不知道为什么这个控件没有CustomDraw布尔属性,但我确信它只是我缺少的东西。如果你有时间,我非常感谢你正确地做了一些指示。