rm_editordictionary.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 922 行 · 第 1/2 页

PAS
922
字号

{******************************************}
{                                          }
{          Report Machine v2.0             }
{             Data dictionary              }
{                                          }
{******************************************}

unit RM_EditorDictionary;

interface

{$I RM.inc}

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, RM_Class, RM_Parser, ExtCtrls, Buttons, Menus
  {$IFDEF Delphi4}, ImgList{$ENDIF};

type
  TRMDictionaryForm = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    btnOK: TButton;
    btnCancel: TButton;
    ImageList1: TImageList;
    treeVariables: TTreeView;
    cmbDataSets: TComboBox;
    lstFields: TListBox;
    Label3: TLabel;
    Label4: TLabel;
    SaveDialog1: TSaveDialog;
    edtExpression: TEdit;
    btnNewCategory: TSpeedButton;
    btnNewVar: TSpeedButton;
    btnEdit: TSpeedButton;
    btnDel: TSpeedButton;
    btnExpression: TSpeedButton;
    PopupMenu1: TPopupMenu;
    NewCategory1: TMenuItem;
    NewVariable1: TMenuItem;
    N1: TMenuItem;
    Delete1: TMenuItem;
    TabSheet2: TTabSheet;
    lstAllDataSets: TListBox;
    btnFieldAddOne: TSpeedButton;
    btnFieldAddAll: TSpeedButton;
    btnFieldDeleteOne: TSpeedButton;
    btnFieldDeleteAll: TSpeedButton;
    Label8: TLabel;
    treeFieldAliases: TTreeView;
    GroupBox1: TGroupBox;
    Label2: TLabel;
    chkFieldNoSelect: TCheckBox;
    edtFieldAlias: TEdit;
    btnPackDictionary: TButton;
    procedure btnNewCategoryClick(Sender: TObject);
    procedure btnNewVarClick(Sender: TObject);
    procedure btnEditClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure treeVariablesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure treeVariablesEdited(Sender: TObject; Node: TTreeNode; var S: string);
    procedure btnOKClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure edtExpressionKeyPress(Sender: TObject; var Key: Char);
    procedure btnExpressionClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure lstFieldsClick(Sender: TObject);
    procedure treeVariablesChange(Sender: TObject; Node: TTreeNode);
    procedure lstAllDataSetsDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure btnFieldAddOneClick(Sender: TObject);
    procedure btnFieldDeleteOneClick(Sender: TObject);
    procedure treeFieldAliasesExpanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    procedure edtFieldAliasKeyPress(Sender: TObject; var Key: Char);
    procedure edtFieldAliasExit(Sender: TObject);
    procedure btnFieldAddAllClick(Sender: TObject);
    procedure btnFieldDeleteAllClick(Sender: TObject);
    procedure cmbDataSetsClick(Sender: TObject);
    procedure edtExpressionEnter(Sender: TObject);
    procedure edtExpressionExit(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure chkFieldNoSelectClick(Sender: TObject);
    procedure treeFieldAliasesChange(Sender: TObject; Node: TTreeNode);
    procedure btnPackDictionaryClick(Sender: TObject);
  private
    { Private declarations }
    FBusyFlag: Boolean;
    FVariables: TRMVariables;
    FFieldAliases: TRMVariables;
    FActiveNode: TTreeNode;

    procedure ApplyChanges;
    procedure Localize;

    procedure ShowValue(aValue: string);
    procedure AddFieldAlias(const aDataSet: string);
		procedure FillValiableDataSets;
  public
    { Public declarations }
    Report: TRMReport;
  end;

implementation

{$R *.DFM}

uses RM_DataSet, RM_Const, RM_Const1, RM_Utils, RM_EditorExpr;

const
  Dataset_INDEX = 1;
  Field_CanSelect = 2;
  Field_CannotSelect = 4;
  Variable_Category = 5;
  Variable_Variable = 6;
  Field_INDEX = 13;

type
  THackDictionary = class(TRMDictionary)
  end;

procedure TRMDictionaryForm.Localize;
begin
  Font.Name := RMLoadStr(SRMDefaultFontName);
  Font.Size := StrToInt(RMLoadStr(SRMDefaultFontSize));
  Font.Charset := StrToInt(RMLoadStr(SCharset));

  RMSetStrProp(Self, 'Caption', rmRes + 340);
  RMSetStrProp(TabSheet1, 'Caption', rmRes + 341);
  RMSetStrProp(TabSheet2, 'Caption', rmRes + 342);
  RMSetStrProp(Label3, 'Caption', rmRes + 344);
  RMSetStrProp(Label4, 'Caption', rmRes + 345);
  RMSetStrProp(btnNewCategory, 'Hint', rmRes + 347);
  RMSetStrProp(btnNewVar, 'Hint', rmRes + 348);
  RMSetStrProp(btnEdit, 'Hint', rmRes + 349);
  RMSetStrProp(btnDel, 'Hint', rmRes + 350);
  RMSetStrProp(GroupBox1, 'Caption', rmRes + 354);
  RMSetStrProp(Label2, 'Caption', rmRes + 355);
  RMSetStrProp(chkFieldNoSelect, 'Caption', rmRes + 356);
  RMSetStrProp(Label8, 'Caption', rmRes + 358);
  RMSetStrProp(btnPackDictionary, 'Caption', rmRes + 360);

  RMSetStrProp(NewCategory1, 'Caption', rmRes + 347);
  RMSetStrProp(NewVariable1, 'Caption', rmRes + 348);
  RMSetStrProp(Delete1, 'Caption', rmRes + 350);

  btnOK.Caption := RMLoadStr(SOk);
  btnCancel.Caption := RMLoadStr(SCancel);
end;

procedure TRMDictionaryForm.FillValiableDataSets;
var
  lList: TStringList;
begin
  lList := TStringList.Create;
  try
	  Report.Dictionary.GetDataSets(lList, FFieldAliases);
  	lList.Sort;
	  cmbDataSets.Items.Assign(lList);
  finally
	  lList.Free;
	  cmbDataSets.ItemIndex := 0;
  	cmbDataSetsClick(nil);
	end;
end;

procedure TRMDictionaryForm.FormCreate(Sender: TObject);
begin
  FVariables := TRMVariables.Create;
  FFieldAliases := TRMVariables.Create;

  PageControl1.ActivePage := TabSheet1;
  Localize;
end;

procedure TRMDictionaryForm.FormDestroy(Sender: TObject);
begin
  FVariables.Free;
  FFieldAliases.Free;
end;

procedure TRMDictionaryForm.FormShow(Sender: TObject);

  procedure _FillVariables; // 自定义变量
  var
    i: Integer;
    liParentNode, liNode: TTreeNode;
    s: string;
  begin
    FVariables.Assign(Report.Dictionary.Variables);
    treeVariables.Items.Clear;
    liParentNode := nil;
    for i := 0 to FVariables.Count - 1 do
    begin
      s := FVariables.Name[i];
      if (s <> '') and (s[1] = ' ') then // 目录
      begin
        liParentNode := treeVariables.Items.Add(nil, Copy(s, 2, 999));
        liParentNode.ImageIndex := 5;
        liParentNode.SelectedIndex := 5;
      end
      else if liParentNode <> nil then // 变量
      begin
        liNode := treeVariables.Items.AddChild(liParentNode, s);
        liNode.ImageIndex := 6;
        liNode.SelectedIndex := 6;
      end;
    end;

    treeVariables.FullExpand;
    if treeVariables.Items.Count > 0 then
      treeVariables.Items[0].Selected := True;
  end;

  procedure _FillDataSets;
  var
    i, liIndex: Integer;
    sl: TStringList;
    liDataSetName: string;
  begin
    FFieldAliases.Assign(Report.Dictionary.FieldAliases);
    treeFieldAliases.Items.Add(nil, RMLoadStr(rmRes + 352));
    sl := TStringList.Create;
    try
      RMGetComponents(Report.Owner, TRMDataset, sl, nil);
      sl.Sort;
      for i := 0 to sl.Count - 1 do
      begin
        liDataSetName := sl[i];
        liIndex := FFieldAliases.IndexOf(liDataSetName);
        if liIndex >= 0 then
        begin
          if FFieldAliases.Value[liIndex] <> '' then
            liDataSetName := liDataSetName + ' {' + FFieldAliases.Value[liIndex] + '}';
          AddFieldAlias(liDataSetName)
        end
        else
          lstAllDataSets.Items.Add(liDataSetName);
      end;

      lstAllDataSets.ItemIndex := 0;
      treeFieldAliases.Items[0].Expand(False);
      treeFieldAliases.Selected := treeFieldAliases.Items[0];
    finally
      sl.Free;
    end;
  end;

begin
  _FillVariables;
  FillValiableDataSets;
  _FillDataSets;

  treeVariables.SetFocus;
end;

procedure TRMDictionaryForm.btnOKClick(Sender: TObject);
begin
  ApplyChanges;
end;

procedure TRMDictionaryForm.ApplyChanges;
begin
  Report.Dictionary.Variables.Assign(FVariables);
  Report.Dictionary.FieldAliases.Assign(FFieldAliases);
end;

procedure TRMDictionaryForm.btnNewCategoryClick(Sender: TObject);
var
  ANode, TreeNode: TTreeNode;
  s: string;

  function CreateNewCategory: string;
  var
    i: Integer;

    function FindCategory(s: string): Boolean;
    var
      i: Integer;
    begin
      Result := False;
      for i := 0 to FVariables.Count - 1 do
      begin
        if AnsiCompareText(FVariables.Name[i], s) = 0 then
        begin
          Result := True;
          break;
        end;
      end;
    end;

  begin
    for i := 1 to 10000 do
    begin
      Result := 'Category' + IntToStr(i);
      if not FindCategory(' ' + Result) then
        break;
    end;
  end;

begin
  TreeNode := treeVariables.Selected;
  if treeVariables.ShowRoot = False then
  begin
    TreeNode.Delete;
    TreeNode := nil;
    treeVariables.ShowRoot := True;
  end;
  if TreeNode <> nil then
    TreeNode := treeVariables.Items[0];

  s := CreateNewCategory;
  FVariables[' ' + s] := '';
  ANode := treeVariables.Items.Add(TreeNode, s);
  ANode.ImageIndex := 5;
  ANode.SelectedIndex := 5;
  treeVariables.Selected := ANode;
  ANode.EditText;
end;

procedure TRMDictionaryForm.btnNewVarClick(Sender: TObject);
var
  ANode, TreeNode: TTreeNode;
  s: string;

  function CreateNewVariable: string;
  var
    i: Integer;

    function FindVariable(s: string): Boolean;
    var
      i: Integer;
    begin
      Result := False;
      for i := 0 to FVariables.Count - 1 do
      begin
        if AnsiCompareText(FVariables.Name[i], s) = 0 then
        begin
          Result := True;
          break;
        end;
      end;
    end;

  begin
    for i := 1 to 10000 do
    begin
      Result := 'Variable' + IntToStr(i);
      if not FindVariable(Result) then
        break;
    end;
  end;

begin
  TreeNode := treeVariables.Selected;
  if (TreeNode = nil) or not treeVariables.ShowRoot then Exit;
  if TreeNode.Parent <> nil then
    TreeNode := TreeNode.Parent;

  s := CreateNewVariable;

  if TreeNode.GetNextSibling <> nil then
    FVariables.Insert(FVariables.IndexOf(' ' + TreeNode.GetNextSibling.Text), s)
  else
    FVariables[s] := '';

  ANode := treeVariables.Items.AddChild(TreeNode, s);
  ANode.ImageIndex := 6;
  ANode.SelectedIndex := 6;
  TreeNode.Expand(True);
  treeVariables.Selected := ANode;
  ANode.EditText;
end;

procedure TRMDictionaryForm.btnEditClick(Sender: TObject);
var
  TreeNode: TTreeNode;
begin
  TreeNode := treeVariables.Selected;
  if (TreeNode <> nil) and treeVariables.ShowRoot then
    TreeNode.EditText;
end;

procedure TRMDictionaryForm.btnDelClick(Sender: TObject);
var
  TreeNode: TTreeNode;
  i: integer;
begin
  TreeNode := treeVariables.Selected;
  if (TreeNode <> nil) and treeVariables.ShowRoot then
  begin
    if TreeNode.ImageIndex = 5 then
    begin
      i := FVariables.IndexOf(' ' + TreeNode.Text);
      FVariables.Delete(i);
      while (i < FVariables.Count) and (FVariables.Name[i][1] <> ' ') do
        FVariables.Delete(i);
    end
    else
      FVariables.Delete(FVariables.IndexOf(TreeNode.Text));

    TreeNode.Delete;
    if treeVariables.Items.Count = 0 then
    begin
      TreeNode := treeVariables.Items.Add(treeVariables.Selected, RMLoadStr(SNotAssigned));
      TreeNode.ImageIndex := -1;
      TreeNode.SelectedIndex := -1;
      treeVariables.ShowRoot := False;
      treeVariables.Selected := treeVariables.Items[0];
    end;
  end;
end;

procedure TRMDictionaryForm.treeVariablesKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = vk_Insert then
  begin
    if ssCtrl in Shift then
      btnNewCategoryClick(nil)
    else if (treeVariables.Selected = nil) or (treeVariables.ShowRoot = False) then
      btnNewCategory.Click
    else
      btnNewVar.Click;
  end
  else if (Key = vk_Delete) and not treeVariables.IsEditing then
    btnDel.Click
  else if Key = vk_Return then
    btnEdit.Click
  else if (Key = vk_Escape) and not treeVariables.IsEditing then
    btnCancel.Click;
end;

procedure TRMDictionaryForm.treeVariablesEdited(Sender: TObject; Node: TTreeNode; var S: string);
var
  s1: string;
begin
  if Node.ImageIndex = 6 then
    s1 := s
  else
    s1 := ' ' + s;
  if (AnsiCompareText(s, Node.Text) <> 0) and (FVariables.IndexOf(s1) <> -1) then
    s := Node.Text
  else
  begin
    if Node.ImageIndex = 6 then
      FVariables.Name[FVariables.IndexOf(Node.Text)] := s1
    else
      FVariables.Name[FVariables.IndexOf(' ' + Node.Text)] := s1;
  end;
end;

procedure TRMDictionaryForm.edtExpressionKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    treeVariables.SetFocus;
end;

procedure TRMDictionaryForm.btnExpressionClick(Sender: TObject);

⌨️ 快捷键说明

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