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

📄 frmeapubmemoeditunt.pas

📁 EAComps手工画报表 对写报表编辑器有一定的参考价值
💻 PAS
字号:
unit frmEAPubMemoEditUnt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ActnList, ActnMan, ToolWin, ActnCtrls,
  StdCtrls, ActnMenus, Menus, ComCtrls, IniFiles;

type
  TEAPubMemoEditParam = record
    ReadOnly: Boolean;
    Caption: string;
    EditValue: string;
    ShowStatus: Boolean;
    MaxLength: Integer;
    IsDelimited: Boolean;
  end;

  TfrmEAPubMemoEdit = class(TForm)
    imgList16x16: TImageList;
    sbStatus: TStatusBar;
    dlgFont: TFontDialog;
    dlgFind: TFindDialog;
    dlgReplace: TReplaceDialog;
    dlgOpen: TOpenDialog;
    meoEdit: TRichEdit;
    ActList: TActionList;
    ActFile_SaveExit: TAction;
    ActFile_Comeback: TAction;
    ActFile_SendIn: TAction;
    ActFile_Exit: TAction;
    ActEdit_Undo: TAction;
    ActEdit_Cut: TAction;
    ActEdit_Copy: TAction;
    ActEdit_Paste: TAction;
    ActEdit_Clear: TAction;
    ActEdit_Find: TAction;
    ActEdit_FindNext: TAction;
    ActEdit_Replace: TAction;
    ActFmt_Font: TAction;
    ActEdit_SelectAll: TAction;
    ActFmt_WordWrap: TAction;
    ActFile_About: TAction;
    ActHelp_Help: TAction;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton9: TToolButton;
    ToolButton10: TToolButton;
    ToolButton11: TToolButton;
    ToolButton12: TToolButton;
    ToolButton13: TToolButton;
    ToolButton14: TToolButton;
    ToolButton16: TToolButton;
    ToolButton17: TToolButton;
    ToolButton18: TToolButton;
    ToolButton19: TToolButton;
    ToolButton15: TToolButton;
    ToolButton20: TToolButton;
    ToolButton21: TToolButton;
    pmEdit: TPopupMenu;
    U1: TMenuItem;
    N1: TMenuItem;
    X1: TMenuItem;
    C1: TMenuItem;
    V1: TMenuItem;
    D1: TMenuItem;
    N2: TMenuItem;
    A1: TMenuItem;
    procedure ActFile_ExitExecute(Sender: TObject);
    procedure ActHelp_HelpExecute(Sender: TObject);
    procedure ActFile_ComebackExecute(Sender: TObject);
    procedure ActEdit_UndoExecute(Sender: TObject);
    procedure ActEdit_CutExecute(Sender: TObject);
    procedure ActEdit_CopyExecute(Sender: TObject);
    procedure ActEdit_PasteExecute(Sender: TObject);
    procedure ActEdit_ClearExecute(Sender: TObject);
    procedure ActEdit_SelectAllExecute(Sender: TObject);
    procedure ActFmt_WordWrapExecute(Sender: TObject);
    procedure ActFmt_FontExecute(Sender: TObject);
    procedure ActEdit_FindExecute(Sender: TObject);
    procedure ActFile_SaveExitExecute(Sender: TObject);
    procedure ActFile_SendInExecute(Sender: TObject);
    procedure ActFile_AboutExecute(Sender: TObject);
    procedure dlgFindFind(Sender: TObject);
    procedure ActEdit_ReplaceExecute(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormShow(Sender: TObject);
    procedure dlgReplaceFind(Sender: TObject);
    procedure dlgReplaceReplace(Sender: TObject);
    procedure ActListUpdate(Action: TBasicAction; var Handled: Boolean);
  private
    FParam: TEAPubMemoEditParam;
    FModifed: Boolean;

    procedure DoMemoEditChange(Sender: TObject);
    procedure SetModifed(Value: Boolean);
    function GetWordWrap: Boolean;
    procedure SetWordWrap(Value: Boolean);
  public
    procedure InitData;
    procedure ClearData;
    procedure SetData(AParam: TEAPubMemoEditParam);
    procedure GetData(var AParam: TEAPubMemoEditParam);

    procedure LoadIniData;
    procedure SaveIniData;
    procedure AdjustUI;

    property Modifed: Boolean read FModifed write SetModifed;
    property WordWrap: Boolean read GetWordWrap write SetWordWrap;
  end;

  function ShowEAPubMemoEditDlg(var AParam: TEAPubMemoEditParam): Boolean;
  procedure TestEAPubMemoEditDlg;

var
  frmEAPubMemoEdit: TfrmEAPubMemoEdit;

implementation
uses
  RichEdit;
{$R *.dfm}

function ShowEAPubMemoEditDlg(var AParam: TEAPubMemoEditParam): Boolean;
begin
  Result := False;
  frmEAPubMemoEdit := TfrmEAPubMemoEdit.Create(Application);
  with frmEAPubMemoEdit do
  try
    SetData(AParam);
    InitData;
    if ShowModal = IDOK then
    begin
      GetData(AParam);
      Result := True;
    end;
  finally
    ClearData;
    Free;
  end;
  frmEAPubMemoEdit := nil;
end;

procedure TestEAPubMemoEditDlg;
var
  P: TEAPubMemoEditParam;
begin
  P.EditValue := 'SharpExpress';
  P.Caption := 'gy';
  P.ReadOnly := False;
  P.ShowStatus := True;
  if ShowEAPubMemoEditDlg(P) then
    ShowMessage(P.EditValue);
end;

procedure MsgInfo(const AMsg: string);
begin
  Application.MessageBox(PChar(AMsg), '提示');
end;

function GetIniFileName: string;
begin
  Result := ExtractFilePath(Application.ExeName) + 'EAWindowSetup.ini';
end;

procedure TfrmEAPubMemoEdit.ActFile_ExitExecute(Sender: TObject);
begin
  Close;
end;

procedure TfrmEAPubMemoEdit.ActHelp_HelpExecute(Sender: TObject);
begin
  ShowMessage('SharpExpress');
end;

procedure TfrmEAPubMemoEdit.ClearData;
begin
  SaveIniData;
end;

procedure TfrmEAPubMemoEdit.GetData(var AParam: TEAPubMemoEditParam);
begin    
  if FParam.IsDelimited then
    AParam.EditValue := meoEdit.Lines.DelimitedText
  else
    AParam.EditValue := meoEdit.Text;
end;

procedure TfrmEAPubMemoEdit.InitData;
begin
  Caption := FParam.Caption;
  meoEdit.ReadOnly := FParam.ReadOnly;
  if FParam.IsDelimited then
    meoEdit.Lines.DelimitedText := FParam.EditValue
  else
    meoEdit.Text := FParam.EditValue;
  meoEdit.MaxLength := FParam.MaxLength;
  sbStatus.Visible := FParam.ShowStatus;
  AdjustUI;
  LoadIniData;
  Modifed := False;
end;

procedure TfrmEAPubMemoEdit.SetData(AParam: TEAPubMemoEditParam);
begin
  FParam := AParam;
end;

procedure TfrmEAPubMemoEdit.DoMemoEditChange(Sender: TObject);
begin
  if not FParam.ReadOnly then
    Modifed := True;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.SetModifed(Value: Boolean);
begin
  if FModifed <> Value then
  begin
    FModifed := Value;
    if FModifed then
      ActEdit_Undo.Enabled := True
    else begin
      meoEdit.ClearUndo;
      ActEdit_Undo.Enabled := False;
    end;
  end;
end;

procedure TfrmEAPubMemoEdit.AdjustUI;
begin
  sbStatus.SimpleText := '文本行数:' + IntToStr(meoEdit.Lines.Count);
end;

procedure TfrmEAPubMemoEdit.ActFile_ComebackExecute(Sender: TObject);
begin
  if FParam.IsDelimited then
    meoEdit.Lines.DelimitedText := FParam.EditValue
  else
    meoEdit.Text := FParam.EditValue;
  Modifed := False;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.ActEdit_UndoExecute(Sender: TObject);
begin
  meoEdit.Undo;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.ActEdit_CutExecute(Sender: TObject);
begin
  meoEdit.CutToClipboard;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.ActEdit_CopyExecute(Sender: TObject);
begin
  meoEdit.CopyToClipboard;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.ActEdit_PasteExecute(Sender: TObject);
begin
  meoEdit.PasteFromClipboard;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.ActEdit_ClearExecute(Sender: TObject);
begin
  meoEdit.ClearSelection;
  AdjustUI;
end;

procedure TfrmEAPubMemoEdit.ActEdit_SelectAllExecute(Sender: TObject);
begin
  meoEdit.SelectAll;
end;

procedure TfrmEAPubMemoEdit.ActFmt_WordWrapExecute(Sender: TObject);
begin
  WordWrap := not WordWrap;
end;

procedure TfrmEAPubMemoEdit.ActFmt_FontExecute(Sender: TObject);
begin
  dlgFont.Font.Assign(meoEdit.Font);
  if dlgFont.Execute then
    meoEdit.Font.Assign(dlgFont.Font);
end;

procedure TfrmEAPubMemoEdit.ActEdit_FindExecute(Sender: TObject);
var
  vFindText: string;
begin
  vFindText := meoEdit.SelText;
  if vFindText = '' then
    vFindText := dlgFind.FindText;
  dlgFind.FindText := vFindText;
  dlgFind.Execute;
end;

procedure TfrmEAPubMemoEdit.ActFile_SaveExitExecute(Sender: TObject);
begin
  Modifed := False;
  ModalResult := IDOK;
end;

procedure TfrmEAPubMemoEdit.ActFile_SendInExecute(Sender: TObject);
begin
  if dlgOpen.Execute then
  begin
    meoEdit.Lines.LoadFromFile(dlgOpen.FileName);
    AdjustUI;
  end;
end;

procedure TfrmEAPubMemoEdit.ActFile_AboutExecute(Sender: TObject);
begin
  ShowMessage('SharpExpress');
end;

procedure TfrmEAPubMemoEdit.dlgFindFind(Sender: TObject);
var
  vSerchType: TSearchTypes;
  vIndex: Integer;
begin
  vSerchType := [];
  if frWholeWord in dlgFind.Options then
    vSerchType := [stWholeWord];
  if frMatchCase in dlgFind.Options then
    vSerchType := vSerchType + [stMatchCase];
  vIndex := meoEdit.FindText(dlgFind.FindText, meoEdit.SelStart + meoEdit.SelLength,
    Length(meoEdit.Text), vSerchType);
  if vIndex > -1 then
  begin
    meoEdit.SelStart := vIndex;
    meoEdit.SelLength := Length(dlgFind.FindText);
    meoEdit.SetFocus;
  end
  else
    MsgInfo('没有找到字符串' + dlgFind.FindText + '。');
end;

procedure TfrmEAPubMemoEdit.ActEdit_ReplaceExecute(Sender: TObject);
var
  vReplaceText: string;
begin
  vReplaceText := meoEdit.SelText;
  if vReplaceText = '' then
    vReplaceText := dlgReplace.ReplaceText;
  dlgReplace.ReplaceText := vReplaceText;
  dlgReplace.Execute;
end;

procedure TfrmEAPubMemoEdit.LoadIniData;
var
  vIni: TIniFile;
begin
  vIni := TIniFile.Create(GetIniFileName);
  try
    //ea.Str.StrToFont(vIni.ReadString('PubMemoEdit', 'Font', ''), meoEdit.Font);
    WordWrap := vIni.ReadBool('PubMemoEdit', 'WordWrap', True);
  finally
    vIni.Free;
  end;
end;

procedure TfrmEAPubMemoEdit.SaveIniData;
var
  vIni: TIniFile;
begin
  vIni := TIniFile.Create(GetIniFileName);
  try
    //vIni.WriteString('PubMemoEdit', 'Font', ea.Str.FontToStr(meoEdit.Font));
    vIni.WriteBool('PubMemoEdit', 'WordWrap', WordWrap);
  finally
    vIni.Free;
  end;
end;

function TfrmEAPubMemoEdit.GetWordWrap: Boolean;
begin
  Result := meoEdit.WordWrap;
end;

procedure TfrmEAPubMemoEdit.SetWordWrap(Value: Boolean);
begin
  meoEdit.WordWrap := Value;
  ActFmt_WordWrap.Checked := Value;
end;

procedure TfrmEAPubMemoEdit.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if Modifed and not (Application.MessageBox('数据已修改,但尚未保存,真的要退出吗?',
     '提示', MB_OK + MB_ICONQUESTION + MB_YESNO) = IDYES) then
    CanClose := False;
end;

procedure TfrmEAPubMemoEdit.FormShow(Sender: TObject);
begin
  if not FParam.ReadOnly then
    meoEdit.OnChange := DoMemoEditChange;
end;

procedure TfrmEAPubMemoEdit.dlgReplaceFind(Sender: TObject);
var
  vSerchType: TSearchTypes;
  vIndex: Integer;
begin
  vSerchType := [];
  if frWholeWord in dlgReplace.Options then
    vSerchType := [stWholeWord];
  if frMatchCase in dlgReplace.Options then
    vSerchType := vSerchType + [stMatchCase];
  vIndex := meoEdit.FindText(dlgReplace.FindText, meoEdit.SelStart + meoEdit.SelLength,
    Length(meoEdit.Text), vSerchType);
  if vIndex > -1 then
  begin
    meoEdit.SelStart := vIndex;
    meoEdit.SelLength := Length(dlgReplace.FindText);
    meoEdit.SetFocus;
  end
  else
    MsgInfo('没有找到字符串' + dlgReplace.FindText + '。');
end;

procedure TfrmEAPubMemoEdit.dlgReplaceReplace(Sender: TObject);
var
  vIndex: Integer;
  vSerchType: TSearchTypes;
begin
  if SameText(meoEdit.SelText, dlgReplace.FindText) then
  begin
    vIndex := meoEdit.SelStart;
    meoEdit.SelText := dlgReplace.ReplaceText;
    meoEdit.SelStart := vIndex + Length(dlgReplace.ReplaceText);
  end;
  if frReplaceAll in dlgReplace.Options then
  begin
    vSerchType := [];
    if frWholeWord in dlgReplace.Options then
      vSerchType := [stWholeWord];
    if frMatchCase in dlgReplace.Options then
      vSerchType := vSerchType + [stMatchCase];

    while True do
    begin
      vIndex := meoEdit.FindText(dlgReplace.FindText, meoEdit.SelStart + meoEdit.SelLength,
        Length(meoEdit.Text), vSerchType);
      if vIndex > -1 then
      begin
        meoEdit.SelStart := vIndex;
        meoEdit.SelLength := Length(dlgReplace.FindText);
        meoEdit.SelText := dlgReplace.ReplaceText;
        meoEdit.SelStart := vIndex + Length(dlgReplace.ReplaceText);
      end
      else begin
        dlgReplace.CloseDialog;
        Exit;
      end;
    end;
  end;
  meoEdit.SetFocus;
end;

procedure TfrmEAPubMemoEdit.ActListUpdate(Action: TBasicAction;
  var Handled: Boolean);
begin
  ActFile_Comeback.Enabled := not FParam.ReadOnly;
  ActEdit_Replace.Enabled := not FParam.ReadOnly;
  ActEdit_Cut.Enabled := (not FParam.ReadOnly) and (meoEdit.SelText <> '');
  ActEdit_Paste.Enabled := (not FParam.ReadOnly) and (meoEdit.Perform(EM_CANPASTE, 0, 0) <> 0);
  ActEdit_Clear.Enabled := ActEdit_Cut.Enabled and (meoEdit.SelText <> '');
  ActEdit_SelectAll.Enabled := meoEdit.Text <> '';
  if meoEdit.HandleAllocated then
    ActEdit_Undo.Enabled := meoEdit.Perform(EM_CANUNDO, 0, 0) <> 0;
end;

end.

⌨️ 快捷键说明

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