combobox是开发当中经常用到的控件,其实他也能很好的绑定数据,做到逻辑和表现分离。我们使用COMBOBOX,一般是从数据库读取记录集然后循环添加到combobox的item当中,或者直接返回Tstrings给items,这样我么在界面操作COMBOBOX只能得到顺序的索引或者选择的值,但对于类似(键,值)这样的结构,要一次性绑定两列就不好做了.也有人使用addobject方法绑定对象列表,但是都有些指针问题不好解决,取出的值是乱码。
其实我的方法也是使用addobject方法绑定对象列表,而我使用的强制转型的方法:(delphi7 下测试通过)
代码如下:
首先定义自己的业务模型对象,其实就是数据表的映射
我的业务对象是这样的,很简单,只有两个数据域,没有方法:
TUserModel = class(TObject)
private
FUser_Id: integer;
FUser_Name: string;
public
property User_Id: integer read FUser_Id write FUser_id;
property User_Name: string read FUser_Name write FUser_Name;
end;
下来,假设我有个数据访问层对象TUserDAL,实现了方法: getUserList(sql: widestring): Tstrings;
很明显这个方法读取数据库记录集,转换成一个对象集返回,标准的三层结构:),下面是我的实现:function TUserDAL.GetUserList(sql: widestring): TStrings;
var
aUser: TUserModel;
List: TStrings;
TempDataSet: TDataSet;
begin
List:= TStringList.Create;
//这句调用数据操作工具对象 FSQLHelper 的 GetDataSet 方法,读取数据库记录返回 TDataSet(不了解的可学习下ms petshop);
TempDataSet:= FSQLHelper.GetDataSet(SQL);
while not TempDataSet.Eof do
begin
//这里每个循环创建一个 UserModel 对象,然后加载到 List 中
aUser:= TUserModel.Create;
aUser.User_Id:= TempDataSet.fieldbyname('User_id').AsInteger;
aUser.User_Name:= TempDataSet.fieldbyname('User_Name').AsString;
List.AddObject(TempDataSet.fieldbyname('User_Name').AsString, aUser);
TempDataSet.Next;
end;
//记得清理临时对象,别留下后遗症
freeandnil(TempDataSet);
result:= List;
end;好了,数据获取工作完成,下来我们看表示层怎么做。在窗体上放一个combobox控件,外加一个button,在button中onclick写下面的代码:procedure TForm1.Button1Click(Sender: TObject);
var
UserDAL: TUserDAL;
begin
//这不就把对象集取到控件里来了嘛;
UserDAL:= TUserDAL.Create;
self.ComboBox1.Items:= UserDAL.GetUserList;
end;下来测试一下看能不能在combobox1中同时取得 user_id和user_name, 在combobox1的onchange写代码:procedure TForm1.ComboBox1Change(Sender: TObject);
begin
//这句话有点长,分解开来看看
//ComboBox1.Items.Objects[ComboBox1.ItemIndex] 当前选定项对应的对象, 其实就是在数据访问层次
//里逐个加入的 UserModel;
// as TUserModel 强制转型为 TUserModel,因为combobox的object集合是 TObject 类型的
// inttostr 这个不用说了吧?
showmessage(inttostr((ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TUserModel).User_id));
showmessage((ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TUserModel).User_Name);
end;哈哈,成功了吧?什么?这样有什么用?用处大了去啦,一能实现同数据库表的绑定,二是MVC模式, 三是省得回头再去数据库里取键值了啊....
其实我的方法也是使用addobject方法绑定对象列表,而我使用的强制转型的方法:(delphi7 下测试通过)
代码如下:
首先定义自己的业务模型对象,其实就是数据表的映射
我的业务对象是这样的,很简单,只有两个数据域,没有方法:
TUserModel = class(TObject)
private
FUser_Id: integer;
FUser_Name: string;
public
property User_Id: integer read FUser_Id write FUser_id;
property User_Name: string read FUser_Name write FUser_Name;
end;
下来,假设我有个数据访问层对象TUserDAL,实现了方法: getUserList(sql: widestring): Tstrings;
很明显这个方法读取数据库记录集,转换成一个对象集返回,标准的三层结构:),下面是我的实现:function TUserDAL.GetUserList(sql: widestring): TStrings;
var
aUser: TUserModel;
List: TStrings;
TempDataSet: TDataSet;
begin
List:= TStringList.Create;
//这句调用数据操作工具对象 FSQLHelper 的 GetDataSet 方法,读取数据库记录返回 TDataSet(不了解的可学习下ms petshop);
TempDataSet:= FSQLHelper.GetDataSet(SQL);
while not TempDataSet.Eof do
begin
//这里每个循环创建一个 UserModel 对象,然后加载到 List 中
aUser:= TUserModel.Create;
aUser.User_Id:= TempDataSet.fieldbyname('User_id').AsInteger;
aUser.User_Name:= TempDataSet.fieldbyname('User_Name').AsString;
List.AddObject(TempDataSet.fieldbyname('User_Name').AsString, aUser);
TempDataSet.Next;
end;
//记得清理临时对象,别留下后遗症
freeandnil(TempDataSet);
result:= List;
end;好了,数据获取工作完成,下来我们看表示层怎么做。在窗体上放一个combobox控件,外加一个button,在button中onclick写下面的代码:procedure TForm1.Button1Click(Sender: TObject);
var
UserDAL: TUserDAL;
begin
//这不就把对象集取到控件里来了嘛;
UserDAL:= TUserDAL.Create;
self.ComboBox1.Items:= UserDAL.GetUserList;
end;下来测试一下看能不能在combobox1中同时取得 user_id和user_name, 在combobox1的onchange写代码:procedure TForm1.ComboBox1Change(Sender: TObject);
begin
//这句话有点长,分解开来看看
//ComboBox1.Items.Objects[ComboBox1.ItemIndex] 当前选定项对应的对象, 其实就是在数据访问层次
//里逐个加入的 UserModel;
// as TUserModel 强制转型为 TUserModel,因为combobox的object集合是 TObject 类型的
// inttostr 这个不用说了吧?
showmessage(inttostr((ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TUserModel).User_id));
showmessage((ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TUserModel).User_Name);
end;哈哈,成功了吧?什么?这样有什么用?用处大了去啦,一能实现同数据库表的绑定,二是MVC模式, 三是省得回头再去数据库里取键值了啊....
有时数据库,编号-->值, 要放入ComboBox1 中,
s:='1001';
ComboBox1.Items.AddObject('员工A',TObject(( s))); ShowMessage( String( ComboBox1.Items.Objects[0]));
s:='1003';
ShowMessage( String( ComboBox1.Items.Objects[0])); ComboBox1.Items.AddObject('员工X',TObject(( s)));
ShowMessage( String( ComboBox1.Items.Objects[1]));
这儿有个问题要确认: 把 S 转成 TObject 后,AddObject 方法是复制了这个对象,还是引用了指针!!!!!!
我感觉是复制过去的, 而不是 指针引用.