📄 skyemain.pas
字号:
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 + -