📄 ufundx.~pas
字号:
{*******************************************************************************
* dx 控件在专用函数 已经默认的 dx 控件已经两个了
* dxTreeList dxDBGrid 实在是要用这些控件才能解决问题
*ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 它山之石可以攻玉 20030411 符林
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 退票没有进行 车站验证 ---20031129
*******************************************************************************}
unit uFunDx;
interface
uses SysUtils,Forms,uFunSys,uDataOA,Db,MSFlexGridLib_TLB,CELLLib_TLB,
Dialogs,IniFiles,Graphics,ComCtrls,uPrintDLLInterface,StdCtrls,Controls,
dxCntner, dxTL, dxDBCtrl, dxDBGrid;
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
var
I:integer;
//Cell32:TCell;//打印 加快打印速度 有可能释放不干净 注意
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PFilldxTreeFirstLevel(dxColumnName:array of TdxTreeListColumn;
saFeilds:array of String;
DBQName:TDataSet;dxTree:TdxTreeList);
Procedure PFilldxTreeSecondLevel(dxColumnName:array of TdxTreeListColumn;
saFeilds:array of String;
DBQName:TDataSet;CurNode:TdxTreeListNode);
Procedure PClearDxTreeItem(dxTree:TdxTreeList);
Procedure PReadAndSaveFormALL(FrmName:TForm;bRead:Boolean);
Procedure PSetGroupCount(dxDBGrid1:TdxDBGrid);
Procedure PSetGroupCountA(dxDBGrid1:TdxDBGrid);
Procedure PPrintDxDBGrid(dxDBGrid1:TdxDBGrid;sTile:String;saTile:array of String;
iPageRows: integer; //每页打印的行数
iFangXian:integer; //打印方向 1--45,0--25
sSaveID:String;
bPrintNow:boolean);
Procedure PHanHuaDxDBGridGroupPanel(dxDBGridX:TdxDBGrid);
Procedure PPrintFromCell32(saTxt:array of String;iFlag,iSitCount:Integer;sSitNOs:String);
function FPrintCell32(CellX:TCell):Boolean;
Procedure PSetDxDBGridReadOnly(dxDBGrid1:TdxDBGrid);
Procedure PSetFormDxDBGridReadOnly(FrmX:TForm);
Procedure PExportDxGridToExcel(dxDBGridX:TdxDBGrid);
Procedure PInitOneRecordCtr(saField:array of String;
aCtrX:array of TControl;
DataSetX:TDataSet);
Procedure PFillOneRecordCtr(saField:array of String;
aCtrX:array of TControl;
DataSetX:TDataSet);
Procedure POneRecordCtrToDBSoure(saField:array of String;
aCtrX:array of TWinControl;
DataSetX:TDataSet);
Procedure PSetFocusUpAndDown(bDown:Boolean;EdtCtrl:TWincontrol;FrmX:TForm);
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
implementation
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
o 填充dxTree的第一级节点 一般dxTree 只能有两级 就足够了
0 dxColumnName 必须要这样 不然拖动后就没有办法对应顺序
o 树的填充 分级读入 很好 效率 多用户的同时刷新问题 欧德荣
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PFilldxTreeFirstLevel(dxColumnName:array of TdxTreeListColumn;
saFeilds:array of String;
DBQName:TDataSet;dxTree:TdxTreeList);
var
I,iColNo:Integer;
TempNode:TdxTreeListNode;
Str:String;
begin
{*************打开表****************}
if High(dxColumnName) <> High(saFeilds) then begin
DlgWarningA('PFilldxTreeFirstLevel=High(dxColumnName) <> High(saFeilds)');
Exit;
end;
if DBQName.Active = False then DBQName.Open;
PClearDxTreeItem(dxTree);
DBQName.First;
while not DBQName.Eof do begin
TempNode:=dxTree.Add;
for I:=0 to High(saFeilds) do begin
iColNo:=dxColumnName[I].Index;
Str:=Trim(DBQName.FieldByName(saFeilds[I]).AsString);
TempNode.Strings[iColNo]:=Str;
{** 第一级的图标*** }
TempNode.ImageIndex:=0;
TempNode.SelectedIndex:=1;
end;
{** 够造一个虚假的下级节点 第一列的直 是 0************ }
TempNode:=TempNode.AddChild;
TempNode.ImageIndex:=2;
TempNode.SelectedIndex:=2;
TempNode.Strings[dxColumnName[0].Index]:='000';
DBQName.Next;
end;
end;
{ooooooooooooooooooooo填充第二级别的节点ooooooooooooooooooooooooooooooooooooooo}
Procedure PFilldxTreeSecondLevel(dxColumnName:array of TdxTreeListColumn;
saFeilds:array of String;
DBQName:TDataSet;CurNode:TdxTreeListNode);
var
I,iColNo:Integer;
TempNode:TdxTreeListNode;
Str:String;
begin
{*************打开表****************}
if High(dxColumnName) <> High(saFeilds) then begin
DlgWarningA('PFilldxTreeFirstLevel=High(dxColumnName) <> High(saFeilds)');
Exit;
end;
if DBQName.Active = False then DBQName.Open;
CurNode.DeleteChildren;
DBQName.First;
while not DBQName.Eof do begin
TempNode:=CurNode.AddChild;
for I:=0 to High(saFeilds) do begin
iColNo:=dxColumnName[I].Index;
Str:=Trim(DBQName.FieldByName(saFeilds[I]).AsString);
TempNode.Strings[iColNo]:=Str;
{** 第一级的图标*** }
TempNode.ImageIndex:=0;
TempNode.SelectedIndex:=1;
end;
DBQName.Next;
end;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
o 清空 树
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PClearDxTreeItem(dxTree:TdxTreeList);
begin
while (True) do begin
if dxTree.LastNode = nil then Exit;
dxTree.LastNode.Free;
end;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
o 保存窗体培植 主要保存 dx控件
o True is Read False is Save
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PReadAndSaveFormALL(FrmName:TForm;bRead:Boolean);
var
I,iCount,J:Integer;
FormINI:TIniFile;
Str,sQY,sClr,sFLdx:String;
begin
if (not bSYSReadConfigFromAndGridIni) and ( bRead ) then begin
bSYSReadConfigFromAndGridIni:=True;
Exit;
end;//20031220
PSaveReadFormINI(FrmName,nil,bRead);
FormIni:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'FormINISave.Ini');
Str:=FrmName.Caption+FrmName.Name;
sFLdx:=ExtractFilePath(Application.ExeName)+'dxConfig.ini';
iCount:=FrmName.ComponentCount;
for I:=0 to iCount-1 do begin
if FrmName.Components[I] is TdxTreeList then begin
if bRead then begin
TdxTreeList(FrmName.Components[I]).LoadFromIniFile(sFLdx);
sQY:=TdxTreeList(FrmName.Components[I]).Name;
sClr:=FormIni.ReadString(Str,sQY,'$00F0E0FE');
TdxTreeList(FrmName.Components[I]).Color:=StringToColor(sClr);
end
else begin
TdxTreeList(FrmName.Components[I]).SaveToIniFile(sFLdx);
sQY:=TdxTreeList(FrmName.Components[I]).Name;
sClr:=ColorToString(TdxTreeList(FrmName.Components[I]).Color);
FormIni.WriteString(Str,sQY,sClr);
end;
end;
if FrmName.Components[I] is TdxDBGrid then begin
if bRead then TdxDBGrid(FrmName.Components[I]).LoadFromIniFile(sFLdx)
else TdxDBGrid(FrmName.Components[I]).SaveToIniFile(sFLdx);
end;
if FrmName.Components[I] is TFrame then begin
for J:=0 to TFrame(FrmName.Components[I]).ControlCount-1 do begin
if TFrame(FrmName.Components[I]).Controls[J] is TMSFlexGrid then
PSaveReadFormINI(nil,TMSFlexGrid(TFrame(FrmName.Components[I]).Controls[J]),bRead);
end;
end;
if FrmName.Components[I] is TTreeView then begin
if bRead then begin
sQY:=TTreeView(FrmName.Components[I]).Name;
sClr:=FormIni.ReadString(Str,sQY,'$00F0E0FE');
TTreeView(FrmName.Components[I]).Color:=StringToColor(sClr);
end
else begin
sQY:=TTreeView(FrmName.Components[I]).Name;
sClr:=ColorToString(TTreeView(FrmName.Components[I]).Color);
FormIni.WriteString(Str,sQY,sClr);
end;
end;
end;
FormINI.Free;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 给分组后的是数字的例 就自动加上合计
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PSetGroupCount(dxDBGrid1:TdxDBGrid);
var
I:Integer;
TempType:TFieldType;
tempgrp:TdxDBGridSummaryGroup;
tempitem:TdxDBGridSummaryItem;
sFDName:String;
begin
{*****************************************************************************}
tempgrp:=dxDBGrid1.SummaryGroups.Add;
tempgrp.DefaultGroup:=True;
//**********Acess的 货币型 不能检测到***********************************
for I:=0 to dxDBGrid1.ColumnCount-1 do begin //**第一列 不算在里面**
TempType:=dxDBGrid1.Columns[I].Field.DataType;
sFDName:=dxDBGrid1.Columns[I].Field.FieldName;//**注意 FieldName***;
if sFDName = 'FZINTID' then Continue;
if (temptype = ftInteger) or (temptype = ftWord) or
(temptype = ftSmallint) or (temptype = ftFloat) or
(temptype = ftCurrency) or (temptype = ftFloat) then
begin
dxDBGrid1.Columns[I].SummaryFooterType:=cstSum;
dxDBGrid1.Columns[I].SummaryFooterField:=sFDName;
tempitem:=tempgrp.SummaryItems.Add;
tempitem.SummaryType:=cstSum;
tempitem.SummaryField:=sFDName;
tempitem.ColumnName:=dxDBGrid1.Columns[I].Name;
end;
end;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 给分组后的是数字的例 就自动加上平均
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PSetGroupCountA(dxDBGrid1:TdxDBGrid);
var
I:Integer;
TempType:TFieldType;
tempgrp:TdxDBGridSummaryGroup;
tempitem:TdxDBGridSummaryItem;
sFDName:String;
begin
{*****************************************************************************}
tempgrp:=dxDBGrid1.SummaryGroups.Add;
tempgrp.DefaultGroup:=True;
//**********Acess的 货币型 不能检测到***********************************
for I:=0 to dxDBGrid1.ColumnCount-1 do begin //**第一列 不算在里面**
TempType:=dxDBGrid1.Columns[I].Field.DataType;
sFDName:=dxDBGrid1.Columns[I].Field.FieldName;//**注意 FieldName***;
if sFDName = 'FZINTID' then Continue;
if (temptype = ftInteger) or (temptype = ftWord) or
(temptype = ftSmallint) or (temptype = ftFloat) or
(temptype = ftCurrency) or (temptype = ftFloat) then
begin
dxDBGrid1.Columns[I].SummaryFooterType:=cstAvg;
dxDBGrid1.Columns[I].SummaryFooterField:=sFDName;
tempitem:=tempgrp.SummaryItems.Add;
tempitem.SummaryType:=cstAvg;
tempitem.SummaryField:=sFDName;
tempitem.ColumnName:=dxDBGrid1.Columns[I].Name;
end;
end;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 打印 表格 Dx 可以用 Cell 可以用 黄凯的打印
--------------------------------------------------------------------------------
* 打印格式 合计列 加上一例
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PPrintDxDBGrid(dxDBGrid1:TdxDBGrid;sTile:String;saTile:array of String;
iPageRows: integer; //每页打印的行数
iFangXian:integer; //打印方向 1--45,0--25
sSaveID:String; //保存的标识
bPrintNow:boolean);
var
Str:String;
I,iColWidth:Integer;
saField,saCaption,saSumCol:array of String;
fxGrid:TMSFlexGrid;
begin
{*****************************************************************************}
if dxDBGrid1.DataSource = nil then Exit;
if dxDBGrid1.DataSource.DataSet = nil then Exit;
if not dxDBGrid1.DataSource.DataSet.Active then Exit;
{oooooooooooooooooooooo设置行列oooooooooooooooooooooooooooooooooooooooooooo}
fxGrid:=TMSFlexGrid.Create(nil);
fxGrid.Cols:=dxDBGrid1.ColumnCount;
SetLength(saField,fxGrid.Cols);
SetLength(saCaption,fxGrid.Cols);
SetLength(saSumCol,fxGrid.Cols);
{ooooooooooooooooooooo对应的数据 列注意托动问题oooooooooooooooooooooooooooooo}
for I:=0 to fxGrid.Cols-1 do begin
Str:=dxDBGrid1.Columns[I].FieldName; //ooooooooooo托动问题解决了ooooooooo
saField[I]:=Str;
Str:=dxDBGrid1.Columns[I].Caption;//标题问题
saCaption[I]:=Str;
iColWidth:=dxDBGrid1.Columns[I].Width;
fxgrid.ColWidth[I]:=iColWidth*15;//列宽问题
saSumCol[I]:=dxDBGrid1.Columns[I].SummaryFooterText;//合计行问题
end;
MyFillGridCaptionB(saCaption,fxgrid);
FillMsFlexGrid(saField,fxgrid,dxDBGrid1.DataSource.DataSet);
if dxDBGrid1.ShowSummaryFooter then AddGridRow(saSumCol,fxgrid);//合计
PrintMsFlexGrid(sTile,saTile,fxGrid,iPageRows,sSaveID,iFangXian,bPrintNow);
fxGrid.Free;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
o dx控件的汉化包出错了
* 看来只有不用汉化 这个办法就是如此
*===============================================================================
* 全部 动态加载包 有不会出错 但是全部动态加载 20030820
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -