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