首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定TLabel的宽度

确定TLabel的宽度
EN

Stack Overflow用户
提问于 2015-09-30 11:39:49
回答 3查看 1.6K关注 0票数 2

Hello溢出用户

我有一个TGroupBox,里面有一个TLabel。使用这个TLabel,我想显示候选人的姓氏和名字。有些候选人的名字不止一个,有时是三个,当出现这种情况时,TLabel并不总是适合我的TGroupBox。当出现这种情况时,我只显示姓、名,其余的我只显示为首字母。

为了做到这一点,我需要知道如果将值分配给TLabel,它是否适合它。换句话说,在实际将值赋值给其TLabel属性之前,我需要确定Caption的宽度,因为这将是显示变量数据的糟糕编程。

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-03 14:08:52

我找到了一个简单而又简单的方法来完成这个任务。基本上,您只想知道字符串的宽度(以像素为单位),所以最好的方法是动态创建一个具有FontCanvas属性的对象。我认为TBitmap是最好的选择。下面是我使用的代码:

代码语言:javascript
复制
var
  sString: string;
  bmWidth: TBitmap;
  iWidth: Integer;
begin
  sString := edtEdit.Text;
  bmWidth := TBitmap.Create;
  try
    bmWidth.Canvas.Font.Assign(lblLabel.Font);
    iWidth := bmWidth.Canvas.TextWidth(sString);
  finally
    bmWidth.Free;
  end;
end;
票数 2
EN

Stack Overflow用户

发布于 2015-09-30 17:23:45

在VCL中,TLabel使用Win32 API DrawText()函数计算文本宽度,使用GetDC()获取屏幕的HDC,然后使用SelectObject()将当前的Font选择到HDC中。您也必须在自己的代码中这样做,例如:

代码语言:javascript
复制
// set Label1.AutoSize to False and Label1.Width to
// the max width your UI will accept the Label1 to be...

function WillFitInLabel(Label: TLabel; const S: String): Boolean;
var
  R: TRect;
  C: TCanvas;
  DC: HDC;
begin
  R := Rect(0, 0, Label.Width, 0);
  C := TCanvas.Create;
  try
    DC := GetDC(0);
    try
      C.Handle := DC;
      try
        C.Font := Label1.Font;
        Windows.DrawText(DC, PChar(S), Length(S), R, DT_SINGLELINE or DT_CALCRECT);
      finally
        C.Handle := 0;
      end;
    finally
      ReleaseDC(0, DC);
    end;
  finally
    C.Free;
  end;
  Result := (R.Width <= Label.Width);
end;

var
  Names: String;
begin
  Names := ...;
  if WillFitInLabel(Label1, Names) then
    Label1.Caption := Names
  else
    ...
end;
票数 1
EN

Stack Overflow用户

发布于 2015-10-02 15:34:57

如果要用多行包装长文本,则可以使用label的属性WordWrap := TrueAutoSize := True

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32865154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档