为适应多语言,需要对界面控件大小、位置多动态改变,因此需要根据其Caption计算实际像素大小。

找资料未有易用现成的,遂参数其它方法,写以函数处之,代码如下:

uses
TypInfo; function GetTextWidth(AControl: TControl): Integer;
function GetControlFont: TFont;
var
PropInfo: PPropInfo;
begin
Result := nil;
PropInfo := GetPropInfo(AControl.ClassInfo, 'Font');
if Assigned(PropInfo) then
Result := GetObjectProp(AControl, PropInfo) as TFont;
end; var
sCaption: string;
fnt: TFont;
cvs: TCanvas;
begin
Result := ;
if not IsPublishedProp(AControl, 'Caption') then Exit;
sCaption := Trim(GetPropValue(AControl, 'Caption', True));
if sCaption = '' then Exit;
fnt := GetControlFont;
if not Assigned(fnt) then Exit; cvs := TCanvas.Create;
try
cvs.Handle := GetDC();
cvs.Font.Assign(fnt);
Result := cvs.TextWidth(sCaption);
finally
cvs.Free;
end;
end;

界面可根据控件文本长度动态做修正了。比如:

btnConvert.Width := GetTextWidth(btnConvert) + ;

根据上面结论,可封装动态修改控件宽度及位置代码,函数如下:

procedure AdjustPostitionAndWidth(ACtrl: TControl; const AAlignment: TAlignment;
AOffSet: Integer);
function Scale(const v: Integer): Integer;
begin
Result := Trunc(v * Screen.PixelsPerInch / );
end; function GetTextWidth: Integer;
function GetControlFont: TFont;
var
PropInfo: PPropInfo;
begin
Result := nil;
PropInfo := GetPropInfo(ACtrl.ClassInfo, 'Font');
if Assigned(PropInfo) then
Result := GetObjectProp(ACtrl, PropInfo) as TFont;
end; var
sCaption: string;
fnt: TFont;
cvs: TCanvas;
begin
Result := ;
if not IsPublishedProp(ACtrl, 'Caption') then Exit;
sCaption := Trim(GetPropValue(ACtrl, 'Caption', True));
if sCaption = '' then Exit;
fnt := GetControlFont;
if not Assigned(fnt) then Exit; cvs := TCanvas.Create;
try
cvs.Handle := GetDC();
cvs.Font.Assign(fnt);
Result := cvs.TextWidth(sCaption);
finally
cvs.Free;
end;
end; var
os, tw: Integer;
begin
AOffSet := Scale(AOffSet);
tw := GetTextWidth();
if tw + AOffSet < ACtrl.Width then Exit; os := tw + AOffSet - ACtrl.Width;
ACtrl.Width := tw + AOffSet;
case AAlignment of
taCenter:
ACtrl.Left := ACtrl.Left - os div ;
taRightJustify:
ACtrl.Left := ACtrl.Left - os;
end;
end;

如此,多语言显未可无忧矣!

Delphi: 获取控件文本宽度(像素)的更多相关文章

  1. Android在OnCreate中获取控件的宽度和高度

    在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算.在需要自适应屏幕的情况下,这种计算就显得特别重要.另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高 ...

  2. Android下在onCreate中获取控件的宽度和高度(通过回调)

    有时候需要在onCreate方法中知道某个View组件的宽度和高度等信息, 而直接调用View组件的getWidth().getHeight().getMeasuredWidth().getMeasu ...

  3. android 获取屏幕的高度和宽度、获取控件在屏幕中的位置、获取屏幕中控件的高度和宽度

    (一)获取屏幕的高度和宽度 有两种方法: 方法1: WindowManager wm = (WindowManager) getContext().getSystemService(Context.W ...

  4. Android 在OnCreate()中获取控件高度与宽度

    试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int ...

  5. Delphi WebBrowser控件的使用(大全 good)

    Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDis ...

  6. Delphi TcxtreeList控件说明 转

    Delphi TcxtreeList控件说明   树.cxTreeList 属性: Align:布局,靠左,靠右,居中等 AlignWithMargins:带边框的布局 Anchors:停靠 (akT ...

  7. Delphi StringGrid控件的用法

    Delphi StringGrid控件 组件名称:StringGrid         ●固定行及固定列:  StringGrid.FixedCols:=固定行之数;  StringGrid.Fixe ...

  8. javascript控制滚动条的位置,获取控件的位置

    一.如下是定位鼠标在视窗中的位置,先定位视窗和页面直接的距离. function getMousePoint() { var point = {x:0,y:0}; // 如果浏览器支持 pageYOf ...

  9. js获取控件位置以及不同浏览器中的差别

    js获取控件位置(坐标位置)在不同浏览器中的差别. //获取坐标位置 function getpos(e) { var t=e.offsetTop; var l=e.offsetLeft; var h ...

随机推荐

  1. jsfl完成通知air

    jsfl完成后生成一个文本A.txt, air开始jsfl执行后一直检测A.txt是否存在,存在就是完成了.那么就可以删除这个A.txt

  2. DirectShow设置采集帧率码率YUV<转>

    // 设置参数,p1=宽,p2=高,p3=帧率 AM_MEDIA_TYPE *p = NULL; IAMStreamConfig *pSC = NULL; pCGB2->FindInterfac ...

  3. Leetcode 题解 Combinations:回溯+求排列组合

    罗列出从n中取k个数的组合数组. 首先,求C(n,k)这个实现,很粗糙,溢出也不考虑,好的方法也不考虑.笨蛋.心乱,上来就写.. 另外,发现在递归中,不能申请太大的数组?貌似不是这个问题,是我自己越界 ...

  4. DOM节点的增删改查以及class属性的操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. ubuntu安装pgAdmin 4

    One way to install pgadmin4 is to download its Python wheel at https://www.postgresql.org/ftp/pgadmi ...

  6. oracle中去掉回车换行空格的方法详解

    函数: 1.translate语法:TRANSLATE(char, from, to)用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串.            若from比to ...

  7. 尚硅谷redis学习1-NOSQL简介2

    NoSql数据模型简介 聚合模型:KV键值,BSON 列族: 图形,这里的图形不是指真正的图形,而是关系图 NoSql数据库的四大分类 KV键值:BerkeleyDB,Redis,tair,memca ...

  8. Delphi Locate 详解1 转

    TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据.程序首先必须使用SQL命令从后端数据库中取得数据 ...

  9. Linux命令:ssh-add

    ssh-add帮助 SSH-ADD() BSD General Commands Manual SSH-ADD() NAME ssh-add — adds private key identities ...

  10. Think you can pronounce these 10 words correctly? You might be

    Think you can pronounce these 10 words correctly?  You might be surprised! Share Tweet Share Tagged ...