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

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;

注意事项

  1. 确保插入Frame到ListBox时,是将Frame赋值给TListBoxItem的Control属性(例如插入逻辑:var Item := TListBoxItem.Create(listaOrcamento); Item.Control := TfrmTipoOrc.Create(Item); listaOrcamento.AddObject(Item);)
  2. 使用as转换类型前,先用is做类型校验,能避免因类型不匹配导致的运行时错误
  3. 务必初始化累加变量vValor为0,否则初始值会是内存中的随机垃圾值,导致计算结果错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:53:23