2,497
社区成员
发帖
与我相关
我的任务
分享
//这个是根据字典表动态建立dbgrid列的过程,可以写在form.show中,也可以写在其他你认为合适的地方
procedure TEmp_F.qryEmpAfterOpen(DataSet: TDataSet);
var
I ,J : Integer;
keyTb,keyCol : string;
Klist : string;
begin
//动态添加显示列
qryDict.Close;
qryDict.SQL.Text :=
'Select ColName,ColChiName,Wide,Lock,' +
'keyTb=ISNULL(keyTb,''''),keyCol=ISNULL(keyCol,'''') from DataDict ' +
'Where TableName=''Employee'' and Show=1 order by Col_Order,DictBH';
qryDict.Open;
qryDict.First;
dbgEmp.Columns.Clear;
FOR I := 0 TO qryDict.RecordCount - 1 DO
BEGIN
dbgEmp.Columns.Add;
dbgEmp.Columns[I].FieldName := qryDict.FieldByName('ColName').Value;
dbgEmp.Columns[I].Title.Caption := qryDict.FieldByName('ColChiName').Value;
dbgEmp.Columns[I].Width := qryDict.FieldByName('Wide').Value;
dbgEmp.Columns[I].ReadOnly := qryDict.FieldByName('Lock').Value;
dbgEmp.Columns[I].Title.TitleButton := True;
// dbgEmp.Columns[I].STFilter.ListSource := dsEmp;
// dbgEmp.Columns[I].STFilter.ListField := dbgEmp.Columns[I].FieldName;
keyTb := qryDict.FieldByName('keyTb').Value;
keyCol := qryDict.FieldByName('keyCol').Value;
if (keyTb > '') and (keyCol > '') then
begin
qryList.Close;
qryList.SQL.Text := 'Select ' + keyCol + ' From ' + keyTb;
qryList.Open;
qryList.First;
qryList.First;
while not qryList.Eof do
begin
Klist := '';
for J := 0 to qryList.FieldCount - 1 do
begin
Klist := Klist + ', ' + qryList.Fields[J].Value;
end;
Klist := RightStr(Klist,Length(Klist)-3);
dbgEmp.Columns[I].PickList.Add(Klist);
qryList.Next;
end;
end;
qryDict.NEXT;
end;
//使用中,当列序,列宽,等有变化,分别触发以下两个事件:
procedure TEmp_F.dbgEmpColumnMoved(Sender: TObject; FromIndex,
ToIndex: Integer);
begin
ColInfo := True;
btnSave.Enabled := True;
end;
procedure TEmp_F.dbgEmpColWidthsChanged(Sender: TObject);
begin
ColInfo := True;
btnSave.Enabled := True;
end;
//其中ColInfo 为一个变量,用来标识列宽,列序有没有动过。
//最后在保存按钮事件当中这样子写,注意后面那一段,是用来更新列序,列宽到字典表的。
procedure TEmp_F.btnSaveClick(Sender: TObject);
var
I,W : Integer;
ColName : string;
begin
IF TableData then //如果是修改表内容
begin
qryEMP.UpdateBatch(arAll);
btnSave.Enabled:=False;
TableData := False;
end;
IF ColInfo then //如果为列宽度变化 或者为列顺序变化
begin
for I := 0 to dbgEmp.Columns.Count-1 do
begin
W := dbgEmp.Columns[I].Width;
ColName := dbgEmp.Columns[I].FieldName;
qryDict.Close;
qryDict.SQL.Text:=
' UPDATE DataDict SET Wide=' + IntToStr(W) + ',' + //更新列宽度
' Col_Order = ' + IntToStr(I) + //更新列顺序
' WHERE TableName=''Employee'' AND ColName=''' + ColName + '''';
qryDict.ExecSQL;
end;
ColInfo := False;
btnSave.Enabled:=False;
end;
end;