cxeditmaskeditor.pas

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

PAS
969
字号
{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL                }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}
unit cxEditMaskEditor;

{$I cxVer.inc}

interface

uses
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  Windows, SysUtils, Classes, Graphics, Controls, Forms,
  cxControls, cxContainer, cxEdit, cxButtonEdit, StdCtrls,
  ExtCtrls, ComCtrls, cxMaskEdit, cxButtons, Dialogs, IniFiles, cxTextEdit,
  cxDropDownEdit, cxStandardMask, cxClasses, cxEditConsts, cxCheckBox,
  cxGraphics, cxMemo, cxListBox, cxLookAndFeelPainters;

type

  { EcxLoadMaskException }

  EcxLoadMaskException = class(EcxEditError);

  { TcxSample }

  TcxSample = record
    ShortDescription: string;
    Description: string;
    Mask: string;
  end;

  TcxSamples = array of TcxSample;

var
  RegExprSamples: TcxSamples;
  StandardSamples: TcxSamples;

const
  DefaultRegExprSamplesCount = 20;
  DefaultRegExprSamples: array[0..DefaultRegExprSamplesCount - 1] of TcxSample =
  (
    (
      ShortDescription: 'Time of day';
      Description: 'The 24 hour day time:'#13#10#13#10'15:25'#13#10'2:05'#13#10'03:57';
      Mask: '(0?\d | 1\d | 2[0-3]) : [0-5]\d';
    ),
    (
      ShortDescription: 'Time of day with seconds';
      Description: 'The 24 hour day time with seconds:'#13#10#13#10'12:45:10'#13#10'3:00:01';
      Mask: '(0?\d | 1\d | 2[0-3]) : [0-5]\d : [0-5]\d';
    ),
    (
      ShortDescription: 'Time of day (AM/PM)';
      Description: 'The 12 hour day time:'#13#10#13#10'1:35 PM'#13#10'12:45 AM';
      Mask: '(0?[1-9] | 1[012]) : [0-5]\d '' '' (AM | PM)';
    ),
    (
      ShortDescription: 'Time of day with seconds (AM/PM)';
      Description: 'The 12 hour day time with seconds:'#13#10#13#10'10:03:10 AM'#13#10'03:00:01 PM';
      Mask: '(0?[1-9] | 1[012]) : [0-5]\d : [0-5]\d '' '' (AM | PM)';
    ),
    (
      ShortDescription: 'Date';
      Description: 'The mm/dd/yy or mm/dd/yyyy date with year from 1000 to 3999:'#13#10#13#10 +
          '3/12/99'#13#10'06/25/1800';
      Mask: '(0?[1-9] | 1[012]) / ([012]?[1-9] | [123]0 |31) / ([123][0-9])? [0-9][0-9]';
    ),
    (
      ShortDescription: 'Telephone number';
      Description: 'The telephone number with or without city code:'#13#10#13#10 +
          '(345)234-12-07'#13#10'(210)7-17-81'#13#10'26-32-22';
      Mask: '(\(\d\d\d\))? \d(\d\d?)? - \d\d - \d\d';
    ),
    (
      ShortDescription: 'Extension';
      Description: 'For example 15450';
      Mask: '\d\d\d\d\d';
    ),
    (
      ShortDescription: 'Social security';
      Description: 'For example 555-55-5555';
      Mask: '\d\d\d - \d\d - \d\d\d\d';
    ),
    (
      ShortDescription: 'Short zip code';
      Description: 'For example 11200';
      Mask: '\d\d\d\d\d';
    ),
    (
      ShortDescription: 'Long zip code';
      Description: 'For example 11200-0000';
      Mask: '\d\d\d\d\d - \d\d\d\d';
    ),
    (
      ShortDescription: 'Decimal number';
      Description: 'Any decimal number';
      Mask: '\d+';
    ),
    (
      ShortDescription: 'Hexadecimal number';
      Description: 'Any Hexadecimal number';
      Mask: '(\d | [A-F] | [a-f])+';
    ),
    (
      ShortDescription: 'Octal number';
      Description: 'Any Octal number';
      Mask: '[0-7]+';
    ),
    (
      ShortDescription: 'Binary number';
      Description: 'Any Binary number';
      Mask: '[01]+';
    ),
    (
      ShortDescription: 'Yes/No';
      Description: 'Yes, No, yes, no, Y, N, y or n';
      Mask: '(Y | y)(es)? | (N | n)o?';
    ),
    (
      ShortDescription: 'True/False';
      Description: 'True, False, true or false';
      Mask: '(T | t)rue | (F | f)alse';
    ),
    (
      ShortDescription: 'Any symbols';
      Description: 'Any symbols';
      Mask: '.+';
    ),
    (
      ShortDescription: 'Letters only';
      Description: 'The any letters of the latin alphabet';
      Mask: '[a-zA-Z]+';
    ),
    (
      ShortDescription: 'Uppercase letters';
      Description: 'Any uppercase letters of the latin alphabet';
      Mask: '[A-Z]+';
    ),
    (
      ShortDescription: 'Lowercase letters';
      Description: 'Any lowercase letters of the latin alphabet';
      Mask: '[a-z]+';
    )
  );

  DefaultStandardSamplesCount = 8;
  DefaultStandardSamples: array[0..DefaultStandardSamplesCount - 1] of TcxSample =
  (
    (
      ShortDescription: 'Phone';
      Description: '(213)144-1756';
      Mask:  '!\(999\)000-0000;1;_';
    ),
    (
      ShortDescription: 'Extension';
      Description: '15023';
      Mask: '!99999;1;_';
    ),
    (
      ShortDescription: 'Social security';
      Description: '555-55-5555';
      Mask: '000\-00\-0000;1;_';
    ),
    (
      ShortDescription: 'Short zip code';
      Description: '90628';
      Mask: '00000;1;_';
    ),
    (
      ShortDescription: 'Long zip code';
      Description: '90628-0000';
      Mask: '00000\-9999;1;_';
    ),
    (
      ShortDescription: 'Date';
      Description: '03/24/99';
      Mask: '!99/99/00;1;_';
    ),
    (
      ShortDescription: 'Long Time';
      Description: '04:15:34 PM';
      Mask: '!90:00:00> LL;1;_';
    ),
    (
      ShortDescription: 'Short Time';
      Description: '21:45';
      Mask: '!90:00;1;_';
    )
  );

type
  { TcxEditMaskEditorDlg }
  TcxEditMaskEditorDlg = class(TForm)
    cxMaskKindPickEdit1: TcxComboBox;
    Label1: TLabel;
    StandardMaskPanel: TPanel;
    RegExprMaskPanel: TPanel;
    cxEditMaskEdit: TcxTextEdit;
    Label2: TLabel;
    Label3: TLabel;
    cxMaskEdit1: TcxMaskEdit;
    Bevel1: TBevel;
    Label4: TLabel;
    Label5: TLabel;
    Bevel2: TBevel;
    cxTextEdit1: TcxTextEdit;
    cxMaskEdit2: TcxMaskEdit;
    Bevel3: TBevel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    cxTextEdit2: TcxTextEdit;
    cxCheckBox1: TcxCheckBox;
    ButtonsPanel: TPanel;
    Memo1: TcxMemo;
    ListBox1: TcxListBox;
    CancelButton: TcxButton;
    OKButton: TcxButton;
    MasksButton: TcxButton;
    ListView1: TListView;
    procedure FormShow(Sender: TObject);
    procedure cxMaskKindPickEdit1PropertiesChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure cxEditMaskEditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ListBox1Click(Sender: TObject);
    procedure ListBox1Exit(Sender: TObject);
    procedure OKButtonClick(Sender: TObject);
    procedure CancelButtonClick(Sender: TObject);
    procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure cxTextEdit1Exit(Sender: TObject);
    procedure cxTextEdit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure cxTextEdit2Exit(Sender: TObject);
    procedure cxTextEdit2PropertiesChange(Sender: TObject);
    procedure MasksButtonClick(Sender: TObject);
    procedure cxMaskEdit1Enter(Sender: TObject);
    procedure cxCheckBox1PropertiesChange(Sender: TObject);
  private
    FMaskEditProperties: TcxCustomMaskEditProperties;
    FLastItemIndex: Integer;

    procedure ConvertMaskBlank;
    procedure CorrectMaskBlank;
    procedure FormatStandardMask(var AMask: string; ANewMaskBlank: Char); overload;
    procedure FormatStandardMask(var AMask: string; ANewSaveLiteralChars: Boolean); overload;
    function GetCurrentMaskBlank: Char;
    function GetSaveLiteralChars(const AEditMask: string): Boolean;
    function GetSaveLiteralChartSymbol(const AValue: Boolean): string;
    procedure LoadMaskDem(AFileName: string);
    procedure LoadMaskDxm(AFileName: string);
    procedure OpenMask;
    procedure ShowRegExprSamples;
    procedure ShowStandardSamples;
  public
    property MaskEditProperties: TcxCustomMaskEditProperties
      read FMaskEditProperties write FMaskEditProperties;
  end;

var
  cxEditMaskEditorDlg: TcxEditMaskEditorDlg;

implementation

{$R *.dfm}

type
  TcxCustomMaskEditPropertiesAccess = class(TcxCustomMaskEditProperties);

procedure FreeRegExprSamples;
begin
  RegExprSamples := nil;
end;

procedure FreeStandardSamples;
begin
  StandardSamples := nil;
end;

procedure TcxEditMaskEditorDlg.FormShow(Sender: TObject);
var
  AProperties: TcxCustomMaskEditPropertiesAccess;
begin
  AProperties := TcxCustomMaskEditPropertiesAccess(MaskEditProperties);
  cxMaskKindPickEdit1.ItemIndex := Ord(AProperties.MaskKind);
  RegExprMaskPanel.Visible := AProperties.MaskKind <> emkStandard;
  ShowRegExprSamples;
  ShowStandardSamples;
  FLastItemIndex := -1;
  if AProperties.MaskKind = emkStandard then
  begin
    cxTextEdit2.Text := MaskBlank(AProperties.EditMask);
    cxTextEdit1.Text := AProperties.EditMask;
    cxMaskEdit2.Properties.MaskKind := AProperties.MaskKind;
    cxMaskEdit2.Properties.EditMask := AProperties.EditMask;
    cxCheckBox1.Checked := GetSaveLiteralChars(AProperties.EditMask);
  end
  else
  begin
    cxTextEdit2.Text := cxDefaultBlank;
    cxEditMaskEdit.Text := AProperties.EditMask;
    cxMaskEdit1.Properties.MaskKind := AProperties.MaskKind;
    cxMaskEdit1.Properties.EditMask := AProperties.EditMask;
  end;
end;

procedure TcxEditMaskEditorDlg.cxMaskKindPickEdit1PropertiesChange(
  Sender: TObject);
begin
  if Visible then
  begin
    RegExprMaskPanel.Visible := cxMaskKindPickEdit1.ItemIndex <> Integer(emkStandard);
    StandardMaskPanel.Visible := not RegExprMaskPanel.Visible;
    if RegExprMaskPanel.Visible then
    begin
      cxMaskEdit1.Properties.MaskKind := TcxEditMaskKind(cxMaskKindPickEdit1.ItemIndex);
      if ListBox1.Items.Count = 0 then
        FLastItemIndex := -1;
    end;
  end;
end;

procedure TcxEditMaskEditorDlg.FormCreate(Sender: TObject);
begin
  cxMaskEdit2.Properties.MaskKind := emkStandard;
  cxMaskEdit2.Properties.AlwaysShowBlanksAndLiterals := True;
end;

procedure TcxEditMaskEditorDlg.cxEditMaskEditKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if TranslateKey(Key) = VK_RETURN then
  begin
    try
      cxMaskEdit1.Properties.EditMask := cxEditMaskEdit.Text;
      cxMaskEdit1.Enabled := True;
    except
      on EcxMaskEditError do
      begin
        cxMaskEdit1.Properties.EditMask := '';
        cxMaskEdit1.Text := '';
        cxMaskEdit1.Enabled := False;
        raise;
      end;
    end;
  end;
end;

function TcxEditMaskEditorDlg.GetCurrentMaskBlank: Char;
begin
  Result := Char(cxTextEdit2.Text[1]);
end;

function TcxEditMaskEditorDlg.GetSaveLiteralChars(const AEditMask: string): Boolean;
var
  ALen: Integer;
begin
  Result := True;
  ALen := Length(AEditMask);
  if ALen >= 2 then
  begin
    if ALen >= 4 then
    begin
      if AEditMask[ALen - 3] = ';' then
      begin
        if AEditMask[ALen - 1] = ';' then
          Result := not (AEditMask[ALen - 2] = '0');
      end
      else
      begin
        if AEditMask[ALen - 1] = ';' then
          Result := not (AEditMask[ALen] = '0');
      end;
    end
    else
    begin
      if AEditMask[ALen - 1] = ';' then
        Result := not (AEditMask[ALen] = '0');
    end;
  end;
end;

function TcxEditMaskEditorDlg.GetSaveLiteralChartSymbol(const AValue: Boolean): string;
begin
  if AValue then
    Result := '1'
  else
    Result := '0';
end;

procedure TcxEditMaskEditorDlg.LoadMaskDem(AFileName: string);
var
  AMemoryStream: TMemoryStream;

  function GetNextToken(AIndex: Integer): Char;
  begin
    Result := Char(PByteArray(AMemoryStream.Memory)^[AIndex]);
  end;

var
  ASamples: TcxSamples;
  AShortDescription: string;
  ADescription: string;
  AMask: string;

  procedure AddSample;
  begin
    SetLength(ASamples, Length(ASamples) + 1);
    ASamples[Length(ASamples) - 1].ShortDescription := AShortDescription;
    ASamples[Length(ASamples) - 1].Description := ADescription;
    ASamples[Length(ASamples) - 1].Mask := AMask;

    AShortDescription := '';
    ADescription := '';
    AMask := '';
  end;

var
  AStringNumber: Integer;
  AToken: Char;
  I: Integer;
begin
  AMemoryStream := TMemoryStream.Create;

  AMemoryStream.LoadFromFile(AFileName);
  AStringNumber := 0;
  AShortDescription := '';
  ADescription := '';
  AMask := '';

  try
    for I := 0 to AMemoryStream.Size - 1 do
    begin
      AToken := GetNextToken(I);

      if (AToken = ' ') or (AToken = #9) then
      begin
        if ((AStringNumber = 0) and (AShortDescription = '')) or
            ((AStringNumber = 1) and (ADescription = '')) or
            ((AStringNumber = 2) and (AMask = '')) then
          Continue;
      end
      else if AToken = #10 then
      begin
        if (AStringNumber = 2) then
        begin
          ADescription := FormatText(ADescription, AMask, GetCurrentMaskBlank);
          AddSample;
          AStringNumber := 0;
        end
        else

⌨️ 快捷键说明

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