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

如何使用C++Builder在Android端实现带TRadioButton的模态输入对话框

C++ Builder 10.4 FMX Android 单选模态弹窗实现方案

实现思路

  • 完全动态创建轻量化弹窗窗体,无需设计时提前定义窗体资源,不会占用全屏,悬浮在当前活动窗口上层
  • 内部动态生成单选按钮组、确认/取消按钮,适配选项数量自动调整大小
  • 采用异步回调模式返回选择结果,符合Android平台异步对话框的设计规范,和TDialogServiceAsync使用逻辑一致

完整实现代码

第一步:头文件(.h)添加声明

在你当前使用的窗体类的私有声明区域添加函数定义:

private:	// 用户自定义声明
    void __fastcall ShowRadioSelectDialog(String Title, TStringDynArray Options, TProc<int> OnSelectResult);

第二步:实现文件(.cpp)添加功能代码

#include <FMX.StdCtrls.hpp>
#include <FMX.Layouts.hpp>
#include <System.Classes.hpp>

void __fastcall TForm1::ShowRadioSelectDialog(String Title, TStringDynArray Options, TProc<int> OnSelectResult)
{
    // 动态创建弹窗窗体
    TForm *PopupDlg = new TForm(Application);
    PopupDlg->BorderStyle = bsNone;
    PopupDlg->Transparent = true;
    PopupDlg->Position = poScreenCenter;
    PopupDlg->Width = 320;
    PopupDlg->Height = 150 + Options.Length * 30; // 按选项数量自适应高度

    // 背景容器
    TLayout *BgLayout = new TLayout(PopupDlg);
    BgLayout->Parent = PopupDlg;
    BgLayout->Align = alClient;
    BgLayout->Fill->Color = 0xFF2C2C2C;
    BgLayout->Fill->Kind = bkSolid;
    BgLayout->Margins->Left = 10;
    BgLayout->Margins->Top = 10;
    BgLayout->Margins->Right = 10;
    BgLayout->Margins->Bottom = 10;
    BgLayout->Radius = 8;
    BgLayout->Stroke->Color = 0xFF555555;
    BgLayout->Stroke->Kind = bkSolid;

    // 标题
    TLabel *TitleLab = new TLabel(BgLayout);
    TitleLab->Parent = BgLayout;
    TitleLab->Text = Title;
    TitleLab->Align = alTop;
    TitleLab->Height = 40;
    TitleLab->TextAlign = TTextAlign::Center;
    TitleLab->Font->Size = 16;
    TitleLab->Font->Color = 0xFFFFFFFF;
    TitleLab->Margins->Bottom = 10;

    // 单选按钮组
    TRadioGroup *RadioGrp = new TRadioGroup(BgLayout);
    RadioGrp->Parent = BgLayout;
    RadioGrp->Align = alClient;
    RadioGrp->Items->AddStrings(Options);
    RadioGrp->ItemIndex = 0; // 默认选中第一个
    RadioGrp->Font->Color = 0xFFFFFFFF;
    RadioGrp->StyleLookup = "transparent";
    RadioGrp->Margins->Left = 10;
    RadioGrp->Margins->Right = 10;

    // 按钮栏
    TLayout *BtnLayout = new TLayout(BgLayout);
    BtnLayout->Parent = BgLayout;
    BtnLayout->Align = alBottom;
    BtnLayout->Height = 50;
    BtnLayout->Margins->Top = 10;

    // 取消按钮
    TButton *CancelBtn = new TButton(BtnLayout);
    CancelBtn->Parent = BtnLayout;
    CancelBtn->Text = "取消";
    CancelBtn->Align = alLeft;
    CancelBtn->Width = 140;
    CancelBtn->Margins->Left = 10;
    CancelBtn->Font->Color = 0xFFFFFFFF;
    CancelBtn->OnClick = [PopupDlg, OnSelectResult](TObject *Sender){
        if(OnSelectResult) OnSelectResult(-1); // -1代表用户点击取消
        PopupDlg->Close();
    };

    // 确认按钮
    TButton *ConfirmBtn = new TButton(BtnLayout);
    ConfirmBtn->Parent = BtnLayout;
    ConfirmBtn->Text = "确认";
    ConfirmBtn->Align = alRight;
    ConfirmBtn->Width = 140;
    ConfirmBtn->Margins->Right = 10;
    ConfirmBtn->Font->Color = 0xFFFFFFFF;
    ConfirmBtn->OnClick = [PopupDlg, RadioGrp, OnSelectResult](TObject *Sender){
        if(OnSelectResult) OnSelectResult(RadioGrp->ItemIndex);
        PopupDlg->Close();
    };

    // 显示模态弹窗
    PopupDlg->ShowModal();
}

注意:代码中的TForm1需要替换为你自己的窗体类名。

第三步:调用示例,替换你原有代码里的InputQuery逻辑

if(ApePat[1] == ApePat[2])
    ApePat[0] = ApePat[1];
else if(ApePat[1] != "" && ApePat[2] == "")
    ApePat[0] = ApePat[1];
else if(ApePat[1] == "" && ApePat[2] != "")
    ApePat[0] = ApePat[2];
else // 需要用户选择对应选项
{
    TStringDynArray Options;
    Options.set_length(2);
    Options[0] = L"Opción 1: " + ApePat[1];
    Options[1] = L"Opción 2: " + ApePat[2];
    
    ShowRadioSelectDialog(L"Elija el ApePat más adecuado", Options, [this, ApePat](int SelectIndex){
        if(SelectIndex == 0)
            ApePat[0] = ApePat[1];
        else if(SelectIndex == 1)
            ApePat[0] = ApePat[2];
        // SelectIndex为-1代表用户点击取消,可自行补充取消后的处理逻辑
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:36:04