cxeditmaskeditor.pas

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

PAS
969
字号
        begin
          if not ((AStringNumber = 0) and (AShortDescription = '')) then
            raise EcxLoadMaskException.Create(cxGetResourceString(@scxMaskEditIllegalFileFormat));
        end;
      end
      else if AToken = '|' then
      begin
        if AStringNumber >= 2 then
          raise EcxLoadMaskException.Create(cxGetResourceString(@scxMaskEditIllegalFileFormat))
        else
          Inc(AStringNumber);
      end
      else
      begin
        if AToken <> #13 then
        begin
          case AStringNumber of
            0: AShortDescription := AShortDescription + AToken;
            1: ADescription := ADescription + AToken;
            2: AMask := AMask + AToken;
          end;
        end;
      end;
    end;

    if (AShortDescription <> '') or (ADescription <> '') or (AMask <> '') then
      AddSample;

    if Length(ASamples) > 0 then
    begin
      FreeStandardSamples;
      StandardSamples := ASamples;
      ShowStandardSamples;
      cxTextEdit1.Text := '';
      cxMaskEdit2.Properties.EditMask := '';
      cxCheckBox1.Checked := True;
    end
    else
      raise EcxLoadMaskException.Create(cxGetResourceString(@scxMaskEditEmptyMaskCollectionFile));
  finally
    AMemoryStream.Free;
  end;
end;

procedure TcxEditMaskEditorDlg.LoadMaskDxm(AFileName: string);
var
  AStandardSamples: TcxSamples;
  ARegExprSamples: TcxSamples;
  AShortDescription: string;
  ADescription: string;
  AMask: string;

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

  procedure ClearValues;
  begin
    AShortDescription := '';
    ADescription := '';
    AMask := '';
  end;

  procedure AddStandardSample;
  begin
    NewSample(AStandardSamples);
    ClearValues;
  end;

  procedure AddRegExprSample;
  begin
    NewSample(ARegExprSamples);
    ClearValues;
  end;

var
  AFile: TMemIniFile;
  ASections: TStringList;
  AKeys: TStringList;
  I: Integer;
begin
  AFile := TMemIniFile.Create(AFileName);
  ASections := TStringList.Create;
  AKeys := TStringList.Create;

  try
    AFile.ReadSections(ASections);
    for I := 0 to ASections.Count - 1 do
    begin
      AFile.ReadSection(ASections[I], AKeys);
      if AKeys.Count > 3 then
        raise EcxLoadMaskException.Create(cxGetResourceString(@scxMaskEditIllegalFileFormat))
      else
      begin
        AShortDescription := AFile.ReadString(ASections[I], 'ShortDescription', '');
        ADescription := AFile.ReadString(ASections[I], 'Description', '');
        AMask := AFile.ReadString(ASections[I], 'Mask', '');
        if (AShortDescription = '') and (ADescription = '') and (AMask = '') then
          Continue;

        if Pos('Standard', ASections[I]) <> 0 then
          AddStandardSample
        else if Pos('RegExpr', ASections[I]) <> 0 then
          AddRegExprSample
        else
          raise EcxLoadMaskException.Create(cxGetResourceString(@scxMaskEditIllegalFileFormat));
      end;
    end;

    if (Length(AStandardSamples) = 0) and (Length(ARegExprSamples) = 0) then
      raise EcxLoadMaskException.Create(cxGetResourceString(@scxMaskEditEmptyMaskCollectionFile));

    FreeStandardSamples;
    StandardSamples := AStandardSamples;
    ShowStandardSamples;
    cxTextEdit1.Text := '';
    cxMaskEdit2.Properties.EditMask := '';
    cxCheckBox1.Checked := True;

    FreeRegExprSamples;
    RegExprSamples := ARegExprSamples;
    ShowRegExprSamples;
    cxEditMaskEdit.Text := '';
    cxMaskEdit1.Properties.EditMask := '';

  finally
    AFile.Free;
    AKeys.Free;
    ASections.Free;
  end;
end;

procedure TcxEditMaskEditorDlg.OpenMask;
var
  ADialog: TOpenDialog;
  AExt: string;
begin
  ADialog := TOpenDialog.Create(nil);
  ADialog.Options := [];
  ADialog.Filter := cxGetResourceString(@scxMaskEditMaskCollectionFiles) + ' (*.dem, *.dxm )|*.dem;*.dxm';
  try
    if ADialog.Execute then
    begin
      AExt := ExtractFileExt(ADialog.Files[0]);
      if LowerCase(AExt) = '.dem' then
        LoadMaskDem(ADialog.Files[0])
      else if LowerCase(AExt) = '.dxm' then
        LoadMaskDxm(ADialog.Files[0]);
    end;
  finally
    ADialog.Free;
  end;
end;

procedure TcxEditMaskEditorDlg.ShowRegExprSamples;
var
  I: Integer;
begin
  ListBox1.Items.Clear;
  if RegExprSamples = nil then
  begin
    for I := 0 to DefaultRegExprSamplesCount - 1 do
      ListBox1.Items.Add(DefaultRegExprSamples[I].ShortDescription);
  end
  else
  begin
    for I := 0 to Length(RegExprSamples) - 1 do
      ListBox1.Items.Add(RegExprSamples[I].ShortDescription);
  end;
end;

procedure TcxEditMaskEditorDlg.ShowStandardSamples;
var
  I: Integer;
  AItem: TListItem;
begin
  ListView1.Items.Clear;
  if StandardSamples = nil then
  begin
    for I := 0 to DefaultStandardSamplesCount - 1 do
    begin
      AItem := ListView1.Items.Add;
      AItem.Caption := DefaultStandardSamples[I].ShortDescription;
      AItem.SubItems.Add(DefaultStandardSamples[I].Description);
    end;
  end
  else
  begin
    for I := 0 to Length(StandardSamples) - 1 do
    begin
      AItem := ListView1.Items.Add;
      AItem.Caption := StandardSamples[I].ShortDescription;
      AItem.SubItems.Add(StandardSamples[I].Description);
    end;
  end;
end;

procedure TcxEditMaskEditorDlg.ListBox1Click(Sender: TObject);
begin
  Memo1.Clear;
  if RegExprSamples = nil then
  begin
    Memo1.Lines.Add(DefaultRegExprSamples[ListBox1.ItemIndex].Description);
    cxEditMaskEdit.Text := DefaultRegExprSamples[ListBox1.ItemIndex].Mask;
  end
  else
  begin
    Memo1.Lines.Add(RegExprSamples[ListBox1.ItemIndex].Description);
    cxEditMaskEdit.Text := RegExprSamples[ListBox1.ItemIndex].Mask;
  end;

  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;

procedure TcxEditMaskEditorDlg.ListBox1Exit(Sender: TObject);
begin
  if ListBox1.ItemIndex <> FLastItemIndex then
  begin
    cxMaskEdit1.Text := '';
    FLastItemIndex := ListBox1.ItemIndex;
  end;
end;

procedure TcxEditMaskEditorDlg.OKButtonClick(Sender: TObject);
begin
  if cxMaskKindPickEdit1.ItemIndex = Integer(emkStandard) then
  begin
    CorrectMaskBlank;
    cxMaskEdit2.Properties.EditMask := '';
    cxMaskEdit2.Text := '';
    cxMaskEdit2.Properties.EditMask := cxTextEdit1.Text;
    TcxCustomMaskEditPropertiesAccess(MaskEditProperties).MaskKind :=
      emkStandard;
    TcxCustomMaskEditPropertiesAccess(MaskEditProperties).EditMask :=
      cxMaskEdit2.Properties.EditMask;
    ModalResult := mrOk;
  end
  else
    try
      cxMaskEdit1.Properties.EditMask := cxEditMaskEdit.Text;
      cxMaskEdit1.Enabled := True;
      TcxCustomMaskEditPropertiesAccess(MaskEditProperties).MaskKind :=
        TcxEditMaskKind(cxMaskKindPickEdit1.ItemIndex);
      TcxCustomMaskEditPropertiesAccess(MaskEditProperties).EditMask :=
        cxMaskEdit1.Properties.EditMask;
      ModalResult := mrOk;
    except
      on EcxMaskEditError do
      begin
        cxMaskEdit1.Properties.EditMask := '';
        cxMaskEdit1.Text := '';
        cxMaskEdit1.Enabled := False;
        cxEditMaskEdit.SetFocus;
        raise;
      end;
    end;
end;

procedure TcxEditMaskEditorDlg.CancelButtonClick(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TcxEditMaskEditorDlg.ListView1SelectItem(Sender: TObject;
  Item: TListItem; Selected: Boolean);
begin
  if Selected then
  begin
    if StandardSamples = nil then
      cxTextEdit1.Text := DefaultStandardSamples[ListView1.Selected.Index].Mask
    else
      cxTextEdit1.Text := StandardSamples[ListView1.Selected.Index].Mask;

    CorrectMaskBlank;
    cxMaskEdit2.Properties.EditMask := '';
    cxMaskEdit2.Text := '';
    cxMaskEdit2.Properties.EditMask := cxTextEdit1.Text;
    cxCheckBox1.Checked := GetSaveLiteralChars(cxTextEdit1.Text);
  end;
end;

procedure TcxEditMaskEditorDlg.cxTextEdit1Exit(Sender: TObject);
begin
  begin
    CorrectMaskBlank;
    cxMaskEdit2.Properties.EditMask := '';
    cxMaskEdit2.Text := '';
    cxMaskEdit2.Properties.EditMask := cxTextEdit1.Text;
    cxCheckBox1.Checked := GetSaveLiteralChars(cxTextEdit1.Text);
  end;
end;

procedure TcxEditMaskEditorDlg.cxTextEdit1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if TranslateKey(Key) = VK_RETURN then
  begin
    CorrectMaskBlank;
    cxMaskEdit2.Properties.EditMask := '';
    cxMaskEdit2.Text := '';
    cxMaskEdit2.Properties.EditMask := cxTextEdit1.Text;
    cxCheckBox1.Checked := GetSaveLiteralChars(cxTextEdit1.Text);
  end;
end;

procedure TcxEditMaskEditorDlg.FormatStandardMask(var AMask: string; ANewMaskBlank: Char);
var
  AOldMaskBlank: Char;
  ASaveLiteralChars: Boolean;
  AMaskLength: Integer;
begin
  AOldMaskBlank := MaskBlank(AMask);
  ASaveLiteralChars := SaveLiteralChars(AMask);
  if AOldMaskBlank <> ANewMaskBlank then
  begin
    AMaskLength := Length(AMask);

    if AMaskLength < 4 then
    begin
      if (AMaskLength = 2) and (AMask[1] = ';') and ((AMask[2] = '0') or (AMask[2] = '1')) then
        AMask := AMask + ';' + ANewMaskBlank
      else
        AMask := AMask + ';' + GetSaveLiteralChartSymbol(ASaveLiteralChars) + ';' + ANewMaskBlank;
    end
    else
    begin
      if (AMask[AMaskLength - 1] = ';') and (AMask[AMaskLength - 3] = ';') and
          ((AMask[AMaskLength - 2] = '0') or (AMask[AMaskLength - 2] = '1')) then
      begin
        Delete(AMask, AMaskLength,1);
        AMask := AMask + ANewMaskBlank;
      end
      else if (AMask[AMaskLength - 1] = ';') and ((AMask[AMaskLength] = '0') or (AMask[AMaskLength] = '1')) then
        AMask := AMask + ';' + ANewMaskBlank
      else
        AMask := AMask + ';' + GetSaveLiteralChartSymbol(ASaveLiteralChars) + ';' + ANewMaskBlank;
    end;
  end;
end;

procedure TcxEditMaskEditorDlg.FormatStandardMask(var AMask: string; ANewSaveLiteralChars: Boolean);
var
  AMaskLength: Integer;
  AMaskBlank: Char;
begin
  AMaskLength := Length(AMask);
  AMaskBlank := MaskBlank(AMask);
  if ANewSaveLiteralChars <> SaveLiteralChars(AMask) then
  begin
    if AMaskLength < 4 then
    begin
      if (AMaskLength = 2) and (AMask[1] = ';') and ((AMask[2] = '0') or (AMask[2] = '1')) then
      begin
        Delete(AMask, AMaskLength, 1);
        AMask := AMask + GetSaveLiteralChartSymbol(ANewSaveLiteralChars);
      end
      else
        AMask := AMask + ';' + GetSaveLiteralChartSymbol(ANewSaveLiteralChars) + ';' + AMaskBlank;
    end
    else
    begin
      if (AMask[AMaskLength - 1] = ';') and (AMask[AMaskLength - 3] = ';') and
          ((AMask[AMaskLength - 2] = '0') or (AMask[AMaskLength - 2] = '1')) then
      begin
        Delete(AMask, AMaskLength - 2, 1);
        Insert(GetSaveLiteralChartSymbol(ANewSaveLiteralChars), AMask, AMaskLength - 2);
      end
      else if (AMask[AMaskLength - 1] = ';') and ((AMask[AMaskLength] = '0') or (AMask[AMaskLength] = '1')) then
      begin
        Delete(AMask, AMaskLength, 1);
        AMask := AMask + GetSaveLiteralChartSymbol(ANewSaveLiteralChars);
      end
      else
        AMask := AMask + ';' + GetSaveLiteralChartSymbol(ANewSaveLiteralChars) + ';' + AMaskBlank;
    end;
  end;
end;

procedure TcxEditMaskEditorDlg.cxTextEdit2Exit(Sender: TObject);
begin
  ConvertMaskBlank;
end;

procedure TcxEditMaskEditorDlg.ConvertMaskBlank;
begin
  if Length(cxTextEdit2.Text) > 0 then
  begin
    if string(cxTextEdit2.Text)[1] < #32 then
      cxTextEdit2.Text := '_';
  end
  else
    cxTextEdit2.Text := '_';
end;

procedure TcxEditMaskEditorDlg.cxTextEdit2PropertiesChange(
  Sender: TObject);
var
  AMask: string;
begin
  ConvertMaskBlank;

  AMask := cxTextEdit1.Text;
  FormatStandardMask(AMask, string(cxTextEdit2.Text)[1]);
  cxTextEdit1.Text := AMask;
  cxMaskEdit2.Properties.EditMask := AMask;
  cxCheckBox1.Checked := GetSaveLiteralChars(AMask);
end;

procedure TcxEditMaskEditorDlg.CorrectMaskBlank;
var
  AMask: string;
begin
  AMask := cxTextEdit1.Text;
  cxTextEdit2.Text := MaskBlank(AMask);
  if Length(cxTextEdit2.Text) > 0 then
    FormatStandardMask(AMask, string(cxTextEdit2.Text)[1])
  else
  begin
    FormatStandardMask(AMask, '_');
    cxTextEdit2.Text := '_';
  end;
  cxTextEdit1.Text := AMask;
end;

procedure TcxEditMaskEditorDlg.MasksButtonClick(Sender: TObject);
begin
  OpenMask;
end;

procedure TcxEditMaskEditorDlg.cxMaskEdit1Enter(Sender: TObject);
begin
  try
    cxMaskEdit1.Properties.EditMask := cxEditMaskEdit.Text;
    cxMaskEdit1.Enabled := True;
  except
    on EcxMaskEditError do
    begin
      cxMaskEdit1.Properties.EditMask := '';
      cxMaskEdit1.Text := '';
      cxMaskEdit1.Enabled := False;
      cxEditMaskEdit.SetFocus;
      raise;
    end;
  end;
end;

procedure TcxEditMaskEditorDlg.cxCheckBox1PropertiesChange(
  Sender: TObject);
var
  AMask: string;
begin
  AMask := cxTextEdit1.Text;
  if Length(cxTextEdit2.Text) > 0 then
    FormatStandardMask(AMask, Char(cxTextEdit2.Text[1]));
  FormatStandardMask(AMask, cxCheckBox1.Checked);
  cxTextEdit1.Text := AMask;
  cxMaskEdit2.Properties.EditMask := AMask;
end;

initialization
  RegExprSamples := nil;
  StandardSamples := nil;

finalization
  FreeRegExprSamples;
  FreeStandardSamples;

end.

⌨️ 快捷键说明

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