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

📄 frxcrosseditor.pas

📁 报表控件。FastReport 是非常强大的报表控件
💻 PAS
📖 第 1 页 / 共 3 页
字号:

{******************************************}
{                                          }
{             FastReport v3.0              }
{              Cross editor                }
{                                          }
{         Copyright (c) 1998-2006          }
{         by Alexander Tzyganenko,         }
{            Fast Reports Inc.             }
{                                          }
{******************************************}

unit frxCrossEditor;

interface

{$I frx.inc}

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ToolWin, ComCtrls, ExtCtrls, frxDock, frxCross, frxCrossMatrix,
  frxCustomEditors, frxClass, frxDMPClass, frxCtrls, ImgList, Menus, Buttons
{$IFDEF Delphi6}
, Variants
{$ENDIF};

type
  TfrxCrossEditor = class(TfrxViewEditor)
  public
    function Edit: Boolean; override;
    function Execute(Tag: Integer; Checked: Boolean): Boolean; override;
    function HasEditor: Boolean; override;
    procedure GetMenuItems; override;
  end;

  TfrxCrossEditorForm = class(TForm)
    ScrollBox1: TScrollBox;
    ToolBar: TToolBar;
    FontB: TToolButton;
    PaintBox: TPaintBox;
    AlignLeftB: TToolButton;
    AlignCenterB: TToolButton;
    AlignRightB: TToolButton;
    RotationB: TToolButton;
    FillColorB: TToolButton;
    FrameB: TToolButton;
    CancelB: TToolButton;
    OkB: TToolButton;
    Sep1: TToolButton;
    Sep2: TToolButton;
    HighlightB: TToolButton;
    FormatB: TToolButton;
    Sep3: TToolButton;
    frTBPanel1: TfrxTBPanel;
    StyleCB: TfrxComboBox;
    RotationPopup: TPopupMenu;
    R0MI: TMenuItem;
    R90MI: TMenuItem;
    R180MI: TMenuItem;
    R270MI: TMenuItem;
    FuncPopup: TPopupMenu;
    Func1MI: TMenuItem;
    Func2MI: TMenuItem;
    Func3MI: TMenuItem;
    Func4MI: TMenuItem;
    Func5MI: TMenuItem;
    Func6MI: TMenuItem;
    SortPopup: TPopupMenu;
    Sort1MI: TMenuItem;
    Sort2MI: TMenuItem;
    Sort3MI: TMenuItem;
    DatasetL: TGroupBox;
    DatasetCB: TComboBox;
    FieldsLB: TListBox;
    DimensionsL: TGroupBox;
    RowsL: TLabel;
    RowsE: TEdit;
    ColumnsL: TLabel;
    ColumnsE: TEdit;
    CellsL: TLabel;
    CellsE: TEdit;
    UpDown1: TUpDown;
    UpDown2: TUpDown;
    UpDown3: TUpDown;
    DMPPopup: TPopupMenu;
    BoldMI: TMenuItem;
    ItalicMI: TMenuItem;
    UnderlineMI: TMenuItem;
    SuperScriptMI: TMenuItem;
    SubScriptMI: TMenuItem;
    CondensedMI: TMenuItem;
    WideMI: TMenuItem;
    N12cpiMI: TMenuItem;
    N15cpiMI: TMenuItem;
    StructureL: TGroupBox;
    Shape1: TShape;
    Shape2: TShape;
    SwapB: TSpeedButton;
    RowsLB: TListBox;
    ColumnsLB: TListBox;
    CellsLB: TListBox;
    RowHeaderCB: TCheckBox;
    ColumnHeaderCB: TCheckBox;
    RowTotalCB: TCheckBox;
    ColumnTotalCB: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure CancelBClick(Sender: TObject);
    procedure OkBClick(Sender: TObject);
    procedure PaintBoxPaint(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure DatasetCBClick(Sender: TObject);
    procedure DatasetCBDrawItem(Control: TWinControl; Index: Integer;
      ARect: TRect; State: TOwnerDrawState);
    procedure FieldsLBDrawItem(Control: TWinControl; Index: Integer;
      ARect: TRect; State: TOwnerDrawState);
    procedure LBDrawItem(Control: TWinControl; Index: Integer;
      ARect: TRect; State: TOwnerDrawState);
    procedure CellsLBDrawItem(Control: TWinControl; Index: Integer;
      ARect: TRect; State: TOwnerDrawState);
    procedure LBDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure LBDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure LBMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ToolButtonClick(Sender: TObject);
    procedure PaintBoxDblClick(Sender: TObject);
    procedure LBClick(Sender: TObject);
    procedure CBClick(Sender: TObject);
    procedure FuncMIClick(Sender: TObject);
    procedure CellsLBMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StyleCBClick(Sender: TObject);
    procedure SortMIClick(Sender: TObject);
    procedure SwapBClick(Sender: TObject);
    procedure DimesionsChange(Sender: TObject);
    procedure LBDblClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    FCross: TfrxCustomCrossView;
    FCurList: TListBox;
    FFuncNames: array[TfrxCrossFunction] of String;
    FImageList: TImageList;
    FSelectedObject: TfrxCustomMemoView;
    FSelectedPoint: TPoint;
    FSortNames: array[TfrxCrossSortOrder] of String;
    FStyleSheet: TfrxStyleSheet;
    FTempCross: TfrxDBCrossView;
    FUpdating: Boolean;
    procedure DrawCross;
    procedure ReflectChanges;
    procedure UpdateControls;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Cross: TfrxCustomCrossView read FCross write FCross;
  end;


implementation

{$R *.DFM}

uses
  frxDsgnIntf, frxEditFormat, frxEditHighlight, frxEditMemo, 
  frxEditFrame, frxDesgnCtrls, frxRes, frxUtils, frxFormUtils;

const
  CrossStyles =
'<?xml version="1.0" encoding="utf-8"?>' +
'<stylesheet>' +
'<style Name="Standard">' +
'<item Name="cell" Color="536870911" Frame.Typ="15"/>' +
'<item Name="column" Color="536870911" Frame.Typ="15"/>' +
'<item Name="row" Color="536870911" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="536870911" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="536870911" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="536870911" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="536870911" Font.Style="1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Corporate">' +
'<item Name="cell" Color="536870911" Frame.Typ="12"/>' +
'<item Name="column" Color="8421504" Font.Color="16777215" Frame.Typ="15"/>' +
'<item Name="row" Color="8421504" Font.Color="16777215" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="52479" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="52479" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="52479" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="52479" Font.Style="1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Grayed">' +
'<item Name="cell" Color="536870911" Frame.Typ="15"/>' +
'<item Name="column" Color="536870911" Frame.Typ="15"/>' +
'<item Name="row" Color="536870911" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="15790320" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="15790320" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="15000804" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="15000804" Font.Style="1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Yellow">' +
'<item Name="cell" Color="536870911" Frame.Typ="12"/>' +
'<item Name="column" Color="13434879" Frame.Color="16777215" Frame.Typ="15"/>' +
'<item Name="row" Color="13434879" Frame.Color="16777215" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="10027007" Frame.Color="16777215" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="10027007" Frame.Color="16777215" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="10027007" Font.Style="1" Frame.Color="16777215" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="10027007" Font.Style="1" Frame.Color="16777215" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Green">' +
'<item Name="cell" Color="536870911" Frame.Typ="15"/>' +
'<item Name="column" Color="13434828" Frame.Typ="15"/>' +
'<item Name="row" Color="13434828" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="8833409" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="8833409" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="8833409" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="8833409" Font.Style="1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Blue">' +
'<item Name="cell" Color="536870911" Frame.Typ="15"/>' +
'<item Name="column" Color="16774348" Frame.Typ="15"/>' +
'<item Name="row" Color="16774348" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="16763904" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="16763904" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="16763904" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="16763904" Font.Style="1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Red">' +
'<item Name="cell" Color="536870911" Frame.Typ="15"/>' +
'<item Name="column" Color="9934847" Frame.Typ="15"/>' +
'<item Name="row" Color="9934847" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="7434751" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="7434751" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="7434751" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="7434751" Font.Style="1" Frame.Typ="15"/>' +
'</style>' +
'</stylesheet>';


{ TfrxCrossEditor }

function TfrxCrossEditor.Edit: Boolean;
begin
  with TfrxCrossEditorForm.Create(Designer) do
  begin
    Cross := TfrxCustomCrossView(Component);
    Result := ShowModal = mrOk;
    Free;
  end;
end;

function TfrxCrossEditor.Execute(Tag: Integer; Checked: Boolean): Boolean;
var
  i: Integer;
  c: TfrxComponent;
  v: TfrxCustomCrossView;
begin
  Result := False;
  for i := 0 to Designer.SelectedObjects.Count - 1 do
  begin
    c := Designer.SelectedObjects[i];
    if (c is TfrxCustomCrossView) and not (rfDontModify in c.Restrictions) then
    begin
      v := TfrxCustomCrossView(c);
      case Tag of
        1: v.RepeatHeaders := Checked;
        2: v.Border := Checked;
        3: v.DownThenAcross := Checked;
      end;

      Result := True;
    end;
  end;
end;

procedure TfrxCrossEditor.GetMenuItems;
var
  v: TfrxCustomCrossView;
begin
  v := TfrxCustomCrossView(Component);

  AddItem(frxResources.Get('crRepHdrs'), 1, v.RepeatHeaders);
  AddItem(frxResources.Get('crBorder'), 2, v.Border);
  AddItem(frxResources.Get('crDown'), 3, v.DownThenAcross);
end;

function TfrxCrossEditor.HasEditor: Boolean;
begin
  Result := True;
end;


{ TfrxCrossEditorForm }

constructor TfrxCrossEditorForm.Create(AOwner: TComponent);
var
  TempStream: TStringStream;
begin
  FUpdating := True;
  inherited;
  FTempCross := TfrxDBCrossView.Create(nil);
  FFuncNames[cfNone] := frxResources.Get('crNone');
  FFuncNames[cfSum] := frxResources.Get('crSum');
  FFuncNames[cfMin] := frxResources.Get('crMin');
  FFuncNames[cfMax] := frxResources.Get('crMax');
  FFuncNames[cfAvg] := frxResources.Get('crAvg');
  FFuncNames[cfCount] := frxResources.Get('crCount');
  FSortNames[soAscending] := frxResources.Get('crAsc');
  FSortNames[soDescending] := frxResources.Get('crDesc');
  FSortNames[soNone] := frxResources.Get('crNone');

  FStyleSheet := TfrxStyleSheet.Create;
  TempStream := TStringStream.Create(CrossStyles);
  FStyleSheet.LoadFromStream(TempStream);
  TempStream.Free;
end;

destructor TfrxCrossEditorForm.Destroy;
begin
  FStyleSheet.Free;
  FTempCross.Free;
  inherited;
end;

procedure TfrxCrossEditorForm.FormCreate(Sender: TObject);
begin
  Caption := frxGet(4300);
  DatasetL.Caption := frxGet(4301);
  DimensionsL.Caption := frxGet(4302);
  RowsL.Caption := frxGet(4303);
  ColumnsL.Caption := frxGet(4304);
  CellsL.Caption := frxGet(4305);
  StructureL.Caption := frxGet(4306);
  RowHeaderCB.Caption := frxGet(4307);
  ColumnHeaderCB.Caption := frxGet(4308);
  RowTotalCB.Caption := frxGet(4309);
  ColumnTotalCB.Caption := frxGet(4310);
  SwapB.Hint := frxGet(4311);
  StyleCB.Hint := frxGet(4312);
  FontB.Hint := frxGet(4313);
  AlignLeftB.Hint := frxGet(4314);
  AlignCenterB.Hint := frxGet(4315);
  AlignRightB.Hint := frxGet(4316);
  RotationB.Hint := frxGet(4317);
  HighlightB.Hint := frxGet(4318);
  FormatB.Hint := frxGet(4319);
  FrameB.Hint := frxGet(4320);
  FillColorB.Hint := frxGet(4321);
  Func1MI.Caption := frxGet(4322);
  Func2MI.Caption := frxGet(4323);
  Func3MI.Caption := frxGet(4324);
  Func4MI.Caption := frxGet(4325);
  Func5MI.Caption := frxGet(4326);
  Func6MI.Caption := frxGet(4327);
  Sort1MI.Caption := frxGet(4328);
  Sort2MI.Caption := frxGet(4329);
  Sort3MI.Caption := frxGet(4330);
  BoldMI.Caption := frxGet(4331);
  ItalicMI.Caption := frxGet(4332);
  UnderlineMI.Caption := frxGet(4333);
  SuperScriptMI.Caption := frxGet(4334);
  SubScriptMI.Caption := frxGet(4335);
  CondensedMI.Caption := frxGet(4336);
  WideMI.Caption := frxGet(4337);
  N12cpiMI.Caption := frxGet(4338);
  N15cpiMI.Caption := frxGet(4339);
  CancelB.Hint := frxGet(2);
  OkB.Hint := frxGet(1);

  FImageList := frxResources.MainButtonImages;
  ToolBar.Images := FImageList;
end;

procedure TfrxCrossEditorForm.FormShow(Sender: TObject);

  procedure SelectDataset;
  begin
    DatasetCB.ItemIndex := DatasetCB.Items.IndexOfObject(FCross.DataSet);
    if DatasetCB.ItemIndex = -1 then
      DatasetCB.ItemIndex := 0;
    DatasetCBClick(nil);
  end;

  procedure SelectFields;
  var
    i, j: Integer;
  begin
    for i := 0 to FCross.RowFields.Count - 1 do
    begin
      j := FieldsLB.Items.IndexOf(FCross.RowFields[i]);
//      if (j <> -1) or (FCross is TfrxCrossView) then
      begin
        RowsLB.Items.Add(FCross.RowFields[i]);
        FieldsLB.Items.Delete(j);
      end;
    end;

    for i := 0 to FCross.ColumnFields.Count - 1 do
    begin
      j := FieldsLB.Items.IndexOf(FCross.ColumnFields[i]);
//      if (j <> -1) or (FCross is TfrxCrossView) then
      begin
        ColumnsLB.Items.Add(FCross.ColumnFields[i]);
        FieldsLB.Items.Delete(j);
      end;
    end;

    CellsLB.Items := FCross.CellFields;
  end;

begin
  FTempCross.Assign(FCross);
  FCross.Report.GetDataSetList(DatasetCB.Items);
  FStyleSheet.GetList(StyleCB.Items);
  StyleCB.ItemIndex := 0;
  UpdateControls;
  SelectDataset;
  SelectFields;

  FUpdating := True;

⌨️ 快捷键说明

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