为适应多语言,需要对界面控件大小、位置多动态改变,因此需要根据其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. jquery接触初级-----juqery 动画函数

    1. window.onload(), 一次只能保存对一个函数的引用:如果多次调用,他会自动用后面的函数覆盖前面的函数 2.$(document).ready(); 会在现有行为上追加新的行为,这些函 ...

  2. python中序列化json模块和pickle模块

    内置模块和第三方模块 json模块和pickle 模块(序列化模块) 什么是序列化? 序列化就是将内粗这种的数据类型转成另一种格式 序列化:字典类型——>序列化——>其他格式——>存 ...

  3. JS实现简单的运行代码 & 侧边广告

    /* JS实现简单的运行代码功能 */<!doctype html> <html> <head> <meta charset="utf-8" ...

  4. vscode 右击文件||文件夹添加快捷方式

    操作注册表步骤 1.按下win+R 2.输入redegit,打开注册表 3.找到HKEY_CLASSES_ROOT/*/shell路径 4.新建/项:命名Open with visual code 5 ...

  5. 【原】Ubuntu virtual terminal

    CTRL+ALT+F1 ~ F6 six virtual terminal ALT-F7 return to graphic desktop

  6. 11.mysql-权限.md

    目录 -- ***********五.mysql权限问题**************** -- mysql数据库权限问题:root :拥有所有权限(可以干任何事情) -- 权限账户,只拥有部分权限(C ...

  7. thread == 票池

    public class ThreadDemo2 { public static void main(String[] args){ TicketPool tp = new TicketPool(); ...

  8. C# Excel转换为Json

    demo:https://files.cnblogs.com/files/guxingy/Excel%E8%BD%AC%E6%8D%A2%E4%B8%BAJson%E5%AF%B9%E8%B1%A1. ...

  9. Linux安装face_recgnition

    Ubuntu 3:apt-get install python3.6-dev 4:pip3 install face_recgnition 5:  pip3 install opencv-python ...

  10. .html() 与.text() 获取值、取值 区别

    1.html代码<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...