RAD Studio Delphi的FMX框架是否有VCL.MinimizeName的等效函数?
FMX 路径缩短功能实现说明
- FMX 官方标准库目前没有内置和 VCL
MinimizeName完全等效的跨平台 API,你可以基于 FMX 自带的文本测量能力自行实现全平台适配的逻辑,同时兼容 Windows/Mac/iOS/Android 四个平台的字体渲染差异。 - 核心实现逻辑如下:
- 优先保留完整文件名,将中间的路径层级替换为省略号
... - 每次裁剪路径后用对应控件的字体属性测量文本宽度,直到宽度匹配
TLabel的可显示范围 - 极端情况下如果仅文件名本身就超出宽度,再对文件名做后缀裁剪
- 优先保留完整文件名,将中间的路径层级替换为省略号
你可以直接参考以下可直接运行的实现代码:
uses System.SysUtils, System.IOUtils, FMX.Graphics; function MinimizeNameFMX(const AFullPath: string; ACanvas: TCanvas; AMaxWidth: Single): string; var LDirName: string; LFileName: string; LPathSegments: TArray<string>; LTempStr: string; I: Integer; begin // 完整路径已符合宽度要求直接返回 if ACanvas.MeasureText(AFullPath).Width <= AMaxWidth then Exit(AFullPath); LFileName := TPath.GetFileName(AFullPath); LDirName := TPath.GetDirectoryName(AFullPath); LPathSegments := LDirName.Split([TPath.DirectorySeparatorChar]); // 先测试仅保留文件名加前缀省略号的宽度 Result := '...' + TPath.DirectorySeparatorChar + LFileName; if ACanvas.MeasureText(Result).Width <= AMaxWidth then begin // 尝试逐步拼接前面的路径段 LTempStr := ''; for I := 0 to High(LPathSegments) do begin if LTempStr.IsEmpty then LTempStr := LPathSegments[I] else LTempStr := LTempStr + TPath.DirectorySeparatorChar + LPathSegments[I]; var TestStr := LTempStr + TPath.DirectorySeparatorChar + '...' + TPath.DirectorySeparatorChar + LFileName; if ACanvas.MeasureText(TestStr).Width > AMaxWidth then Break; Result := TestStr; end; end else begin // 文件名本身过长,裁剪文件名 LTempStr := LFileName; while Length(LTempStr) > 3 do begin LTempStr := Copy(LTempStr, 1, Length(LTempStr) - 1); var TestStr := '...' + LTempStr; if ACanvas.MeasureText(TestStr).Width <= AMaxWidth then begin Result := TestStr; Break; end; end; end; end;
使用时直接传入对应参数即可:
// 示例:给Label1设置缩短后的路径 Label1.Text := MinimizeNameFMX('你的完整路径字符串', Label1.Canvas, Label1.Width);
内容的提问来源于stack exchange,提问作者Juan Jimenez
相关产品推荐
相关产品推荐

