Delphi FireMonkey中TEdit控件EM_SETCUEBANNER失效问题排查
Delphi FireMonkey TEdit(ControlType=Platform)TextPrompt不显示问题排查与解决
问题原因
- 控件初始化时机不匹配:FireMonkey Platform模式下的TEdit,其原生Windows控件的初始化流程晚于VCL。若在控件句柄刚创建时就发送
EM_SETCUEBANNER消息,此时原生控件尚未完成内部初始化,系统虽接收消息但不执行设置,因此返回0且无错误码(GetLastError=0)。 - 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
相关产品推荐
相关产品推荐

