1

我已经按照明确的文档来实现输入对话框。它工作正常。但是,现在我想在用户单击取消时忽略用户输入。以下是该文档的引用。

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

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

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,它应该是布尔值。我很困惑。

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 */;
4

1 回答 1

1

在 的最后一个参数中InputQuery(),您传入了 a TInputCloseQueryProc,但您引用的声明采用了 a TInputCloseQueryFunc

根据您链接到的文档,它的重载InputQuery()需要 aTInputCloseQueryProc返回 a void,而不是 a bool,因此会出现转换错误。bool返回 a并接受关闭回调的重载采用 aTInputCloseQueryFuncTInputCloseQueryEvent. 所以你需要Met相应地更新你的变量。

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

1:Android不支持模态对话框,所以不能使用Android上的同步版本InputQuery()


附带说明一下,C++Builder 有一个EXISTINGARRAY()帮助宏,<sysopen.h>用于传递一个静态数组,其中采用 Delphi 风格的开放数组,因此您不必手动指定数组边界,例如:

InputQuery(..., EXISTINGARRAY(Prompts), EXISTINGARRAY(Defaults), ...)
于 2019-11-27T07:26:20.467 回答