Chk := True;
for i:= 0 to Level-1 do begin
for j:= 1 to 2 do begin
if DataSet.FindField(Fields[i][j])=nil then begin
ShowMessage('Fields数组中的字段名 '+Fields[i][j]+' 没有包含在数据集中');
Chk := False; Break;
end;
end;
if Chk = False then Exit; // 退出
end;
setLength( KeyFieldValue, Level);
for i:= 0 to Level-1 do //清空关键字值
KeyFieldValue[i] := '';
Tree_Items := TStringList.Create;
try
Tree_Items.clear;
TreeList.Clear;
DataSet.First;
while Not DataSet.Eof do begin
for i:= 0 to Level-1 do begin
// 第i级节点值KeyFieldValue[i]与DataSet中的第i个关键字值进行比较
if (DataSet.FieldByName(Fields[i][1]).AsString<>'')
And (KeyFieldValue[i]<>DataSet.FieldByName(Fields[i][1]).AsString) then begin
StrIndent := ''; // 生成缩进字符串,第几级就是几个#9
for j:= 0 to i-1 do
StrIndent := StrIndent + #9;
// 新的第i层节点开始
KeyFieldValue[i] := DataSet.FieldByName(Fields[i][1]).AsString;
// 显示的节点信息
Tree_Items.Add(StrIndent+DataSet.FieldByName(Fields[i][2]).AsString);
// 节点的关联信息 -> 关键字
TreeList.Add(KeyFieldValue[i]);
for j:=i+1 to Level-1 do KeyFieldValue[j]:='';
end
end;
DataSet.Next;
end;
Tree_Items.SaveToFile('c:\$.txt'); // 临时文件
TreeView.LoadFromFile('c:\$.txt');
finally
Tree_Items.free;
DataSet.Active:=False;
end;
end;
5) 动态填充TComboBox对象Items属性列表值的CreateItems函数。因本系统中存在大量的外键,而外键值必须在主表中存在,故编制该函数使用户只能从主键值中选择使用,从而避免用户输入非法数据。填充时若有两个字段,则两个字段值之间使用空格分隔。
CreateItems函数中,DataSet为要填充数据的数据集对象;Items为要填充的列表对象;KeyFields为要使用什么字段数据填充;AddBlankItem指示是否需要在第一行添加一个“请选择”项目,默认为不需要;WantClose指示用于填充的数据集使用后是否需要关闭,默认为关闭;WantSearch指示是否需要返回一个查询值在列表中的位置,仅用于与登录用户ID比较,默认为否。
Function CreateItems(DataSet: TDataSet; Items: TStrings; KeyFields: String;
AddBlankItem :Boolean=False; WantClose: Boolean=True; WantSearch: Boolean=False) : Integer;
var
iPos, iCount : Integer;
begin // KeyFields中的2个字段名以;分隔
Result := 0;
iPos := Pos(';', KeyFields);
Items.Clear; // 清空列表
iCount := 0;
if AddBlankItem then begin
Items.Add( strEmptySelect ); // 添加一个没有选择行
iCount := 1;
end;
with DMServerDB do begin
DataSet.First;
while not DataSet.Eof do begin
if iPos=0 then // 只有一个字段
Items.Add(DataSet.FieldByName(KeyFields).AsString)
else begin
strTemp:=DataSet.FieldByName(Copy(KeyFields,1,iPos-1)).AsString;
Items.Add(strTemp+' '+DataSet.FieldValues[Copy(KeyFields,iPos+1,Length(KeyFields))]);
if (WantSearch) And (UserType=2) then
if strTemp=ADODataSetUser.FieldValues[ Copy(KeyFields,1,iPos-1) ] then
Result := iCount;
end;
Inc(iCount);
DataSet.Next;
end;
if WantClose then DataSet.Close; // 关闭数据集
end;
|