最近写了一个类来实现ComboBox下拉取值已减少数据库访问次数
大家都知道AddObject可以这样填充值
var s,s1,s2: string;
begin
s := 'you ';
Combobox1.items.AddObject('你 ', Tobject(s));
s1 := 'me ';
Combobox1.items.AddObject('我 ', Tobject(s));
s2 := 'he ';
Combobox1.items.AddObject('他 ', Tobject(s));
但当 值从数据库读取或变量组合赋值 就会造成 读取Combobox1值时 乱码或内存异常 所以自己写了一个类 采用字符串数组来赋值


1 unit Mccb;
2
3 interface
4
5 uses adodb, StdCtrls;
6 type
7 Tarr = array of string; //自定义类型 用于赋值
8 type
9
10 TMycbb = class(Tobject)
11
12 public
13
14 procedure Additem(ADOQuery1: TADOQuery;Asql:string; ccb: TComboBox;var ss:Tarr ); //ss必须是传地址参数
15
16 end;
17
18 implementation
19
20 { TMycbb }
21
22 procedure TMycbb.Additem(ADOQuery1: TADOQuery;Asql:string; ccb: TComboBox;var ss:Tarr);
23 var
24 i: Integer;
25 s: string;
26 begin
27 ccb.items.clear();
28 s := 'bd';
29 ccb.items.addobject('不定', Tobject(s));
30 ADOQuery1.close();
31 ADOQuery1.SQL.Text :=Asql;
32 ADOQuery1.open();
33
34 SetLength(ss, ADOQuery1.RecordCount);
35 for i := 0 to ADOQuery1.RecordCount - 1 do
36 begin
37
38
39 ss[i] := ADOQuery1.Fields[0].AsString;
40 ccb.Items.AddObject(ADOQuery1.Fields[1].AsString, TObject(ss[i]));
41 ADOQuery1.Next();
42 end;
43 ADOQuery1.close();
44 end;
45
46 end.
测试主窗体赋值操作


var ss: Tarr; //必须是全局变量 需引用uses MyCcb
..........
procedure TForm1.Button9Click(Sender: TObject);
var dd: TMycbb;
sqls: string;
begin
sqls := 'select lang_code,lang_name from language_code';
dd := TMycbb.Create;
try
dd.Additem(ADOQuery1, sqls, ComboBox1, ss);
finally
dd.Free;
ComboBox1.ItemIndex :=0;
end;
end;
读取操作
procedure TForm1.Button7Click(Sender: TObject);
var A_Value: string;
begin
A_Value := string(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
ShowMessage(A_Value);
end;
这样实现了从数据库读取字典表 添加commobox了 经测试 无内存泄露