Delphi 如何在TTreeview中剪裁文本

Delphi 如何在TTreeview中剪裁文本,delphi,Delphi,如果名称列太窄,Delphi IDE Locals窗口将剪辑局部变量的名称,如下所示: 我想在我的程序中做同样的事情。目前,我正在使用TMS THTMLTRELELIST,得到的结果如下所示: 是否可以像IDE那样剪裁文本 谢谢你的帮助 我不知道如何使用TMS treeview进行编辑,但是对于标准的TTreeView,您必须手动绘制文本,然后您可以根据需要进行剪辑。我现在忘记了它的名称,但是RTL确实有一个函数,它可以使用用户指定的剪切宽度将文本绘制到TCanvas上,从而为您绘制省略号

如果名称列太窄,Delphi IDE Locals窗口将剪辑局部变量的名称,如下所示:

我想在我的程序中做同样的事情。目前,我正在使用TMS THTMLTRELELIST,得到的结果如下所示:

是否可以像IDE那样剪裁文本


谢谢你的帮助

我不知道如何使用TMS treeview进行编辑,但是对于标准的TTreeView,您必须手动绘制文本,然后您可以根据需要进行剪辑。我现在忘记了它的名称,但是RTL确实有一个函数,它可以使用用户指定的剪切宽度将文本绘制到TCanvas上,从而为您绘制省略号

我不知道如何使用TMS treeview进行编辑,但是对于标准的TTreeView,您必须手动绘制文本,然后您可以根据需要进行剪辑。我现在忘记了它的名称,但是RTL确实有一个函数,它可以使用用户指定的剪切宽度将文本绘制到TCanvas上,从而为您绘制省略号

试试这个:

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;
函数AbbrText(const-AText:string;ACanvas:TCanvas;const-AMaxWidthPixels:Integer):string;
开始
结果:=AText;
如果ACanvas.TextWidth(结果)>AMaxWidthPixels
开始
而(长度(结果)0)和(ACanvas.TextWidth(结果+“…”)>AMaxWidthPixels)可以
设置长度(结果),长度(结果)-1;
如果结果为“”,则
结果:=结果+'…';
结束;
结束;
我不认为这是最有效的代码,但它应该做您需要它做的事情。将文本和THTMLTRELELIST画布传递给函数,您将获得适合AMaxWidthPixels的文本。如果没有足够的空间放省略号,那么它将返回一个空字符串

试试这个:

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;
函数AbbrText(const-AText:string;ACanvas:TCanvas;const-AMaxWidthPixels:Integer):string;
开始
结果:=AText;
如果ACanvas.TextWidth(结果)>AMaxWidthPixels
开始
而(长度(结果)0)和(ACanvas.TextWidth(结果+“…”)>AMaxWidthPixels)可以
设置长度(结果),长度(结果)-1;
如果结果为“”,则
结果:=结果+'…';
结束;
结束;

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

谢谢大家的意见。我猜DrawText就是我要找的。TMS树列表似乎几乎是标准控件,具有向文本添加一些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 boolean属性,但我确信这只是我缺少的东西。如果您有时间,我将非常感谢您能给我一点正确的指导。

谢谢大家的意见。我猜DrawText就是我要找的。TMS树列表似乎几乎是标准控件,具有向文本添加一些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 boolean属性,但我确信这只是我缺少的东西。如果您有时间,我将非常感谢您的指导。对于TMS,请订阅他们的支持,否则请学习演示并使用owner draw Treeview。虽然我在这里发布之前在TMS论坛上发布了文章,但已经有一段时间没有回复了。我希望在这里能得到一些帮助,因为很多TMS的东西只是为Delphi附带的组件添加了功能。在这种情况下,看起来他们可能阻止了其中一个事件的发生。也许他们有另一种方法让它发挥作用。我在TMS上转载。对于TMS-订阅他们的支持,否则研究演示并使用owner draw Treeview。虽然我在这里发布之前在TMS论坛上发布了文章,但已经有一段时间没有回复了。我希望在这里能得到一些帮助,因为很多TMS的东西只是为Delphi附带的组件添加了功能。在这种情况下,看起来他们可能阻止了其中一个事件的发生。也许他们有另一种方法让它发挥作用。我在TMS上重新发布了。
DrawText
带有
DT\u END\u省略号
,这不是我想的功能。这是一个Win32 API函数。RTL/VCL中有一个函数将TCanvas作为参数。有机会的时候我得查一下。你想的RTL等价物是
TCanvas.TextRect
。不,那也不是。我想到的是一个独立函数,它以tcavas、字符串和像素宽度作为参数。DrawText是我正在寻找的。感谢您通过Remy提供的输入。
DrawText
带有
DT\u END\u省略号
这不是我想要的功能