⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufundx.~pas

📁 一个会议签到系统
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
{*******************************************************************************
*          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 + -