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

📄 skyemain.pas

📁 SkyEdit是一个可用彩色语法来显示及编辑各种开发语言源代码的编辑器控件。
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit SkyEMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SkyEdit, StdCtrls, ComCtrls, Menus, ShellApi,
  ExtCtrls, StdActns, ActnList, Clipbrd, SkyParser, SkyManager;

type
  TSkyForm = class(TForm)
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    PopupMenu1: TPopupMenu;
    test11: TMenuItem;
    test21: TMenuItem;
    test31: TMenuItem;
    StatusBar1: TStatusBar;
    MainMenu1: TMainMenu;
    ActionList1: TActionList;
    actFileOpen: TAction;
    mnuFile: TMenuItem;
    mnuFileOpen: TMenuItem;
    mnuEdit: TMenuItem;
    mnuTool: TMenuItem;
    mnuHelp: TMenuItem;
    actFileNew: TAction;
    actFileClose: TAction;
    actFileSave: TAction;
    actFileSaveAs: TAction;
    mnuFileNew: TMenuItem;
    mnuFileClose: TMenuItem;
    N2: TMenuItem;
    mnuFileSave: TMenuItem;
    mnuFileSaveAs: TMenuItem;
    N3: TMenuItem;
    actFileExit: TAction;
    mnuFileExit: TMenuItem;
    actEditUndo: TAction;
    actEditCopy: TAction;
    actEditCut: TAction;
    actEditPaste: TAction;
    actEditDel: TAction;
    actEditSelectAll: TAction;
    actToolShowLineNum: TAction;
    actHelpAbout: TAction;
    mnuEditUndo: TMenuItem;
    N4: TMenuItem;
    mnuEditCut: TMenuItem;
    mnuEditCopy: TMenuItem;
    mnuEditPaste: TMenuItem;
    mnuEditDel: TMenuItem;
    N5: TMenuItem;
    mnuEditSelectAll: TMenuItem;
    mnuToolShowLineNum: TMenuItem;
    mnuHelpAbout: TMenuItem;
    SaveDialog1: TSaveDialog;
    SkyEdit2: TSkyEdit;
    PascalSkyParser: TSkyParser;
    actSkyParser: TAction;
    mnuPascalSkyParser: TMenuItem;
    FontDialog1: TFontDialog;
    actFontSet: TAction;
    N1: TMenuItem;
    mnuFontSet: TMenuItem;
    N6: TMenuItem;
    D1: TMenuItem;
    D2: TMenuItem;
    N7: TMenuItem;
    A1: TMenuItem;
    N8: TMenuItem;
    ab21: TMenuItem;
    mnuToolReloadParserFile: TMenuItem;
    mnuIncGutterWidth: TMenuItem;
    mnuDecGutterWidth: TMenuItem;
    actGotoALine: TAction;
    N9: TMenuItem;
    mnuGotoALine: TMenuItem;
    N10: TMenuItem;
    mnuHighLightFileType: TMenuItem;
    mnuNoHighlighting: TMenuItem;
    ab1: TMenuItem;
    N11: TMenuItem;
    mnuUseSpaceReplaceTab: TMenuItem;
    actReadOnly: TAction;
    N12: TMenuItem;
    mnuReadOnly: TMenuItem;
    actUpperCase: TAction;
    actLowerCase: TAction;
    N13: TMenuItem;
    L1: TMenuItem;
    U1: TMenuItem;
    N14: TMenuItem;
    mnuHelpTopic: TMenuItem;
    actEditRedo: TAction;
    mnuEditRedo: TMenuItem;
    R2: TMenuItem;
    actFind: TAction;
    mnuSearch: TMenuItem;
    mnuSearchFindFirst: TMenuItem;
    actFindNext: TAction;
    actFindPrev: TAction;
    actReplace: TAction;
    N15: TMenuItem;
    V1: TMenuItem;
    R3: TMenuItem;
    actFindFirst: TAction;
    actRepAll: TAction;
    actCount: TAction;
    actStatusBar: TAction;
    mnuToolStatusBar: TMenuItem;
    actAskSaveOfExit: TAction;
    mnuToolAskSaveOfExit: TMenuItem;
    procedure SkyEdit2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SkyEdit2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure SkyEdit2KeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure SkyEdit2Change(Sender: TObject);
    procedure actFileOpenExecute(Sender: TObject);
    procedure actFileNewExecute(Sender: TObject);
    procedure actFileCloseExecute(Sender: TObject);
    procedure actFileSaveExecute(Sender: TObject);
    procedure actFileSaveAsExecute(Sender: TObject);
    procedure actFileExitExecute(Sender: TObject);
    procedure actEditUndoExecute(Sender: TObject);
    procedure actEditCutExecute(Sender: TObject);
    procedure actEditCopyExecute(Sender: TObject);
    procedure actEditPasteExecute(Sender: TObject);
    procedure actEditDelExecute(Sender: TObject);
    procedure actEditSelectAllExecute(Sender: TObject);
    procedure actToolShowLineNumExecute(Sender: TObject);
    procedure SkyEdit2SelectionChanged(Sender: TObject);
    procedure actHelpAboutExecute(Sender: TObject);
    procedure actSkyParserExecute(Sender: TObject);
    procedure actFontSetExecute(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ab21Click(Sender: TObject);
    procedure mnuToolReloadParserFileClick(Sender: TObject);
    procedure mnuIncGutterWidthClick(Sender: TObject);
    procedure mnuDecGutterWidthClick(Sender: TObject);
    procedure actGotoALineExecute(Sender: TObject);
    procedure SkyEdit2KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ab1Click(Sender: TObject);
    procedure mnuUseSpaceReplaceTabClick(Sender: TObject);
    procedure SaveDialog1TypeChange(Sender: TObject);
    procedure actReadOnlyExecute(Sender: TObject);
    procedure actLowerCaseExecute(Sender: TObject);
    procedure actUpperCaseExecute(Sender: TObject);
    procedure mnuHelpTopicClick(Sender: TObject);
    procedure actEditRedoExecute(Sender: TObject);
    procedure actFindExecute(Sender: TObject);
    procedure actFindNextExecute(Sender: TObject);
    procedure actFindPrevExecute(Sender: TObject);
    procedure actFindFirstExecute(Sender: TObject);
    procedure actRepAllExecute(Sender: TObject);
    procedure actCountExecute(Sender: TObject);
    procedure actStatusBarExecute(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure actAskSaveOfExitExecute(Sender: TObject);
  private
    { Private declarations }
    m_bMatchCase, m_bWholeWord, m_bBackWard, m_bGlobal, m_bEntire: Boolean;

    m_sCapInfo: String;
    m_sFileName: String;
    m_smrParser: TSkyManager;  //SkyParser 管理器

    m_iOldLeft, m_iOldTop, m_iOldHeight, m_iOldWidth: Integer;

    m_sktSearch: TSkySearchTypes;
    m_sCurFindStr, m_sCurRepStr: String;
    m_slFindStr, m_slRepStr: TStrings;

    m_SearchForm: TCustomForm; //Application.CreateForm之第二参数要求完全一致!

    m_iSearchLeft, m_iSearchTop: Integer;  //搜索窗口之坐标

    procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
    procedure LoadConfigInfo;
    procedure CreateMenuItemOfParser;
    procedure UpdateCaretInfo;
    function AskToSaveWhenModified: Boolean;
    procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
    function LoadFileToSkyEdit(const sFileName: String): Boolean;
    procedure SetSkyParser; overload;
    procedure SetSkyParser(const sFileName: String); overload;
    procedure mnuHighlightingClick(Sender: TObject);
    procedure UpdateReadOnlyInsertModeInfo;
    function GetFileReadOnlyProperty(const sFileName: String): Boolean;
    function MsgBox(const sTip: String; const sTitle: String = 'Sky Editor';
        iFlags: Longint = MB_OK): Integer;

    function FindFormFromScreen(const sFormName: String): TCustomForm;
    function CreateForm(const sFormName: String; AFormClass: TCustomFormClass;
        var AForm: TCustomForm; bShow: Boolean = True): Boolean;

    procedure UpdateSearchInfo(Sender: TObject);

    function GetAppBuildTimeStr: String;

  protected
    procedure CreateParams(var Params: TCreateParams); override;

  public
    { Public declarations }
    property SearchLeft: Integer read m_iSearchLeft write m_iSearchLeft;
    property SearchTop:  Integer read m_iSearchTop  write m_iSearchTop;
  end;

var
  SkyForm: TSkyForm;

implementation

uses Input, SearchE;

{$R *.dfm}

procedure TSkyForm.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
    DroppedFilename : string;
    FileIndex : integer;
    QtyDroppedFiles : integer;
    pDroppedFilename : array [0..MAX_PATH-1] of Char;
begin
  if Msg.Message = WM_DROPFILES then  //接受文件拖放
  begin
    FileIndex := not 0;//not 0 不受integer字长的限制 $FFFFFFFF;
    QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex,
                                     pDroppedFilename, MAX_PATH);
    if(QtyDroppedFiles=0)then exit;
    for FileIndex := 0 to (QtyDroppedFiles - 1) do
      if(DragQueryFile(Msg.WParam, FileIndex,pDroppedFilename, MAX_PATH)<=MAX_PATH)then
      begin
        DroppedFilename := StrPas(pDroppedFilename);
        if FileExists(DroppedFileName) then
        begin
          //if not CreateNewPage(ExtractFileName(DroppedFileName),
          //  DroppedFileName) then break;
          if SkyEdit2.Modified and AskToSaveWhenModified then
            actFileSaveExecute(actFileSave);

          LoadFileToSkyEdit(DroppedFileName);
          Break;
        end;
      end;
    Application.BringToFront;
    DragFinish(Msg.WParam);
    Handled := true;
  end;
end;

procedure TSkyForm.LoadConfigInfo;
var                 //载入配置信息(窗体位置等)
  bIsPas: Boolean;
  idx, k: Integer;
  sCfgFile: String;
  slCfg: TStringList;
begin
  sCfgFile := ChangeFileExt(Application.ExeName, '.sky');
  if FileExists(sCfgFile) then
  begin
    slCfg  := TStringList.Create;
    try
      slCfg.LoadFromFile(sCfgFile);

      idx  := slCfg.IndexOfName('WinLeft');
      if idx >= 0 then
        Left   := StrToIntDef(slCfg.Values['WinLeft'], 20);

      idx  := slCfg.IndexOfName('WinTop');
      if idx >= 0 then
        Top    := StrToIntDef(slCfg.Values['WinTop'], 80);

      idx  := slCfg.IndexOfName('WinHeight');
      if idx >= 0 then
        Height := StrToIntDef(slCfg.Values['WinHeight'], 600);

      idx  := slCfg.IndexOfName('WinWidth');
      if idx >= 0 then
        Width  := StrToIntDef(slCfg.Values['WinWidth'], 800);

      idx  := slCfg.IndexOfName('Maximized');
      if idx >= 0 then
        if StrToIntDef(slCfg.Values['Maximized'], 0) > 0 then
          Self.WindowState := wsMaximized;

      idx  := slCfg.IndexOfName('SkyParser');
      if idx >= 0 then
        bIsPas := Boolean(StrToIntDef(slCfg.Values['SkyParser'], 0))
      else
        bIsPas := False;
      if bIsPas then     //载入语法解析器
        actSkyParser.Checked := True;
        //actSkyParserExecute(actSkyParser);

      idx  := slCfg.IndexOfName('StatusBar');
      if idx >= 0 then
      begin
        actStatusBar.Checked :=
                  Boolean(StrToIntDef(slCfg.Values['StatusBar'],1));
        StatusBar1.Visible   := actStatusBar.Checked;
      end;

      idx  := slCfg.IndexOfName('UseTabKey');
      if idx >= 0 then
        SkyEdit2.UseTabKey := Boolean(StrToIntDef(slCfg.Values['UseTabKey'], 1))
      else
        SkyEdit2.UseTabKey := True;
      mnuUseSpaceReplaceTab.Checked := not SkyEdit2.UseTabKey;

      idx  := slCfg.IndexOfName('TabSpaces');
      if idx >= 0 then
        SkyEdit2.TabSpaces   := StrToIntDef(slCfg.Values['TabSpaces'], 8);

      idx  := slCfg.IndexOfName('GutterWidth');
      if idx >= 0 then
        SkyEdit2.GutterWidth := StrToIntDef(slCfg.Values['GutterWidth'], 30);

      idx  := slCfg.IndexOfName('MatchCase');
      if idx >= 0 then
        m_bMatchCase := Boolean(StrToIntDef(slCfg.Values['MatchCase'], 1))
      else
        m_bMatchCase := True;

      idx  := slCfg.IndexOfName('WholeWord');
      if idx >= 0 then
        m_bWholeWord := Boolean(StrToIntDef(slCfg.Values['WholeWord'], 0));

      idx  := slCfg.IndexOfName('BackWard');
      if idx >= 0 then
        m_bBackWard  := Boolean(StrToIntDef(slCfg.Values['BackWard'], 0));

      idx  := slCfg.IndexOfName('Global');
      if idx >= 0 then
        m_bGlobal    := Boolean(StrToIntDef(slCfg.Values['Global'], 1))
      else
        m_bGlobal    := True;

      idx  := slCfg.IndexOfName('Entire');
      if idx >= 0 then
        m_bEntire    := Boolean(StrToIntDef(slCfg.Values['Entire'], 0));

      idx  := slCfg.IndexOfName('CurFindStr');
      if idx >= 0 then
        m_sCurFindStr := slCfg.Values['CurFindStr'];

      idx  := slCfg.IndexOfName('CurRepStr');
      if idx >= 0 then
        m_sCurRepStr  := slCfg.Values['CurRepStr'];

      k    := 0;
      idx  := slCfg.IndexOfName('FindStr0');
      while idx >= 0 do
      begin
        m_slFindStr.Append(slCfg.Values['FindStr' + IntToStr(k)]);
        Inc(k);
        idx := slCfg.IndexOfName('FindStr' + IntToStr(k));
      end;

      k    := 0;
      idx  := slCfg.IndexOfName('RepStr0');
      while idx >= 0 do
      begin
        m_slRepStr.Append(slCfg.Values['RepStr' + IntToStr(k)]);
        Inc(k);
        idx := slCfg.IndexOfName('RepStr' + IntToStr(k));
      end;

      idx  := slCfg.IndexOfName('SearchLeft');
      if idx >= 0 then
        m_iSearchLeft := StrToIntDef(slCfg.Values['SearchLeft'], 200)
      else
        m_iSearchLeft := 200;

      idx  := slCfg.IndexOfName('SearchTop');
      if idx >= 0 then
        m_iSearchTop  := StrToIntDef(slCfg.Values['SearchTop'], 200)
      else
        m_iSearchTop  := 200;

      idx  := slCfg.IndexOfName('AskSaveOfExit');
      if idx >= 0 then
        actAskSaveOfExit.Checked :=
                         Boolean(StrToIntDef(slCfg.Values['AskSaveOfExit'], 1))
      else
        actAskSaveOfExit.Checked := True;

      m_iOldLeft   := Left;
      m_iOldTop    := Top;
      m_iOldHeight := Height;
      m_iOldWidth  := Width;

⌨️ 快捷键说明

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