大家都知道 TComboBox AddObject 是个好东西。
最近由于数据库结构设计设计上的原因(有很多诸如字典表) 如 国家代码表 语种表 而需要TComboBox 存储两列数据 一个 代码 一个值
如 中国 chi 而这些值是数据库读取填入的 AddObject 的诟病也显露无疑 经过一天努力写了一个类
unit Mccb;
interface
uses adodb, StdCtrls;
type
Tarr = array of string;
type
TMycbb = class(Tobject)
public
procedure Additem(ADOQuery1: TADOQuery;Asql:string; ccb: TComboBox;var ss:Tarr );
end;
implementation
{ TMycbb }
procedure TMycbb.Additem(ADOQuery1: TADOQuery;Asql:string; ccb: TComboBox;var ss:Tarr);
var
i: Integer;
s: string;
begin
ccb.items.clear();
s := 'bd';
ccb.items.addobject('不定', Tobject(s));
ADOQuery1.close();
ADOQuery1.SQL.Text :=Asql;
ADOQuery1.open();
SetLength(ss, ADOQuery1.RecordCount);
for i := 0 to ADOQuery1.RecordCount - 1 do
begin
ss[i] := ADOQuery1.Fields[0].AsString;
ccb.Items.AddObject(ADOQuery1.Fields[1].AsString, TObject(ss[i]));
ADOQuery1.Next();
end;
ADOQuery1.close();
end;
end.
初始化组合框
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;
end;
end;
读取下拉值
procedure TForm1.Button7Click(Sender: TObject);
var A_Value: string;
begin
A_Value := string(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
ShowMessage(A_Value);
end;
这里需要注意的是 要再测试主窗体 定义全局变量 ss 才能保证正确 读取
var ss: Tarr;
经过 CheckMem.pas 测试 无内存泄露 方便易用 减少了很多字典表的数据库读取访问。