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

📄 skyemain.pas

📁 SkyEdit是一个可用彩色语法来显示及编辑各种开发语言源代码的编辑器控件。
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      end;
    finally
      SkyEdit2.EndUpdate;
      SkyEdit2.ReadOnly := GetFileReadOnlyProperty(sFileName);
    end;
    m_sFileName := sFileName;
    SkyEdit2Change(SkyEdit2);
    UpdateCaretInfo;
    UpdateReadOnlyInsertModeInfo;
    Caption     := m_sCapInfo + ' → ' + sFileName;
    Application.Title := Caption;
    Result      := True;
  except
    on E: Exception do
    begin
      Result    := False;
      Application.ShowException(E);
    end;
  end;
end;

procedure TSkyForm.CreateParams(var Params: TCreateParams);
begin              //重命名窗体类名
  inherited;
  StrCopy(Params.WinClassName, 'Sky SkyEditor 2004');
end;

procedure TSkyForm.SetSkyParser;
begin              //根据设置取 SkyParser
  SetSkyParser(m_sFileName);
end;

procedure TSkyForm.SetSkyParser(const sFileName: String);
var                //根据设置取 SkyParser
  idx: Integer;
begin
  if actSkyParser.Checked then
  begin
    SkyEdit2.Parser :=         //PascalSkyParser
        m_smrParser.GetParserByFileExt(ExtractFileExt(sFileName), idx);
    //以下根据语法解析器类型设置菜单项选中状态
    if idx >= 0 then
      mnuHighLightFileType.Items[idx].Checked := True
    else
      mnuHighLightFileType.Items[mnuHighLightFileType.Count -1].Checked := True;
  end
  else
    SkyEdit2.Parser := nil;
end;

procedure TSkyForm.actSkyParserExecute(Sender: TObject);
begin              //采用彩色语法显示
  //actFontSet.Enabled         := actSkyParser.Checked;
  actSkyParser.Checked         := not actSkyParser.Checked;
  SetSkyParser;
  mnuHighLightFileType.Enabled := actSkyParser.Checked;
  //SkyEdit2.Repaint;
end;

procedure TSkyForm.actFontSetExecute(Sender: TObject);
begin              //设置字体
  FontDialog1.Font.Assign(SkyEdit2.Font);
  if FontDialog1.Execute then
    SkyEdit2.Font  := FontDialog1.Font; 
end;


procedure TSkyForm.ab1Click(Sender: TObject);
begin              //test
  SkyEdit2.TabSpaces := SkyEdit2.TabSpaces + 2;
  SkyEdit2.Repaint;
end;

procedure TSkyForm.ab21Click(Sender: TObject);
begin              //test
  SkyEdit2.TabSpaces := SkyEdit2.TabSpaces - 2;
  SkyEdit2.Repaint;
end;

procedure TSkyForm.mnuToolReloadParserFileClick(Sender: TObject);
begin              //重新载入语法文件
  m_smrParser.LoadParserFile(ChangeFileExt(Application.ExeName, '.spr'));
  SetSkyParser;
  SkyEdit2.Repaint;
end;

procedure TSkyForm.mnuIncGutterWidthClick(Sender: TObject);
begin              //test
  SkyEdit2.GutterWidth := SkyEdit2.GutterWidth + 10;
end;

procedure TSkyForm.mnuDecGutterWidthClick(Sender: TObject);
begin              //test
  SkyEdit2.GutterWidth := SkyEdit2.GutterWidth - 10;
end;

procedure TSkyForm.actGotoALineExecute(Sender: TObject);
var                     //跳至某行
  iLineNum: Integer;
  sLineNum: String;
begin
  sLineNum := InputStr('跳转到某行',
                       '请输入行号:(1 - '
                         + IntToStr(SkyEdit2.Lines.Count) + ')',
                       '',
                       32,
                       False,
                       True);
  if sLineNum <> '' then
  begin
    iLineNum := StrToIntDef(sLineNum, 0);
    if (iLineNum > 0) and (iLineNum <= SkyEdit2.Lines.Count) then
    begin
      SkyEdit2.CaretPos := Point(1, iLineNum);
      UpdateCaretInfo;
    end
    else
      MsgBox('您输入的行号不正确,请重新执行。', '提示');
  end;
end;

procedure TSkyForm.mnuHighlightingClick(Sender: TObject);
var                     //各彩色语法显示菜单项之单击事件的实现
  idx: Integer;
begin                   
  if not TMenuItem(Sender).Checked then
    TMenuItem(Sender).Checked := True;

  idx := mnuHighLightFileType.IndexOf(TMenuItem(Sender));
  if (idx >= 0) and (idx < mnuHighLightFileType.Count - 1) then
    SkyEdit2.Parser := m_smrParser.ParserList[idx]
  else
    SkyEdit2.Parser := nil;
end;

procedure TSkyForm.mnuUseSpaceReplaceTabClick(Sender: TObject);
begin                   //test
  SkyEdit2.UseTabKey        := TMenuItem(Sender).Checked;
  TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;
end;

procedure TSkyForm.SaveDialog1TypeChange(Sender: TObject);
var                     //文件类型改变时重置默认“文件扩展名”
  i, idx, iTmp: Integer;
begin
  idx  := 1;
  with SaveDialog1 do
  begin
    for i:=1 to Length(Filter) do
    begin
      if Filter[i] = '|' then
      begin
        Inc(idx);
        if idx = (FilterIndex shl 1) then
        begin
          iTmp := Pos('|', Copy(Filter, i + 3, Length(Filter)));
          if iTmp = 0 then
            iTmp := Length(Filter) + 1;
          SaveDialog1.DefaultExt := Copy(Filter, i + 3, iTmp - 1);
          if Pos('*', SaveDialog1.DefaultExt) > 0 then
            SaveDialog1.DefaultExt := '';
          Break;
        end;
      end;
    end;
  end;
end;

procedure TSkyForm.actReadOnlyExecute(Sender: TObject);
begin              //只读
  actReadOnly.Checked := not actReadOnly.Checked;
  SkyEdit2.ReadOnly   := actReadOnly.Checked;
  UpdateReadOnlyInsertModeInfo;
end;

procedure TSkyForm.UpdateReadOnlyInsertModeInfo;
begin
  if SkyEdit2.ReadOnly then
    StatusBar1.Panels.Items[3].Text   := '只读'
  else
  begin
    if SkyEdit2.InsertMode then
      StatusBar1.Panels.Items[3].Text := '插入'
    else
      StatusBar1.Panels.Items[3].Text := '改写';
  end;
  if actReadOnly.Checked <> SkyEdit2.ReadOnly then
    actReadOnly.Checked := SkyEdit2.ReadOnly;
end;

function TSkyForm.GetFileReadOnlyProperty(const sFileName: String): Boolean;
var                 //文件是否为“只读”???
  dwFileAttr: DWORD;
begin
  Result := False;
  dwFileAttr := GetFileAttributes(PChar(sFileName));
  if (dwFileAttr <> $FFFFFFFF)
        and (dwFileAttr and FILE_ATTRIBUTE_READONLY <> 0) then
    Result := True;
end;

function TSkyForm.MsgBox(const sTip: String; const sTitle: String;
        iFlags: Longint): Integer;
begin
  Result := Application.MessageBox(PChar(sTip), PChar(sTitle), iFlags);
end;

procedure TSkyForm.actLowerCaseExecute(Sender: TObject);
begin
  SkyEdit2.SelText := LowerCase(SkyEdit2.SelText); //转换为小写
end;

procedure TSkyForm.actUpperCaseExecute(Sender: TObject);
begin
  SkyEdit2.SelText := UpperCase(SkyEdit2.SelText); //转换为大写
end;

procedure TSkyForm.mnuHelpTopicClick(Sender: TObject);
begin
  ShellExecute(Handle,
               'open',
               PChar(ChangeFileExt(Application.ExeName, '.chm')),
               nil,
               nil,
               SW_SHOW);
end;

function TSkyForm.FindFormFromScreen(const sFormName: String): TCustomForm;
var                //通过名称查找窗体
  I: Integer;
begin
  Result := nil;
  for I := 0 to Screen.CustomFormCount-1 do
    if Screen.CustomForms[I].Name = sFormName then
    begin
      Result := Screen.CustomForms[I];
    end;
end;

function TSkyForm.CreateForm(const sFormName: String;
              AFormClass: TCustomFormClass; var AForm: TCustomForm;
              bShow: Boolean): Boolean;
begin              //创建窗体
  Result := False;
  AForm  := FindFormFromScreen(sFormName);
  if AForm = nil then
  begin
    Application.CreateForm(AFormClass, AForm);
    Result := True;
  end;
  if bShow then
    AForm.Show;
end;

procedure TSkyForm.UpdateSearchInfo(Sender: TObject);
begin
  if Sender is TSearchForm then
    with TSearchForm(Sender) do
    begin
      m_bMatchCase  := ckxMatchCase.Checked;
      m_bWholeWord  := ckxWholeWord.Checked;
      m_bBackWard   := rgpDirection.ItemIndex > 0;
      m_bGlobal     := rgpScope.ItemIndex = 0;
      m_bEntire     := rgpOrigin.ItemIndex = 0;

      m_sktSearch   := [];
      if m_bMatchCase then Include(m_sktSearch, sktMatchCase);
      if m_bWholeWord then Include(m_sktSearch, sktWholeWord);
      if m_bBackWard  then Include(m_sktSearch, sktBackWard);
      if m_bGlobal    then Include(m_sktSearch, sktGlobal);
      if m_bEntire    then Include(m_sktSearch, sktEntireScope);

      m_sCurFindStr := cbxFind.Text;
      m_sCurRepStr  := cbxReplace.Text;
      m_slFindStr.Assign(cbxFind.Items);
      m_slRepStr.Assign(cbxReplace.Items);

      //m_iSearchLeft := Left;   放到SearchForm.FormDestroy中处理
      //m_iSearchTop  := Top;    2004.12.21
    end;
end;

procedure TSkyForm.actFindExecute(Sender: TObject);
var                //查找第一个 / 替换
  bFind, bCreateForm: Boolean;
  sCursorWord: String;
begin
  bFind := (Sender = actFind);
  bCreateForm := CreateForm('SearchForm', TSearchForm, m_SearchForm, False);
  with TSearchForm(m_SearchForm) do
  begin
    if bCreateForm then     //是刚创建的“搜索窗口”?
    begin
      m_EventUpdateSearchInfo := UpdateSearchInfo;
      cbxFind.Items.Assign(m_slFindStr);
      cbxReplace.Items.Assign(m_slRepStr);
      //2004.12.29 SkyEdit暂只支持查找/替换串为单行文本的情形
      if (SkyEdit2.SelLength > 0) //有选中文本则查找选中文本
          and (SkyEdit2.BlockBegin.Y = SkyEdit2.BlockEnd.Y) then
        cbxFind.Text    := SkyEdit2.SelText
      else                        //否则
      begin
        sCursorWord     := SkyEdit2.CursorWord;
        if sCursorWord <> '' then //当前光标处有词语,则找该词语
          cbxFind.Text  := sCursorWord
        else
          cbxFind.Text  := m_sCurFindStr;
      end;
      cbxReplace.Text := m_sCurRepStr;
      ckxMatchCase.Checked   := m_bMatchCase;
      ckxWholeWord.Checked   := m_bWholeWord;
      rgpDirection.ItemIndex := Integer(m_bBackWard);
      rgpScope.ItemIndex     := Integer(not m_bGlobal);
      rgpOrigin.ItemIndex    := Integer(not m_bEntire);
    end;
    SetSearchType(bFind);
    Show;
  end;
end;

procedure TSkyForm.actFindFirstExecute(Sender: TObject);
var                //真正的找第一个之方法实现
  ptFindPos: TPoint;
begin
  with SkyEdit2 do
    if not Find(m_sCurFindStr, BlockBegin, BlockEnd, m_sktSearch, ptFindPos)then
      MsgBox('字符串没找到!');
end;

procedure TSkyForm.actFindNextExecute(Sender: TObject);
var                //找下一个
  ptFindPos: TPoint;
begin
  Exclude(m_sktSearch, sktEntireScope);
  Exclude(m_sktSearch, sktBackWard);
  with SkyEdit2 do
    if not Find(m_sCurFindStr, BlockBegin, BlockEnd, m_sktSearch, ptFindPos)then
      MsgBox('字符串没找到!');
end;

procedure TSkyForm.actFindPrevExecute(Sender: TObject);
var                //找上一个
  ptFindPos: TPoint;
begin
  Exclude(m_sktSearch, sktEntireScope);
  Include(m_sktSearch, sktBackWard);
  with SkyEdit2 do
    if not Find(m_sCurFindStr, BlockBegin, BlockEnd, m_sktSearch, ptFindPos)then
      MsgBox('字符串没找到!');
end;

procedure TSkyForm.actRepAllExecute(Sender: TObject);
var                //全部替换之方法实现
  iRepCount: Integer;
begin
  if SkyEdit2.ReadOnly then
  begin
    MsgBox('当前文档为只读,不能进行全部替换!');
    Exit;
  end;

  Include(m_sktSearch, sktReplaceAll);
  with SkyEdit2 do
    iRepCount := ReplaceAll(m_sCurFindStr, m_sCurRepStr,
                            BlockBegin, BlockEnd, m_sktSearch);
  if iRepCount = 0 then
    MsgBox('未找到字符串【' + m_sCurFindStr + '】。')
  else
    MsgBox('替换 ' + IntToStr(iRepCount) + ' 处。');
  Exclude(m_sktSearch, sktReplaceAll);
end;

procedure TSkyForm.actCountExecute(Sender: TObject);
var                //计数之方法实现
  iCount: Integer;
begin
  with SkyEdit2 do
    iCount := Count(m_sCurFindStr, BlockBegin, BlockEnd, m_sktSearch);
  MsgBox('找到 ' + IntToStr(iCount) + ' 处。');
end;

procedure TSkyForm.actStatusBarExecute(Sender: TObject);
begin              //显示隐藏状态栏
  actStatusBar.Checked := not actStatusBar.Checked;
  StatusBar1.Visible   := actStatusBar.Checked;
end;

procedure TSkyForm.actAskSaveOfExitExecute(Sender: TObject);
begin              //程序退出时若当前文档已修改则询问是否保存
  actAskSaveOfExit.Checked := not actAskSaveOfExit.Checked;
end;

end.

⌨️ 快捷键说明

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