奇怪的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)的时候,却又能显示选项值。

请各位帮帮忙解答一下,谢谢。
...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用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,真的是太奇怪了,搞不懂为什么会这样?请高人指点呀。

源码链接: https://pan.quark.cn/s/7b9e1590db2e 在本计划中,我们聚焦于一个基于数字逻辑的药片装瓶系统的构建,这构成了北京邮电大学(北邮)在小学期内向学生提供的一次课程设计课题。该系统致力于模拟实际药品包装的操作流程,借助电子操控和自动化技术达成药片的高效且精准的装瓶目标。以下是对该系统设计所涉及的关键知识领域的详尽阐述: 1. **数字逻辑**:数字逻辑是电子工程领域的核心学科,主要探究如何运用二进制数字进行信息的表征与处理。在此项目中,数字逻辑用于构建和实现系统的控制机制,诸如计数器、编码器、解码器、触发器等,旨在保障药片装瓶过程的精确调控。 2. **硬件电路构建**:系统可能整合微控制器、传感器、执行机构等硬件单元。例如,微控制器作为系统的心脏,负责接收输入信号,处理数据,并指挥执行机构执行药片装填。传感器负责监测药片的数量和瓶装进度,而执行机构如电机则负责实际完成装瓶动作。 3. **计数器**:在药片装瓶的操作过程中,计数器用于追踪已装入瓶子的药片总数,确保达到预设的剂量标准。这可能需要设计同步计数器或异步计数器,以实现精确计数并触发装瓶操作。 4. **编码与解码**:编码器将特定的信息(例如药片种类或剂量)转化为二进制编码,便于硬件设备进行处理;解码器则将这些编码解读为可执行的操作,如切换装瓶路径或启动封盖流程。 5. **触发器**:在系统中,触发器可用于在特定条件达成时启动或中止某个操作,例如当瓶子达到满载时关闭装填机制。 6. **传感器技术**:可能包含重量传感器、光电传感器或机械触碰开关,用于识别瓶子的存在、位置以及药片的数量。这些传感器的精确度直接关联到整个系统的性能水平。 7. **控制算法**...

1,178

社区成员

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

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