FireMonkey中遍历TListBox时如何访问内嵌TFrame的TNumberBox值
问题
在FireMonkey环境中,我创建了包含TNumberBox控件(名为edValor)的TfrmTipoOrc类型Frame,并将该Frame的多个实例插入到TListBox(名为listaOrcamento)中。请问遍历这个TListBox的项时,如何访问每个Frame实例里edValor的值?
Frame代码
type TfrmTipoOrc = class(TFrame) Rectangle1: TRectangle; edValor: TNumberBox; end;
Form代码
type TfrmOrcamento = class(TForm) btnSalvar: TSpeedButton; listaOrcamento: TListBox; procedure btnSalvarClick(Sender: TObject); end; implementation procedure TfrmOrcamento.btnSalvarClick(Sender: TObject); var i: Integer; vValor: Double; begin for i := 0 to Pred(listaOrcamento.Count) do begin // vValor := vValor + TfrmTipoOrc.edValor.Value; // 如何访问每个Frame实例的edValor? end; end;
解决方法
在FireMonkey中,插入到TListBox的Frame会被关联到对应的TListBoxItem的Control属性上。遍历ListBox时,只需取出每个项的Control并转换为TfrmTipoOrc类型,即可访问其中的edValor控件。
修改后的按钮点击事件代码如下:
procedure TfrmOrcamento.btnSalvarClick(Sender: TObject); var i: Integer; vValor: Double; LFrame: TfrmTipoOrc; begin vValor := 0; // 初始化累加变量 for i := 0 to Pred(listaOrcamento.Count) do begin // 先判断当前项是否为TListBoxItem if listaOrcamento.Items[i] is TListBoxItem then begin // 将Control转换为TfrmTipoOrc类型 LFrame := listaOrcamento.Items[i].Control as TfrmTipoOrc; // 累加edValor的数值 vValor := vValor + LFrame.edValor.Value; end; end; // 此处可添加对vValor的后续处理逻辑,比如输出、存储等 end;
注意事项
- 确保插入Frame到ListBox时,是将Frame赋值给
TListBoxItem的Control属性(例如插入逻辑:var Item := TListBoxItem.Create(listaOrcamento); Item.Control := TfrmTipoOrc.Create(Item); listaOrcamento.AddObject(Item);) - 使用
as转换类型前,先用is做类型校验,能避免因类型不匹配导致的运行时错误 - 务必初始化累加变量
vValor为0,否则初始值会是内存中的随机垃圾值,导致计算结果错误
内容的提问来源于stack exchange,提问作者Valdir Sola
相关产品推荐
相关产品推荐

