Delphi中OnItemClick事件如何为两个TButton分别赋值选中的TListView项文本
问题原因
原有代码的判断逻辑存在根本性错误:
- 代码中
Assigned(Base.OnClick)、Assigned(Hypo.OnClick)的判断目标是两个按钮的点击事件是否绑定处理方法,这两个事件在窗体初始化完成后就始终处于已绑定状态,因此列表项点击事件触发时永远只会进入第一个if分支,每次都会将选中文本赋值给Base按钮,完全无法区分是哪个按钮唤起的列表。 - 原逻辑未实现两个按钮显示文本不重复的校验规则,不符合需求。
修正步骤
- 在主窗体类的私有声明区新增变量,用来记录当前唤起列表的触发按钮:
private FActiveTriggerBtn: TButton; // 记录触发列表显示的目标按钮
- 修改两个按钮的点击事件,点击时先记录当前触发按钮,再显示列表:
procedure TMainForm.BaseClick(Sender: TObject); begin FActiveTriggerBtn := Base; ListView1.Visible := True; end; procedure TMainForm.HypoClick(Sender: TObject); begin FActiveTriggerBtn := Hypo; ListView1.Visible := True; end;
- 重写列表项点击事件,先做重复值校验,再给对应按钮赋值,最后隐藏列表:
procedure TMainForm.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); var SelectedText: string; begin // 无有效触发按钮或未选中有效列表项时直接退出 if not Assigned(FActiveTriggerBtn) or not Assigned(AItem) then Exit; SelectedText := AItem.Text; // 校验文本不重复:判断选中内容是否已被另一个按钮占用 if (FActiveTriggerBtn = Base) and (SelectedText = Hypo.Text) then begin ShowMessage('该选项已被Hypo按钮选中,请选择其他项'); Exit; end; if (FActiveTriggerBtn = Hypo) and (SelectedText = Base.Text) then begin ShowMessage('该选项已被Base按钮选中,请选择其他项'); Exit; end; // 给触发按钮赋值 FActiveTriggerBtn.Text := SelectedText; // 清空触发按钮记录,避免异常赋值 FActiveTriggerBtn := nil; // 隐藏列表 ListView1.Visible := False; end;
补充说明
如果需要打开列表时自动定位到当前按钮已选中的项,可以在按钮点击显示列表的逻辑中增加遍历列表项、匹配选中对应值的代码,可按需扩展。
内容的提问来源于stack exchange,提问作者LegitLearner
相关产品推荐
相关产品推荐

