奇怪的TDBLookupComboBox->Text属性

scottlai 2008-06-16 03:13:18
本人正在开发一个数据库相关的程序,用到TDBLookupComboBox。我写了一个通用的检验类用于验证用户输入的信息是否符合规则,这个类用到RTTI的GetStrProp()来读取指定控件的属性值。奇怪的是,在读TDBLookupComboBox的Text属性时,返回的是空值,我再用单步调试时发现在获取PPropInfo的时候就已经返回NULL,也就是PropInfo = GetPropInfo((TTypeInfo *)Control->ClassInfo(), "Text")找不到Text属性。我试着在一个Button里面直接调用ShowMessage(cbWhs->Text)的时候,却又能显示选项值。

请各位帮帮忙解答一下,谢谢。
...全文
114 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
猛禽 2008-06-17
  • 打赏
  • 举报
回复
汗,看了半天VCL源码,结果在帮助中发现Text属性是public的,当然取不到啦。
RTTI只能操作published的属性。
scottlai 2008-06-17
  • 打赏
  • 举报
回复
快沉了,上来顶一下,希望有专家能帮帮忙(ccrun,猛禽等等~)。
scottlai 2008-06-17
  • 打赏
  • 举报
回复
那个问题是解决不了的,结帖~!
scottlai 2008-06-17
  • 打赏
  • 举报
回复
呵呵,自己发现了问题所在:
typedef AnsiString (__closure *RegFunc)();
应该要写成:
typedef AnsiString __fastcall (__closure *RegFunc)();

天呀,就一个__fastcall关键字就会引起错误,看来不能忽视小处。

虽然现在能够解决燃眉之急,但还是要解决TDBLookupComboBox->Text访问的问题,分不够我还可以再加,希望大家能多指导一下。
scottlai 2008-06-17
  • 打赏
  • 举报
回复
啊,那咋办好呢?我现在是用曲线救国的办法,在验证类添加了一个接受函数传值的验证方式,而那个函数就直接调用cbWhs->Text这样来返回内容。但是这样做居然返回不了。附代码:
class TXValidateRuleItem : public TPersistent
{
private:
....

protected:

public:
typedef AnsiString (__closure *RegFunc)();
....
//函数接口
RegFunc CustomRegFunc;
__fastcall TXValidateRuleItem(RegFunc FuncName, AnsiString Message, TXValidateRuleType Type, AnsiString Format);
__published:

};

//自定函数式校验类型初始化
__fastcall TXValidateRuleItem::TXValidateRuleItem(RegFunc FuncName,
AnsiString Message, TXValidateRuleType Type, AnsiString Format)
: TPersistent()
{
//TODO: Add your source code here
this->_bindType = btFunction;
if (FuncName == NULL) throw "TXValidateRuleItem ERROR: NULL function set!";
this->CustomRegFunc = FuncName;
this->Message = Message;
this->Type = Type;
this->Format = Format;
}


AnsiString __fastcall TXValidateRuleItem::GetvalValue()
{
//TODO: Add your source code here
AnsiString ret = "";
switch(_bindType)
{
...
case btFunction:
ret = CustomRegFunc();
default:
break;
}
return ret;
}

我在TPurchaseForm里面调用:
void __fastcall TPovForm::FormCreate(TObject *Sender)
{
TVoucherForm::FormCreate(this);

sbCust->SB_Type = FS_VENDOR;
sbCust->SB_ResultField = "cust_id";
sbCust->SB_DataField = "cust_id";

//控制器数据集绑定
......
//绑定网格
......
//Controller->SetGridDataSource((gdsDetail);
//控制器与界面数据感知控件绑定
......
//设置表单校验规则
Controller->AddRule((TXValidateRuleItem::RegFunc)&GetWhsName, "请选择一个进货仓库", rtRequired, NULL);

//控制器初始化
Controller->InitialController();

//执行校验
Controller->ValidateCheck();
}

AnsiString __fastcall TPovForm::GetWhsName()
{
//TODO: Add your source code here
return PovForm->cbWhs->Text;
}

我在GetWhsName()设置断点然后观察cbWhs->Text,是有值输出的,再按F8跳回GetvalValue()内,发现ret居然是NULL,真的是太奇怪了,搞不懂为什么会这样?请高人指点呀。

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧