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

📄 formcolselect.pas

📁 中式财务栏 表格式录入 运行时设置可显示列、列名、列宽
💻 PAS
字号:
{*******************************************************}
{                                                       }
{       表格编辑                                        }
{                                                       }
{       版权所有 (C) 2007 咏南工作室(陈新光)          }
{                                                       }
{                                                       }
{*******************************************************}
{
 add by cxg.2008-04-19 09:34:16
 可以修改列宽/默认保存表格当前格式
}
{
 add by cxg.2008-04-15 08:12:20.
 保存表格格式: procedure SaveGridLayOut;
}

unit FormColSelect;

interface

uses
  SysUtils, Classes, Controls, Forms, Graphics,uCommFunc,IniFiles, 
  StdCtrls, DBGridEh, CheckLst, Buttons, ComCtrls,
  ExtCtrls, Math;

type
  TColParams = record     //如有需求可以在这里增加字段以实现更多功能
    FieldName: string;    //字段名
    Title: string;        //显示标题
    Width: Integer;       //列宽     //add by cxg
    Index: integer;       //位置
    Visible: Boolean;     //是否可见
    ReadOnly: Boolean;    //只读否
    Sort: Boolean;        //是否可排序,设置TitleButton
    SumListType: TFooterValueType; //合计的类型
    SumListField: string;          //合计字段值
    SumListValue: string;          //合计文字值
    P: TColumnEh;                  //此处放的是TColumnEh的指针
  end;
  PColParams = ^TColParams;
type
  TFrmColSelect = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    CLB: TCheckListBox;
    Panel3: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Panel4: TPanel;
    EdtFieldName: TLabeledEdit;
    BitBtn3: TBitBtn;
    GroupBox1: TGroupBox;
    ChkSumList: TCheckBox;
    chkAutoColWidth: TCheckBox;
    ChkMultiTitle: TCheckBox;
    EdtFix: TEdit;
    UpDownFix: TUpDown;
    Label1: TLabel;
    GroupBox2: TGroupBox;
    EditSumValue: TLabeledEdit;
    EditSumField: TComboBox;
    CbxSumType: TComboBox;
    ChkReadOnly: TCheckBox;
    EdtFieldTitle: TLabeledEdit;
    SpeedButton6: TSpeedButton;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton7: TSpeedButton;
    Label3: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    btn1: TBitBtn;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    LabeledEdit1: TLabeledEdit;
    procedure Button2Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure CLBClick(Sender: TObject);
    procedure OnSaveFieldValue(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure CbxSumTypeChange(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    ColArray: array of TColParams;
    v: TFooterValueType;
    procedure SaveGridLayOut; //add by cxg
    { Private declarations }
  public
    Grid: TDBGridEH;
    procedure LoadData;
    procedure SaveData;
    procedure SaveFieldValue;
    { Public declarations }
  end;

procedure ShowGridColEditor(Grid: TDBGridEH);

var
  FrmColSelect: TFrmColSelect;

implementation

{$R *.dfm}

procedure ShowGridColEditor(Grid: TDBGridEH);
begin
  //显示GRID的编辑窗口
  if (not Assigned(Grid)) or
    (not Grid.DataSource.DataSet.Active) or
    (grid.DataSource.DataSet.IsEmpty) then exit;
  FrmColSelect := TFrmColSelect.Create(nil);
  try
    FrmColSelect.Grid := Grid;
    FrmColSelect.ShowModal;
  finally
    FreeAndNil(FrmColSelect);
  end;
end;

procedure TFrmColSelect.Button2Click(Sender: TObject);
begin
  SaveFieldValue;
  SaveData;
  SaveGridLayOut;
  ModalResult := mrOk;
end;

procedure TFrmColSelect.SpeedButton1Click(Sender: TObject);
var
  i: integer;
begin
  if CLB.ItemIndex > 0 then
  begin
    i := clb.ItemIndex - 1;
    clb.Items.Move(clb.ItemIndex, i);
    CLB.ItemIndex := i;
    CLB.Selected[i];
  end;
end;

procedure TFrmColSelect.SpeedButton2Click(Sender: TObject);
var
  i: integer;
begin
  if (CLB.ItemIndex < CLB.Count - 1) and (CLB.ItemIndex >= 0) then
  begin
    i := clb.ItemIndex + 1;
    clb.Items.Move(clb.ItemIndex, i);
    CLB.ItemIndex := i;
    CLB.Selected[i];
  end;
end;

procedure TFrmColSelect.FormShow(Sender: TObject);
begin
  LoadData;
end;

procedure TFrmColSelect.LoadData;
var
  i: integer;
begin
  //装入GRID的数据到界面
  //第一步,取全局参数
  CheckBox1.Checked:=True;//add by cxg
  ChkSumList.Checked := Grid.FooterRowCount > 0;
  ChkMultiTitle.Checked := Grid.UseMultiTitle;
  EdtFix.Text := inttostr(Grid.FrozenCols);
  UpDownFix.Max := Grid.Columns.Count - 1;
  UpDownFix.Position := Grid.FrozenCols;
  chkAutoColWidth.Checked := Grid.AutoFitColWidths;
  //从GRID中装入COLUMNS信息
  CLB.Clear;
  SetLength(ColArray, Grid.Columns.Count);
  for i := 0 to Grid.Columns.Count - 1 do
  begin
    ColArray[i].FieldName := Grid.Columns.Items[i].FieldName;
    ColArray[i].Index := Grid.Columns.Items[i].Index;
    ColArray[i].Visible := Grid.Columns.Items[i].Visible;
    ColArray[i].ReadOnly := Grid.Columns.Items[i].ReadOnly;
    ColArray[i].Title := Grid.Columns.Items[i].Title.Caption;
    ColArray[i].Width:=Grid.Columns[i].Width;//add by cxg
    ColArray[i].SumListType := Grid.Columns.Items[i].Footer.ValueType;
    ColArray[i].SumListField := Grid.Columns.Items[i].Footer.FieldName;
    ColArray[i].SumListValue := Grid.Columns.Items[i].Footer.Value;
    ColArray[i].p := Grid.Columns.Items[i];

    CLB.Items.AddObject(ColArray[i].Title + '[' + ColArray[i].FieldName + ']',
      @(ColArray[i]));
    clb.Checked[i] := ColArray[i].Visible;        
    //填充cmbFieldName的字段选项
    EditSumField.Items.Add(Grid.Columns.Items[i].FieldName);
  end;
  if CLB.Items.Count > 0 then
  begin
    CLB.ItemIndex := 0;
    clb.Selected[0] := True;
    CLBClick(nil);
  end;                             
end;

procedure TFrmColSelect.SaveData;
var
  i: integer;
  p: pColParams;
  c: TColumnEh;
begin //从界面中的设置保存到GRID中
  //保存全局GRID的参数
  Grid.FooterRowCount := IfThen(ChkSumList.Checked, 1, 0);
  Grid.SumList.Active := ChkSumList.Checked;
  Grid.UseMultiTitle := ChkMultiTitle.Checked;
  Grid.FrozenCols := UpDownFix.Position;
  Grid.AutoFitColWidths := chkAutoColWidth.Checked;
  for i := 0 to CLB.Count - 1 do
  begin
    p := PColParams(CLB.Items.Objects[i]);
    c := p^.P;
    if Assigned(c) then
    begin
      c.Visible := clb.Checked[i];
      C.Index := i;
      C.ReadOnly := p^.ReadOnly;
      C.Title.Caption := p^.Title;
      c.Width:=p^.Width;  //add by cxg 
      C.Footer.ValueType := p^.SumListType;
      C.Footer.FieldName := p^.SumListField;
      C.Footer.Value := p^.SumListValue;
    end;
  end;
end;

procedure TFrmColSelect.SpeedButton6Click(Sender: TObject);
begin
  if Clb.ItemIndex >= 0 then
  begin
    clb.Items.Move(clb.ItemIndex, 0);
    CLB.Selected[0];
  end;
end;

procedure TFrmColSelect.SpeedButton7Click(Sender: TObject);
begin
  if Clb.ItemIndex >= 0 then
  begin
    clb.Items.Move(clb.ItemIndex, CLB.Count - 1);
    CLB.Selected[CLB.Count - 1];
  end;
end;

procedure TFrmColSelect.CLBClick(Sender: TObject);
var
  i: integer;
  p: PColParams;
begin
  if CLB.ItemIndex >= 0 then
  begin
    i := clb.ItemIndex;
    P := PColParams(CLB.Items.Objects[i]);
    case P^.SumListType of
      fvtNon: CbxSumType.ItemIndex := 0;
      fvtStaticText: CbxSumType.ItemIndex := 1;
      fvtFieldValue: CbxSumType.ItemIndex := 2;
      fvtAvg: CbxSumType.ItemIndex := 3;
      fvtCount: CbxSumType.ItemIndex := 4;
      fvtSum: CbxSumType.ItemIndex := 5;
    else
      CbxSumType.ItemIndex := -1;
    end;
    EditSumValue.Text := p.SumListValue;
    EditSumField.ItemIndex := EditSumField.Items.IndexOf(P^.SumListField);
    EdtFieldName.Text := P^.FieldName;
    EdtFieldTitle.Text := P^.Title;
    LabeledEdit1.Text:=IntToStr(p^.Width);//add by cxg
    ChkReadOnly.Checked := P^.ReadOnly;
  end;
end;

procedure TFrmColSelect.OnSaveFieldValue(Sender: TObject);
begin
  SaveFieldValue;
end;

procedure TFrmColSelect.SaveFieldValue;
var
  i: integer;
  p: PColParams;
begin
  //保存Field部分的设置
  i := CLB.ItemIndex;

  if i >= 0 then
  begin
    p := pColparams(CLB.Items.Objects[i]);
    case CbxSumType.ItemIndex of
      0: v := fvtNon;
      1: v := fvtStaticText;
      2: v := fvtFieldValue;
      3: v := fvtAvg;
      4: v := fvtCount;
      5: v := fvtSum;
      -1: v := fvtNon;
    end;

    p^.SumListType := v;
    p^.SumListField := EditSumField.Text;
    p^.SumListValue := EditSumValue.Text;
    p^.ReadOnly := ChkReadOnly.Checked;
    p^.Title := EdtFieldTitle.Text;
    if Trim(LabeledEdit1.Text)<>'' then
      p^.Width:=StrToInt(LabeledEdit1.Text);//add by cxg
    p^.Visible := CLB.Checked[i];
  end;

end;

procedure TFrmColSelect.SaveGridLayOut;
var
  Ini: TIniFile;
begin
  if CheckBox1.Checked then //保存当前格式
  begin
    with Grid do
      SaveGridLayoutIni(ExtractFilePath(Application.ExeName) + '\Grid.ini',
        Owner.ClassName + '$' + Name, true);
  end;

  if CheckBox2.Checked then //恢复默认格式
  begin
    Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\Grid.ini');
    try
      Ini.EraseSection(Grid.Owner.ClassName + '$' + Grid.Name);
    finally
      Ini.Free;
    end;
  end;  
end;

procedure TFrmColSelect.BitBtn3Click(Sender: TObject);
var
  i:Integer;
begin
  for i:=0 to CLB.Count-1 do
    CLB.Checked[i]:=true;
end;

procedure TFrmColSelect.CbxSumTypeChange(Sender: TObject);
var
  bField, bValue: Boolean; //用这两个变量来标识字段选择及文字框是否可用
  p: PColParams;
begin
  case CbxSumType.ItemIndex of
    0:
      begin
        bField := False;
        bValue := False;
      end;
    1:
      begin
        bField := False;
        bValue := True;
      end;
    2:
      begin
        bField := True;
        bValue := False;
      end;
    3:
      begin
        bField := True;
        bValue := False;
      end;
    4:
      begin
        bField := True;
        bValue := False;
      end;
    5:
      begin
        bField := True;
        bValue := False;
      end;
  else
    begin
      bField := False;
      bValue := False;
    end;
  end;
  //如果有字段选择统计,则显示页脚
  if CbxSumType.ItemIndex > 0 then
    ChkSumList.Checked := True;

  p := pColParams(CLB.Items.Objects[CLB.ItemIndex]);
  if bField then
    EditSumField.ItemIndex := EditSumField.Items.IndexOf(p^.FieldName);
  EditSumField.Enabled := bField;
  if bValue then
    EditSumValue.Text :=p^.SumListValue;
  EditSumValue.Enabled := bValue;
end;

procedure TFrmColSelect.btn1Click(Sender: TObject);
var
  i:Integer;
begin
  for i:=0 to CLB.Count-1 do
    CLB.Checked[i]:=False;
end;

procedure TFrmColSelect.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action:=caFree;
  FrmColSelect:=nil;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -