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

📄 skyemain.pas

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

procedure TSkyForm.CreateMenuItemOfParser;
var                //创建各语法显示菜单项
  i: Integer;
  mnuAParser: TMenuItem;
begin
  //以下循环选将所有语法显示菜单项清空
  for i := mnuHighLightFileType.Count - 1 downto 0 do
    mnuHighLightFileType.Items[i].Free;
  //从SkyManager中载入所有已定义的“语法解析器”菜单项
  for i := 0 to m_smrParser.ParserCount - 1 do
  begin
    mnuAParser := TMenuItem.Create(mnuHighLightFileType);
    with mnuAParser do
    begin
      Caption   := m_smrParser.ParserList[i].LanguageName;
      RadioItem := True;
      OnClick   := mnuHighlightingClick;
    end;
    mnuHighLightFileType.Add(mnuAParser);
  end;
  //无设是否有预定义的语法解析器,都添加一个“无彩色语法显示”的菜单项
  mnuAParser := TMenuItem.Create(mnuHighLightFileType);
  with mnuAParser do
  begin
    Caption   := '无彩色语法显示';
    RadioItem := True;
    OnClick   := mnuHighlightingClick;
    Checked   := True;  //系统默认为“无彩色语法显示”
  end;
  mnuHighLightFileType.Add(mnuAParser);
end;

procedure TSkyForm.FormCreate(Sender: TObject);
begin
  m_sCapInfo        := Caption;
  Application.Title := Caption;
  m_slFindStr       := TStringList.Create;
  m_slRepStr        := TStringList.Create;

  LoadConfigInfo;   //载入配置信息

  StatusBar1.Panels.Items[3].Text := '插入';
  SkyEdit2SelectionChanged(SkyEdit2);
  UpdateCaretInfo;
  m_sFileName := '';
  SkyEdit2.Modified := False;

  DragAcceptFiles(Handle,true); //支持文件拖放
  Application.OnMessage := AppMessage;

  Application.Title := Caption;

  m_smrParser := TSkyManager.Create(Self,
                                    ChangeFileExt(Application.ExeName, '.spr'));
  CreateMenuItemOfParser;       //创建各语法显示菜单项

  if ParamCount() > 0 then      //接受传入的文件名参数并打开文件
  begin
    if FileExists(ParamStr(1)) then
      LoadFileToSkyEdit(ParamStr(1));
  end;
end;

procedure TSkyForm.FormDestroy(Sender: TObject);
var
  bMax: Boolean;
  slCfg: TStringList;
  idx: Integer;
begin
  m_smrParser.Free;

  slCfg  := TStringList.Create;
  try
    bMax := Self.WindowState = wsMaximized;
    if not bMax then
    begin
      m_iOldLeft   := Left;
      m_iOldTop    := Top;
      m_iOldHeight := Height;
      m_iOldWidth  := Width;
    end;
    slCfg.Append('WinLeft='     + IntToStr(m_iOldLeft));
    slCfg.Append('WinTop='      + IntToStr(m_iOldTop));
    slCfg.Append('WinHeight='   + IntToStr(m_iOldHeight));
    slCfg.Append('WinWidth='    + IntToStr(m_iOldWidth));
    slCfg.Append('Maximized='   + IntToStr(Integer(bMax)));
    slCfg.Append('SkyParser='   + IntToStr(Integer(actSkyParser.Checked)));
    slCfg.Append('StatusBar='   + IntToStr(Integer(actStatusBar.Checked)));
    slCfg.Append('UseTabKey='   + IntToStr(Integer(SkyEdit2.UseTabKey)));
    slCfg.Append('TabSpaces='   + IntToStr(SkyEdit2.TabSpaces));
    slCfg.Append('GutterWidth=' + IntToStr(SkyEdit2.GutterWidth));
    slCfg.Append('MatchCase='   + IntToStr(Integer(m_bMatchCase)));
    slCfg.Append('WholeWord='   + IntToStr(Integer(m_bWholeWord)));
    slCfg.Append('BackWard='    + IntToStr(Integer(m_bBackWard)));
    slCfg.Append('Global='      + IntToStr(Integer(m_bGlobal)));
    slCfg.Append('Entire='      + IntToStr(Integer(m_bEntire)));
    slCfg.Append('CurFindStr='  + m_sCurFindStr);
    slCfg.Append('CurRepStr='   + m_sCurRepStr);
    for idx := 0 to m_slFindStr.Count - 1 do
      slCfg.Append('FindStr' + IntToStr(idx) + '=' + m_slFindStr.Strings[idx]);
    for idx := 0 to m_slRepStr.Count - 1 do
      slCfg.Append('RepStr' + IntToStr(idx) + '=' + m_slRepStr.Strings[idx]);
    slCfg.Append('SearchLeft='   + IntToStr(m_iSearchLeft));
    slCfg.Append('SearchTop='    + IntToStr(m_iSearchTop));
    slCfg.Append('AskSaveOfExit='+ IntToStr(Integer(actAskSaveOfExit.Checked)));
    slCfg.SaveToFile(ChangeFileExt(Application.ExeName, '.sky'));
  finally
    slCfg.Free;
    m_slFindStr.Free;
    m_slRepStr.Free;
  end;
end;

procedure TSkyForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin              //关闭时如有文件未保存,则询问是否保存
  if actAskSaveOfExit.Checked and SkyEdit2.Modified then
  begin
    case MsgBox('当前文本已修改,保存它吗?', '询问',
                MB_YESNOCANCEL or MB_ICONQUESTION) of
      IDYES:    actFileSaveExecute(Sender);
      IDCANCEL: CanClose := False;
      IDNO:     ;
    end;
  end;
end;

procedure TSkyForm.UpdateCaretInfo;
begin              //刷新“行:列”信息
  StatusBar1.Panels.Items[1].Text := Format('%d:%d',
                                            [SkyEdit2.CurRow, SkyEdit2.CurCol]);
  //以下为测试用代码  2004.12.25
  StatusBar1.Panels.Items[5].Text := Format('%d:%d    %d:%d',
                    [SkyEdit2.CursorXY.X, SkyEdit2.CursorXY.Y,
                     SkyEdit2.CursorXYOrigin.X, SkyEdit2.CursorXYOrigin.Y]);
end;

procedure TSkyForm.SkyEdit2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  UpdateCaretInfo;
end;

procedure TSkyForm.SkyEdit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Shift = [] then
  begin
    case Key of
      VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT, VK_DELETE,
      VK_HOME, VK_END, VK_BACK, VK_TAB, VK_RETURN:
        UpdateCaretInfo;

      VK_INSERT:
        if not SkyEdit2.ReadOnly then
        begin
          UpdateReadOnlyInsertModeInfo;
        end;
    end;
  end
  {else if ssCtrl in Shift then
  begin
    UpdateCaretInfo;
  end; }
end;

procedure TSkyForm.SkyEdit2KeyPress(Sender: TObject; var Key: Char);
begin
  //if Key >= ' ' then
  //  UpdateCaretInfo;
end;

procedure TSkyForm.SkyEdit2KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key >= VK_PRIOR) and (Key <= VK_DOWN) then
  begin                 //方向键、翻页键(PageUp|PageDown)、Home|End
    UpdateCaretInfo;
  end;
end;

procedure TSkyForm.SkyEdit2Change(Sender: TObject);
var
  sInfo: String;
begin
  if SkyEdit2.Modified then
    sInfo := '已修改'
  else
    sInfo := '';
  StatusBar1.Panels.Items[2].Text := sInfo;

  actFileSave.Enabled := SkyEdit2.Modified;
  actEditUndo.Enabled := SkyEdit2.CanUndo;
  actEditRedo.Enabled := SkyEdit2.CanRedo;

  UpdateCaretInfo();
end;

function TSkyForm.AskToSaveWhenModified: Boolean;
begin            //询问是否保存当前文本
  Result := (Application.MessageBox('当前文本已修改,保存它吗?', '询问',
                                   MB_YESNO or MB_ICONQUESTION) = IDYES);
end;

procedure TSkyForm.actFileOpenExecute(Sender: TObject);
begin            //打开文档
  if SkyEdit2.Modified and AskToSaveWhenModified then
    actFileSaveExecute(Sender);
  if OpenDialog1.Execute then
  begin
    LoadFileToSkyEdit(OpenDialog1.FileName);
  end;
end;

procedure TSkyForm.actFileNewExecute(Sender: TObject);
begin            //新建文档(注意:这里的SkyParser沿用最近一次的设置!!!)
  if SkyEdit2.Modified and AskToSaveWhenModified then
    actFileSaveExecute(Sender);
  m_sFileName       := '';
  if SkyEdit2.ReadOnly then
    SkyEdit2.ReadOnly := False;   //不能少!2004.12.22
  SkyEdit2.Lines.Clear;
  SkyEdit2.Modified := False;
  SkyEdit2Change(SkyEdit2);
  UpdateReadOnlyInsertModeInfo;
  //UpdateCaretInfo;
  Caption   := m_sCapInfo;
  Application.Title := m_sCapInfo;
end;

procedure TSkyForm.actFileCloseExecute(Sender: TObject);
begin            //关闭当前文档

end;

procedure TSkyForm.actFileSaveExecute(Sender: TObject);
begin            //保存当前文档
  if SkyEdit2.Modified then
    if m_sFileName = '' then
      actFileSaveAsExecute(Sender)
    else
    begin
      SkyEdit2.Lines.SaveToFile(m_sFileName);
      SkyEdit2Change(SkyEdit2);
    end;
end;

procedure TSkyForm.actFileSaveAsExecute(Sender: TObject);
begin            //将当前文档换名保存
  if SaveDialog1.Execute then
  begin
    SkyEdit2.Lines.SaveToFile(SaveDialog1.FileName);
    m_sFileName := SaveDialog1.FileName;
    Caption     := m_sCapInfo + ' → ' + SaveDialog1.FileName;
    Application.Title := Caption;
    SkyEdit2Change(SkyEdit2);
  end;
end;

procedure TSkyForm.actFileExitExecute(Sender: TObject);
begin            //退出程序
  Self.Close;
end;

procedure TSkyForm.actEditUndoExecute(Sender: TObject);
begin            //撤消
  SkyEdit2.Undo;
end;

procedure TSkyForm.actEditRedoExecute(Sender: TObject);
begin            //恢复
  SkyEdit2.Redo;
end;

procedure TSkyForm.actEditCutExecute(Sender: TObject);
begin            //剪切到剪贴板
  if Self.Focused or SkyEdit2.Focused then
    SkyEdit2.CutToClipboard;
end;

procedure TSkyForm.actEditCopyExecute(Sender: TObject);
begin            //复制到剪贴板
  if Self.Focused or SkyEdit2.Focused then
    SkyEdit2.CopyToClipboard;
end;

procedure TSkyForm.actEditPasteExecute(Sender: TObject);
begin            //从剪贴板粘贴
  if Self.Focused or SkyEdit2.Focused then
    SkyEdit2.PasteFromClipboard;
end;

procedure TSkyForm.actEditDelExecute(Sender: TObject);
begin            //删除选中文本
  if Self.Focused or SkyEdit2.Focused then
    SkyEdit2.SelText := '';
end;

procedure TSkyForm.actEditSelectAllExecute(Sender: TObject);
begin            //选中全部文本
  if Self.Focused or SkyEdit2.Focused then
    SkyEdit2.SelectAll;
end;

procedure TSkyForm.actToolShowLineNumExecute(Sender: TObject);
begin              //显示行号
  SkyEdit2.ShowLineNum       := not SkyEdit2.ShowLineNum;
  actToolShowLineNum.Checked := SkyEdit2.ShowLineNum;
end;

procedure TSkyForm.SkyEdit2SelectionChanged(Sender: TObject);
var                //选中文本发生变化时设置各按钮
  bHaveSel: Boolean;
begin
  bHaveSel := (SkyEdit2.SelLength > 0);
  //actEditUndo.Enabled := SkyEdit2.CanUndo;
  //actEditRedo.Enabled := SkyEdit2.CanRedo;
  actEditCut.Enabled   := bHaveSel;
  actEditCopy.Enabled  := bHaveSel;
  actEditDel.Enabled   := bHaveSel;
  actEditPaste.Enabled := (ClipBoard.AsText <> '');
  //actEditSelectAll.Enabled := (SkyEdit2.GetTextLen <> SkyEdit2.SelLength);
  UpdateCaretInfo();
end;

function TSkyForm.GetAppBuildTimeStr: String;
var                //取程序之“修改时间”(一般也为最后编译时间)
  ftSelf, ftLocal: TFileTime;
  stTmp: TSystemTime;
  iAppFile: Integer;
begin
  Result   := '';
  iAppFile := FileOpen(Application.ExeName, fmOpenRead);
  if (iAppFile >= 0) and GetFileTime(iAppFile, nil, nil, @ftSelf) then
  begin
    if FileTimeToLocalFileTime(ftSelf, ftLocal)
       and FileTimeToSystemTime(ftLocal, stTmp) then
    begin
      Result := Format('%.4d-%.2d-%.2d %.2d:%.2d:%.2d',
                       [stTmp.wYear, stTmp.wMonth, stTmp.wDay,
                          stTmp.wHour, stTmp.wMinute, stTmp.wSecond]);
    end;
  end;
  FileClose(iAppFile);
end;

procedure TSkyForm.actHelpAboutExecute(Sender: TObject);
begin              //关于
  ShellAbout(Handle,
             PChar(Application.Title + ' V1.2#怎么能弄那么多钱?'),
             PChar('谢谢使用!请不要花太多的钱!'
                   + #13#10'Build:' + GetAppBuildTimeStr()),
             Application.Icon.Handle);
end;

procedure TSkyForm.WMCopyData(var Message: TWMCopyData);
var                //接收另一实例发来的文件名并打开
  sFileName: String;
begin
  if Message.CopyDataStruct.cbData = 0 then
  begin
    if IsIconic(Application.Handle) then
      Application.Restore;
  end
  else
  begin
    sFileName := StrPas(PChar(Message.CopyDataStruct.lpData));
    if FileExists(sFileName) then
    begin
      if SkyEdit2.Modified and AskToSaveWhenModified then
        actFileSaveExecute(actFileSave);

      LoadFileToSkyEdit(sFileName);
    end;
  end;
  Message.Result := 1;
end;

function TSkyForm.LoadFileToSkyEdit(const sFileName: String): Boolean;
begin             
  try             //将文件载入SkyEdit
    SkyEdit2.BeginUpdate;
    try
      SkyEdit2.ReadOnly := False;  //不可少,因只读时SkyEdit将不会改变文本内容
      SkyEdit2.BeginParser;
      try
        SetSkyParser(sFileName);
        SkyEdit2.Lines.LoadFromFile(sFileName);
      finally
        SkyEdit2.EndParser;

⌨️ 快捷键说明

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