【发布时间】:2019-01-23 15:36:07
【问题描述】:
这与Assigning events to a VCL control created dynamically at runtime有关。
我使用上面列出的/参考帖子来解决我在使用某些代码时遇到的问题。感谢您提供该示例。我发现它非常有用,并实现了它提供的“替代”方式,因为我无法使第一种方式工作。
我正在使用 Embarcadero 的 C++Builder 10.x。我刚刚更新到 C++Builder 10.3。此新更新现在发出警告:
[bcc32c 警告] LogitToMemo.cpp(196):函数指针和对象指针之间的隐式转换是 Microsoft 扩展
它抛出的线是:
Method.Code = &LogLevelComboBoxOnChange;
我不确定如何“解决”这个问题。
该代码支持对备忘录字段的日志记录功能,其中日志记录备忘录的页面具有TComboBox 以选择日志记录级别/详细程度。
TComboBox 在日志功能之外,因为它位于用户表单上。我希望TComboBox::OnChange 事件调用我的LogLevelComboBoxOnChange 函数,该函数根据所选的TComboBox 项目/条目调整日志记录级别。
支持这方面的代码包括。
函数声明-TComboBox::OnChange事件函数
void __fastcall LogLevelComboBoxOnChange(void *pThis, TObject *Sender);
函数声明 - 记录在提供 TMemo 记录到的字段和 TComboBox 的位置开始
int LogStartWithComboBox(TMemo *LogIt_MemoField, TComboBox *AppLogLevelComboBox, int iThreshold, AnsiString &asFieldTitles);
这是将OnChange 函数分配给用户日志记录表单上的TComboBox 对象的函数。
int LogStartWithComboBox(TMemo *LogIt_MemoField, TComboBox *AppLogLevelComboBox, int iThreshold, AnsiString &asFieldTitles)
{
static TMethod Method;
//
// Set-Up CombBox and OnChange Event
// - Save ComboBox pointer
// - Assign List of Log Levels
// - Assign/Set-Up OnChange Function
//
LogLevelComboBox = AppLogLevelComboBox;
AppLogLevelComboBox->Items->Text =
"Off\n"
"All Messages\n"
"Verbose\n"
"Trace\n"
"Informational\n"
"Warning\n"
"Error\n"
"Severe\n"
"Fatal";
AppLogLevelComboBox->ItemIndex = iThreshold + 1;
//
// Set-Up - On Change Function for "external" Log Level Combo-Box
//
Method.Data = NULL; // passed to the pThis parameter, can be whatever you want
//
// The Following line generates the warning
// [bcc32c Warning] LogitToMemo.cpp(196): implicit conversion between pointer-to-function and pointer-to-object is a Microsoft extension
//
Method.Code = &LogLevelComboBoxOnChange;
LogLevelComboBox->OnChange = reinterpret_cast<TNotifyEvent&>(Method);
return 0;
}
【问题讨论】:
-
“实现了它提供的“替代”方式,因为我无法使第一种方式工作” - 为什么不呢?您对“第一种”方式到底有什么问题?如果使用得当,这两种方式都可以正常工作。
-
您无需将
TMethod变量声明为static,因为一旦分配了OnChange事件,就无需保留它。为什么在 Unicode 环境中使用(并忽略)AnsiString?您应该改用String(或直接使用UnicodeString)。我假设您打算改用AppLogLevelComboBox->Items->Text = asFieldTitles;?
标签: c++builder vcl