You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi FireMonkey中TEdit控件EM_SETCUEBANNER失效问题排查

Delphi FireMonkey TEdit(ControlType=Platform)TextPrompt不显示问题排查与解决

问题原因

  1. 控件初始化时机不匹配:FireMonkey Platform模式下的TEdit,其原生Windows控件的初始化流程晚于VCL。若在控件句柄刚创建时就发送EM_SETCUEBANNER消息,此时原生控件尚未完成内部初始化,系统虽接收消息但不执行设置,因此返回0且无错误码(GetLastError=0)。
  2. FMX框架封装缺陷:默认情况下,FMX未将TEdit.TextPrompt属性正确同步到Platform模式下的原生控件,手动调用消息后,框架后续的初始化逻辑可能覆盖该设置。

解决办法

1. 延迟发送提示文本消息

确保在控件完全初始化后再调用EM_SETCUEBANNER,比如在窗体的OnShow事件或控件的OnEnter事件中执行:

uses FMX.Edit.Win, Winapi.Messages, Winapi.Windows;

procedure TMainForm.FormShow(Sender: TObject);
begin
  if Edit1.ControlType = TControlType.Platform then
  begin
    SendTextMessage(Edit1.Handle, EM_SETCUEBANNER, WPARAM(True), LPARAM(PChar(Edit1.TextPrompt)));
  end;
end;

2. 重写Platform Edit的创建逻辑

修改FMX.Edit.Win.pas中的TWindowsEdit.Create方法,在控件创建完成后立即添加提示文本设置逻辑,确保消息在原生控件初始化完成后发送:

constructor TWindowsEdit.Create(const AModel: TEditModel);
begin
  inherited;
  // 保留原有初始化代码
  if AModel.TextPrompt <> '' then
  begin
    SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(True), LPARAM(PChar(AModel.TextPrompt)));
  end;
end;

注:修改FMX源文件后需重新编译相关包。

3. 临时替代方案

若上述方法无效,可通过TVCLContainer在FMX应用中嵌入VCL的TEdit控件,直接利用VCL成熟的提示文本支持,避免FMX Platform控件的兼容性问题。

内容的提问来源于stack exchange,提问作者zeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:50:25