在讲解Android的对话框之前,我们先来看下面这个例子:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("OK1");
ShowMessage("OK2");
ShowMessage("OK3");
ShowMessage("OK4");
}
点击按钮后,四个对话框连续出现,最后一个对话框显示在最上面。并不是象Windows的程序那样,出现一个后,点击确定才会出现下一个。
这是因为Android系统不支持阻塞对话框,对话框出现后立即返回,执行后面的代码。
那么把ShowMessage换成MessageDlg函数又会怎么样呢?再看下面的例子:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n = MessageDlg(L"这是一个演示对话框", TMsgDlgType::mtConfirmation, TMsgDlgButtons()<<TMsgDlgBtn::mbYes<<TMsgDlgBtn::mbNo<<TMsgDlgBtn::mbCancel, 0);
if(n == mrYes)
ShowMessage(L"您选择了是");
else if(n == mrNo)
ShowMessage(L"您选择了否");
else if(n == mrCancel)
ShowMessage(L"您选择了取消");
}
点击按钮后,将会提示“Blocking dialogs not implemented on this platform”,该平台不支持阻塞对话框。
同样,MessageBox和InputBox函数在Android系统下都无法被执行。
如果我们需要在对话框显示之后,接受用户的选取或输入操作,再根据用户的选择运行不同的代码,应该如何做呢?这就需要给MessageDlg或InputBox传入一个类对象,该类对象继承自TInputCloseDialogProc,由用户自己实现,并在其中编写对话框显示之后的下一步执行代码。具体过程如下:
1. 以C++ Builder XE7为例,创建一个Android工程
2. 放置四个按钮,分别是信息对话框、询问对话框、输入对话框和退出。
3. 为这四个对话框分别编写四个实现类,用于执行对话框中的选择操作:
//---------------------------------------------------------------------------
class TMyDialogProc1 : public TCppInterfacedObject< TInputCloseDialogProc >
{
private:
TForm *FForm;
public:
__fastcall TMyDialogProc1(TForm * AForm) : FForm(AForm){}
void __fastcall Invoke(const System::Uitypes::TModalResult AResult)
{
if(AResult == mrOk)
{
ShowMessage(L"您点击了OK");
}
}
};
//---------------------------------------------------------------------------
class TMyDialogProc2 : public TCppInterfacedObject< TInputCloseDialogProc >
{
private:
TForm *FForm;
public:
__fastcall TMyDialogProc2(TForm * AForm) : FForm(AForm){}
void __fastcall Invoke(const System::Uitypes::TModalResult AResult)
{
if(AResult == mrYes)
{
ShowMessage(L"您选择了确定");
}
else if(AResult == mrCancel)
{
ShowMessage(L"您选择了取消");
}
}
};
//---------------------------------------------------------------------------
class TMyDialogProc3 : public TCppInterfacedObject< TInputCloseBoxProc>
{
private:
TForm *FForm;
public:
__fastcall TMyDialogProc3(TForm * AForm) : FForm(AForm){}
void __fastcall Invoke(const System::Uitypes::TModalResult AResult, const System::UnicodeString AValue)
{
if(AResult == mrOk)
{
ShowMessage(L"修改后的文字:" + AValue);
}
}
};
//---------------------------------------------------------------------------
class TMyDialogProc4 : public TCppInterfacedObject< TInputCloseDialogProc >
{
private:
TForm *FForm;
public:
__fastcall TMyDialogProc4(TForm * AForm) : FForm(AForm){}
void __fastcall Invoke(const System::Uitypes::TModalResult AResult)
{
if(AResult == mrYes)
{
ShowMessage(L"您选择了退出程序");
FForm->Close(); //关闭程序
}
else if(AResult == mrNo)
{
ShowMessage(L"您选择了取消退出");
}
}
};
//---------------------------------------------------------------------------
4. 在四个按钮的OnClick事件中,显示不同的对话框(注意最后一个参数):
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
_di_TInputCloseDialogProc ADialogProc1 = new TMyDialogProc1(this);
MessageDlg(L"您好,欢迎使用Android对话框。",
TMsgDlgType::mtInformation,
TMsgDlgButtons() << TMsgDlgBtn::mbOK,
0,
ADialogProc1
);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
_di_TInputCloseDialogProc ADialogProc2 = new TMyDialogProc2(this);
MessageDlg(L"你确定要删除该文件吗?",
TMsgDlgType::mtInformation,
TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbCancel,
0,
ADialogProc2
);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
_di_TInputCloseBoxProc ADialogProc3 = new TMyDialogProc3(this);
InputBox(L"输入",
L"请输入文字:",
L"默认文字",
ADialogProc3
);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
_di_TInputCloseDialogProc ADialogProc4 = new TMyDialogProc4(this);
MessageDlg(L"您确定要退出程序吗?",
TMsgDlgType::mtWarning,
TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo,
0,
ADialogProc4
);
}
//---------------------------------------------------------------------------
5. 程序运行效果如图所示: