【问题标题】:How to show some indicator if text width is larger than in TEdit's width如果文本宽度大于 TEdit 的宽度,如何显示一些指示符
【发布时间】:2014-06-07 09:13:07
【问题描述】:

如果文本太长而无法在文本控件中显示,通常会在文本末尾显示省略号 (...)。例如:

This is a long text...

... 表示还有更多文字。

对于Delphi VCL TEdit控件,有没有办法显示省略号或其他方式来指示文本宽度是否大于TEdit的宽度?

【问题讨论】:

  • 编辑控件用于编辑而不是显示。如果您已将数据替换为省略号,用户将如何编辑真实值。您正在寻找标签。或者,如果您需要编辑,则将其放大或接受用户必须导航。
  • @David:编辑控件也用于显示。如果某些编辑字段包含长文本,用户将不得不导航到编辑 - 没关系。但是他不能确定他看到了完整的价值,唯一的办法就是检查(开始编辑并尝试滚动),这是不行的。所以我认为问题很有用(除了标准控件没有好的解决方案之外)。
  • @Andrei 如果已被省略号替换,您如何查看整个内容?主要用例是用于编辑。对于可导航的只读文本显示,我建议静态文本更好。
  • 其实静态文本可能无法选择。
  • 在某些GUI中,如果内容比编辑框长,可以直接在文本旁边看到一个红色的右箭头。我认为您可以将红色箭头的图像直接放在文本框旁边(或带有红色文本和箭头符号的标签),并且仅在文本不适合时才使其可见。

标签: delphi vcl


【解决方案1】:

作为简单的解决方法,您可以使用 OnEnter/OnExit 事件。当焦点离开控制时,您可以检查值是否不合适,然后用较短的标记替换它(例如“...”)。存储原始值并在用户再次开始编辑时恢复它:

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Edit1Enter(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
  private
  public
    StoredValue: string;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Edit1Enter(Sender: TObject);
begin
  edit1.Text := StoredValue;
end;

procedure TForm2.Edit1Exit(Sender: TObject);
const
  Tail = '...';
var
  SrcTextSize,TailSize,ShortedTextSize: TSize;
  ShortedTextWidth: integer;
  DC: HDC;
  StoredObj: HGDIOBJ;
begin
  DC := GetDC(Edit1.Handle);
  try
    StoredObj := SelectObject(DC, edit1.Font.Handle);
    try
      StoredValue := edit1.Text;
      GetTextExtentPoint32(DC, PChar(StoredValue), Length(StoredValue), SrcTextSize);
      if SrcTextSize.cx>Edit1.ClientWidth then
      begin
        GetTextExtentPoint32(DC, PChar(Tail), Length(Tail), TailSize);
        GetTextExtentExPoint(DC, PChar(StoredValue), Length(StoredValue),
          Edit1.ClientWidth-TailSize.cx, @ShortedTextWidth, nil, ShortedTextSize);
        edit1.Text := Copy(StoredValue,1,ShortedTextWidth) + '...';
      end;
    finally
      SelectObject(DC, StoredObj);
    end;
  finally
    ReleaseDC(Edit1.Handle, DC);
  end;
end;

【讨论】:

  • 人们可能希望使用 EM_GETMARGINS/EM_GETRECT 更准确,但我认为这足以用于演示目的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2014-11-26
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多