为什么InputQuery不返回布尔值?

时间:2019-11-26 00:55:00

标签: firemonkey c++builder c++builder-10.3-rio

我遵循clear documentation来实现输入对话框。工作正常。但是,现在我想忽略用户单击“取消”的输入。以下是该文档的引用。

”如果用户单击确定按钮,则 InputQuery 返回True;否则 InputQuery 返回False。 ”

因此,我尝试了以下代码,当我在Win32和Android上运行E2034 Cannot convert void to bool时,遇到的错误是bccaarm error 1711 value of type void is not contextually convertible to bool

if (InputQuery(caption, Prompts, sizeof(Prompts)/sizeof(Prompts[0]) - 1, Defaults, sizeof(Defaults)/sizeof(Defaults[0]) - 1, (TInputCloseQueryProc *)Met)){
   // clicked OK
} else {
   // clicked cancel
}

我如何测试OKCancel被点击了?以下是InputQuery的声明,应为bool。我很困惑。

extern DELPHI_PACKAGE bool __fastcall InputQuery _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") (const System::UnicodeString ACaption, const System::UnicodeString *APrompts, const int APrompts_High, System::UnicodeString *AValues, const int AValues_High, const _di_TInputCloseQueryFunc ACloseQueryFunc = _di_TInputCloseQueryFunc())/* overload */;

1 个答案:

答案 0 :(得分:1)

InputQuery()的最后一个参数中,您传入的是TInputCloseQueryProc,但是引用的声明改为使用TInputCloseQueryFunc

根据您链接的documentationInputQuery()的重载占用TInputCloseQueryProc会返回void,而不是bool,因此转换错误。返回bool并接受关闭回调的重载采用TInputCloseQueryFuncTInputCloseQueryEvent。因此,您需要相应地更新Met变量。

话虽这么说,Fmx::Dialogs::InputQuery()函数/过程已被弃用,正如您引用的声明中清楚显示的那样。如弃用消息所述,您应该使用Fmx::DialogService的{​​{1}}版本。根据需要 1 使用TDialogServiceSync::InputQuery()TDialogServiceAsync::InputQuery()

1:Android不支持模式对话框,因此您无法在Android上使用InputQuery()同步版本。


另一方面,C ++ Builder在InputQuery()中有一个EXISTINGARRAY()帮助宏,用于传递静态数组,其中是Delphi样式的开放数组< / em>,因此您不必手动指定数组边界,例如:

<sysopen.h>