将字符串传递给DBLookupComboBox

时间:2014-10-22 21:52:43

标签: delphi delphi-xe6

在将字符串传递给Delphi XE6中的DBLookupComboBox时,我收到了访问冲突。 BusName是一个字符串,其中包含来自订单表单的公司名称。我是否使用了正确的控件?

这里有一些关于DBLookupComboBox设置的信息。

KeyField被称为CustID ListField被称为CompanyName ListSource被称为CustNames

CustNameDBLCBox.Field.AsString:= OrdersForm.BusName;

不确定我错过了什么?

1 个答案:

答案 0 :(得分:0)

DBLookupCombobox可用于两个不同的目的 通常会分配DatasourceDatafield来使用它来更改/显示一个数据字段的字段和来自lookupdataset的数据。
DBLookupCombobox中的每个手动更改都会将Datafield设置为KeyField的值,并且通过Datasource绑定的数据集中的任何更改都将使用ListSource定义的数据集中KeyField找到的Listfield值更改显示的值。

DBLookupCombobox的另一个用法是使用它而不绑定Datasource / Datafield只是为了选择一个Value并使用Keyvalue或Text进行进一步的工作。

<强> TL; DR
以下是导致访问冲突的两个原因:

  1. OrdersForm不再分配(可能在关闭时释放)
  2. 您没有分配数据源/数据字段,但您正在尝试设置 CustNameDBLCBox.Field.AsString := <sometext>会导致您所描述的访问冲突,因为未指定字段:property Field: TField read FDataField;
    如果您已经分配了数据源/数据字段,则可能会出现错误,指向数据字段的无效值,如Integer&lt;&gt;字符串,但不是访问冲突。
  3. 要更改显示的值,您必须更改KeyValue:

      if CustNameDBLCBox.ListSource.DataSet.Locate(CustNameDBLCBox.ListField, OrdersForm.BusName ,[]) then
          CustNameDBLCBox.KeyValue := CustNameDBLCBox.ListSource.DataSet.FieldByName(CustNameDBLCBox.KeyField).Value;