关于ComboBox和数据库的问题。敬请赐教。(200分)

  • 主题发起人 主题发起人 大胃王
  • 开始时间 开始时间

大胃王

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是来由是:
我想使用一个ComboBox控件,
在ComboBox中显示的可选项(ComboBox.Items.Strings)来自某个表的一个字段
(比如称之为field_caption)。
同时,我希望通过ComboBox获取而记录的数据来自表的另一个字段
(比如称之为field_id)。
filed_caption是应该赋值给ComboBox.Items.Strings的,这大概没问题。
但如何获取而记录field_id数据呢?

我目前的考虑:
ComboBox中的Objects属性是可以利用的。
但是,如何把TField对象赋值给Objects呢?

遇到的问题:
有网友(抱歉,忘记名字了)建议使用ComboBox.AddObject方法。

但是:

方法一
while not ADODataSet.Eof do
begin
ComboBox.AddObject(ADODataSet.FieldByName(field_caption).AsString,ADODataSet.FieldByName(field_id));
ADODataSet.Next;
end
这样的话,
实际上,
ADODataSet每次Next以后,由FieldByName返回的TField对象包含的值变化了,
但对象的内存位置并没有变,
也就是说,最终,所有的Objects对象将指向同一地址,
返回的是ADODataSet中最后一条记录的字段值。

方法二
type
PField = ^TField;
var
ptrTemp : PField;
......
while not ADODataSet.Eof do
begin
ptrTemp := new(TField);
ptrTemp^ := ADODataSet.FieldByName(field_id);
ComboBox.AddObject(ADODataSet.FieldByName(field_caption).AsString,ptrTemp^);
ADODataSet.Next;
end
其结果也是一样的,
好像new(TField)只是new出一个32位的指针来,
而没有生成新的对象。

方法三
把上例中的相应语句改成:
ptrTemp := new(TField);
ptrTemp^ := TField.Creat(self);
ptrTemp^.Assign(ADODataSet.FieldByName(field_id));
则发生异常:EDatabaseError--Cannot access field

求救:
到此为止,没办法了,就这么点本事。
我该怎么解决这个问题,
敬请指教。

本来问过一次的,已经有一位网友回答了,但好像没有完全解决问题。
换了服务器,好像问题没了,只好再问一次了。
大富翁这么厉害的地方,可千万不能让我失望啊!
 
while not ADODataSet.Eof do
begin
ComboBox.AddObject(ADODataSet.FieldByName(field_caption).AsString,ADODataSet.FieldByName(field_id));
ADODataSet.Next;
end
{***************************************************}

if (在ComboBox的列表中显示某字段内容) and (选中ComboBox.items[ComboBox.itemindex]时得到对应记录的主键) then
begin
{ ****** AddObject(string,pointer) ****** }
{ 建立时 }
with AdoDataSet do
begin
first;
while not eof do
begin
ComboBox.items.AddObject(FieldByName('field_caption').asString,
Pointer(FieldByName('field_id').asInteger);
next;
end

{ 取出时 }
field_id :=Integer(ComboBox.items.Object[ComboBox.ItemIndex]);

end;
 
谢谢,zhang.w真是帮了大忙。
我试了试,通过!

但是,为什么这样就可以了?能不能给我讲一讲?
或真推荐一下,相关资料在哪里?
那就更加感激不尽了!!

太棒了,dfw真是个好地方。
 
后退
顶部