Delphi FMX安卓/Windows项目搜索框实现问题求助
Delphi FMX 跨平台搜索框实现方案
针对你遇到的两个问题,直接给出修正方案:
1. 解决ComboBox下拉列表刷新问题
你手动收缩展开的方式不够可靠,正确的做法是先关闭下拉列表,再重新打开,同时确保过滤后的数据集同步到ComboBox的绑定源:
修改SearchBox1Typing事件代码:
procedure TfrmMain.SearchBox1Typing(Sender: TObject); begin ComboBox1.BeginUpdate; try dmCC.FDQuery1.Filtered := False; dmCC.FDQuery1.Filter := ''; if SearchBox1.Text <> '' then begin dmCC.FDQuery1.OnFilterRecord := nil; // 处理LIKE查询的转义,避免特殊字符(如%、_)干扰匹配 const EscapedText = StringReplace(UpperCase(SearchBox1.Text), '/', '//', [rfReplaceAll]); dmCC.FDQuery1.Filter := 'UPPER(name) LIKE ''/' + EscapedText + '%'' ESCAPE ''/'''; dmCC.FDQuery1.Filtered := True; end; // 刷新绑定源(如果使用TBindSourceDB绑定数据集) if Assigned(dmCC.BindSourceDB1) then dmCC.BindSourceDB1.Refresh; // 先关闭下拉再重新展开,确保列表刷新 ComboBox1.CloseUp; ComboBox1.DropDown; finally ComboBox1.EndUpdate; end; end;
2. 解决ComboBox选项点击事件不触发问题
FMX的TComboBox点击下拉选项时,不会触发OnClick事件,该事件仅在点击ComboBox控件本身时生效。你需要改用OnCloseUp事件(选择选项后下拉列表关闭时触发):
- 在设计界面中,将ComboBox的
OnCloseUp事件关联到处理方法 - 编写如下代码:
procedure TfrmMain.ComboBox1CloseUp(Sender: TObject); begin // 确保选中有效选项后再赋值 if ComboBox1.ItemIndex <> -1 then SearchBox1.Text := ComboBox1.Text; end;
额外注意事项
- 如果你没有使用绑定源,而是直接将ComboBox的Items与FDQuery关联,可能需要手动调用
ComboBox1.Items.Clear和ComboBox1.Items.Add重新加载过滤后的数据集,但推荐使用绑定源(TBindSourceDB + TBindingsList)来自动同步数据,减少手动维护成本。 - 测试安卓平台时,注意输入法弹出/收起对下拉列表显示的影响,可以适当调整ComboBox的位置或使用FMX的自适应布局。
内容的提问来源于stack exchange,提问作者sax
相关产品推荐
相关产品推荐

