📄 fdoc.pas
字号:
unit fDoc;
interface
uses
Windows, Messages, strUtils, SysUtils, Variants, Classes, Graphics, Forms,
Dialogs,StdCtrls, IniFiles, Controls, SynEdit, ShellAPI,
SynCompletionProposal, SynEditPlugins, SynMacroRecorder, Grids, hexEditor, uOptVars,
SynSpellCheck, ExtCtrls, Menus, ComCtrls, ToolWin, ImgList,SynEditHighlighter,
Tabs, SynEditSearch, SynEditRegexSearch, SynEditMiscClasses, SynEditTypes,
jpeg, UHighlighterProcs, SynEditPrintPreview, Buttons, SynEditTextBuffer, uTypes;
type
TfrmDoc = class(TForm)
pnlLang: TPanel;
pnlHold: TPanel;
hxMain: THexEditor;
imgKey: TImage;
imgLang: TImage;
cmbLang: TComboBox;
cmbKeywords: TComboBox;
sciMain: TSynEdit;
pnlPrintPreview: TPanel;
pnlPrintPreviewNavigation: TPanel;
pnlPrintPreviewNavigationRight: TPanel;
Label1: TLabel;
chbLineNumbers: TCheckBox;
edtZoom: TEdit;
UpDown1: TUpDown;
pnlClient: TPanel;
spbtnClose: TSpeedButton;
spbtnPrint: TSpeedButton;
spbtnLast: TSpeedButton;
spbtnNextPage: TSpeedButton;
spbtnPreviousPage: TSpeedButton;
spbtnFirst: TSpeedButton;
lbPage: TLabel;
SynEditPrintPreview: TSynEditPrintPreview;
popEdit: TPopupMenu;
Undo2: TMenuItem;
Redo2: TMenuItem;
N46: TMenuItem;
Cut2: TMenuItem;
AppendCut2: TMenuItem;
Copy2: TMenuItem;
AppendCopy2: TMenuItem;
Paste2: TMenuItem;
Delete2: TMenuItem;
N47: TMenuItem;
SelectAll2: TMenuItem;
N50: TMenuItem;
HexEdit2: TMenuItem;
N48: TMenuItem;
CheckSpelling2: TMenuItem;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure sciMainMacroRecord(Sender: TObject; message, wParam,
lParam: Integer);
procedure FormCreate(Sender: TObject);
procedure sciMainStatusChange(Sender: TObject;
Changes: TSynStatusChanges);
procedure sciMainPaintTransient(Sender: TObject; Canvas: TCanvas;
TransientType: TTransientType);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure sciMainReplaceText(Sender: TObject; const ASearch,
AReplace: String; Line, Column: Integer;
var Action: TSynReplaceAction);
procedure cmbLangChange(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cmbKeywordsChange(Sender: TObject);
procedure spbtnCloseClick(Sender: TObject);
procedure spbtnFirstClick(Sender: TObject);
procedure spbtnPreviousPageClick(Sender: TObject);
procedure spbtnNextPageClick(Sender: TObject);
procedure spbtnLastClick(Sender: TObject);
procedure edtZoomChange(Sender: TObject);
procedure chbLineNumbersClick(Sender: TObject);
procedure spbtnPrintClick(Sender: TObject);
procedure cmbKeywordsDropDown(Sender: TObject);
private
m_sFileName: String;
m_sFTPFileName: String;
fPrevBrack1, fPrevBrack2: TPoint;
bUpdate: Boolean;
bModified: Boolean;
sHighlighter: String;
{ Private declarations }
function GetsciMainState: string;
public
strMacro: TStringList;
fLineBreak: TLineBreak;
propFile: String;
bHexMode: Boolean;
pKeywords: String;
pWords: PChar;
findFlags: TSynSearchOptions;
findString: String;
bDestroying: Boolean;
LineInt: Integer;
LineStore: TStringList;
XY: Integer;
// bfMatchWholeWord, bfMatchCase, bfFromCaret, bfSelText: Boolean;
isFTP: Boolean;
cString: String;
FTPName: String;
FTPDir: String;
{ Public declarations }
procedure LoadSettings;
procedure SetHigh(str: String);
procedure ShowPropertiesDialog;
procedure NeedUpdateFunc(Y: Integer);
procedure DoUpdateCaption;
procedure DoFormatLines;
procedure ListFunctions;
procedure ListFunctionsY(Y: Integer; Y2: Integer);
procedure UpdatePageLabel;
procedure Print;
property FileName: String Read m_sFileName Write m_sFileName;
property FTPFileName: String Read m_sFTPFileName Write m_sFTPFileName;
end;
var
frmDoc: TfrmDoc;
implementation
uses dlgFileProperties, fMain, dMain, dlgConfirmReplace, fOpenWindows;
{$R *.dfm}
resourcestring
SInsert = 'Insert';
SOverwrite = 'Overwrite';
SReadOnly = 'Read Only';
procedure TfrmDoc.FormClose(Sender: TObject; var Action: TCloseAction);
var
idx: Integer;
begin
idx := frmMain.tcFiles.Tabs.IndexOfObject(Self);
With sciMain do begin
dmMain.actToggle0.Checked := false;
dmMain.actToggle1.Checked := false;
dmMain.actToggle2.Checked := false;
dmMain.actToggle3.Checked := false;
dmMain.actToggle4.Checked := false;
dmMain.actToggle5.Checked := false;
dmMain.actToggle6.Checked := false;
dmMain.actToggle7.Checked := false;
dmMain.actToggle8.Checked := false;
dmMain.actToggle9.Checked := false;
end;
if idx > -1 then begin
frmMain.tcFiles.Tabs.Delete(idx);
end;
dmMain.actEditHex.Checked := false;
dmMain.SynAutoCorrect.Editor := sciMain;
{ if frmMain.MDIChildCount = 1 then
dmMain.SynAutoCorrect.Destroy;
//dmMain.SynAutoCorrect.Editor := nil;}
Action := caFree;
end;
procedure TfrmDoc.FormActivate(Sender: TObject);
var
idx: integer;
i: integer;
begin
for I:= 0 to frmMain.LineBreak1.Count - 1 do
if frmMain.LineBreak1.Items[i].Tag = Integer(fLineBreak) then
frmMain.LineBreak1.Items[i].Checked := true
else
frmMain.LineBreak1.Items[i].Checked := false;
With sciMain do begin
dmMain.actToggle0.Checked := IsBookmark(0);
dmMain.actToggle1.Checked := IsBookmark(1);
dmMain.actToggle2.Checked := IsBookmark(2);
dmMain.actToggle3.Checked := IsBookmark(3);
dmMain.actToggle4.Checked := IsBookmark(4);
dmMain.actToggle5.Checked := IsBookmark(5);
dmMain.actToggle6.Checked := IsBookmark(6);
dmMain.actToggle7.Checked := IsBookmark(7);
dmMain.actToggle8.Checked := IsBookmark(8);
dmMain.actToggle9.Checked := IsBookmark(9);
frmMain.oggleBookmark1.Checked := IsBookMark(0);
frmMain.oggleBookmark10.Checked := IsBookMark(9);
frmMain.oggleBookmark2.Checked := IsBookMark(1);
frmMain.oggleBookmark3.Checked := IsBookMark(2);
frmMain.oggleBookmark4.Checked := IsBookMark(3);
frmMain.oggleBookmark5.Checked := IsBookMark(4);
frmMain.oggleBookmark6.Checked := IsBookMark(5);
frmMain.oggleBookmark7.Checked := IsBookMark(6);
frmMain.oggleBookmark8.Checked := IsBookMark(7);
frmMain.oggleBookmark9.Checked := IsBookMark(8);
end;
with frmMain do begin
dmMain.actEditHex.Checked := bHexMode;
frmMain.HexEdit1.Checked := bHexMode;
frmMain.tbbHex.Down := bHexMode;
dmMain.actEditModified.Checked := sciMain.Modified;
frmMain.Modified1.Checked := sciMain.Modified;
dmMain.actEditReadOnly.Checked := sciMain.ReadOnly;
frmMain.Readonly1.Checked := sciMain.ReadOnly;
end;
idx := frmMain.tcFiles.Tabs.IndexOfObject(Self);
sciMainStatusChange(nil, []);
if (idx > -1) and (idx <> frmMain.tcFiles.TabIndex) then begin
frmMain.tcFiles.TabIndex := idx;
frmMain.tcFilesChange(nil);
end;
if frmMain.tbbMacRec.Down then begin
frmMain.tbbMacRec.Down := False;
frmMain.tbbMacRecClick(nil);
end;
dmMain.SynAutoCorrect.Editor := sciMain;
dmMain.synSpell.Editor := sciMain;
if (sciMain.Highlighter = nil) then begin
dmMain.SetSelLang('');
exit; // This next step can be ignored if there's no highlighter
end;
dmMain.SetSelLang(sciMain.Highlighter.LanguageName);
sciMain.SetFocus;
Windows.SetFocus(sciMain.Handle);
end;
procedure TfrmDoc.ListFunctionsY(Y: Integer; Y2: integer);
var
ptCaret: TPoint;
i,b,c,l,g,m,x: Integer;
idx: Integer;
d: PChar;
OnlySpaces: Boolean;
attr: TSynHighlighterAttributes;
mf: String;
s: String;
begin
ptCaret := sciMain.CaretXY;
if sciMain.Highlighter = nil then exit;
if sciMain.Highlighter.FunctionKeys.Count = 0 then exit;
for m:=y to y2 - 1 do begin
for g := 0 to sciMain.Highlighter.FunctionKeys.Count - 1 do begin
i:= Pos(sciMain.Highlighter.FunctionKeys[g], LOwerCase(sciMain.Lines[m]));
d := PChar(sciMain.Highlighter.FunctionKeys[g]);
OnlySpaces := false;
if i <> 0 then begin
if (i > 1) and (sciMain.Highlighter.CanhaveCharsBefore = false) then begin
for x := 1 to i do begin
if (OnlySpaces = False) and (d[x] <> ' ') and (d[x] <> '') and (x <> i) then begin
OnlySpaces := True;
end;
end;
end;
ptCaret.X := i;
ptCaret.y := m;
sciMain.GetHighlighterAttriAtRowCol(ptCaret, mf, attr);
if (onlySpaces = false) and (attr = sciMain.Highlighter.CommentAttribute) then
OnlySpaces := True;
if OnlySpaces = False then begin
s := RightStr(sciMain.Lines[m], StrLen(PChar(sciMain.Lines[m])) - StrLen(PChar(sciMain.Highlighter.FunctionKeys[g]))-i);
d := PChar(s);
{if d[0]= ' ' then begin
l := 1;
end;}
idx := -1;
for c := cmbKeywords.Items.Count - 1 downto 0 do begin
if Integer(cmbKeywords.Items.Objects[c]) = (m+1) then begin
cmbKeywords.Items.Delete(c);
end;
end;
if idx = -1 then idx := cmbKeywords.Items.Count;
//if l > 0 then begin
s := Rightstr(sciMain.Lines[m], strLen(PChar(s)));
if (cmbKeywords.Items.IndexOf(s) = -1) then
cmbKeywords.Items.InsertObject(idx, s, TOBject(m+1));
end;
end;
end;
end;
end;
procedure TfrmDoc.LoadSettings;
begin
{ sciMain - Options Pane }
sciMain.SetOptionFlag(eoAutoIndent, bAutoIndent);
sciMain.SetOptionFlag(eoAltSetsColumnMode, bAltSetsColumnMode);
sciMain.SetOptionFlag(eoDragDropEditing, bDragDropEditing);
sciMain.SetOptionFlag(eoDropFiles, bDragDropFiles);
sciMain.SetOptionFlag(eoKeepCaretX, bMaintainCaretColumn);
sciMain.WantTabs := bWantTabs;
sciMain.SetOptionFlag(eoSmartTabs, bSmartTabs);
sciMain.SetOptionFlag(eoSmartTabDelete, bSmartTabDelete);
sciMain.SetOptionFlag(eoRightMouseMovesCursor, bRightMouseMovesCursor);
sciMain.SetOptionFlag(eoEnhanceHomeKey, bEnhanceHomeKey);
sciMain.SetOptionFlag(eoHideShowScrollBars, bHideScrollBarsAsNeeded);
sciMain.SetOptionFlag(eoHalfPageScroll, bHalfPageScroll);
sciMain.SetOptionFlag(eoScrollbyOneLess, bScrollByOneLess);
sciMain.SetOptionFlag(eoScrollPastEOF, bScrollPastEndOfFile);
sciMain.SetOptionFlag(eoScrollPastEOL, bScrollPastEndofLine);
sciMain.SetOptionFlag(eoShowScrollHint, bShowScrollHint);
sciMain.SetOptionFlag(eoScrollHintFollows, bScrollHintFollowsMouse);
sciMain.SetOptionFlag(eoTabsToSpaces, bTabsToSpaces);
sciMain.SetOptionFlag(eoTrimTrailingSpaces, bTrimTrailingSpaces);
sciMain.SetOptionFlag(eoGroupUndo, bGroupUndo);
sciMain.SetOptionFlag(eoDisableScrollArrows, bDisableScrollArrows);
sciMain.InsertCaret := TSynEditCaretType(iInsertCaretMode);
sciMain.OverwriteCaret := TSynEditCaretType(iOverWriteCaretMode);
{ sciMain - Display Pane }
sciMain.Gutter.Visible := bGutterVisible;
sciMain.Gutter.AutoSize := bGutterAutoSize;
sciMain.Gutter.ShowLineNumbers := bGutterShowLineNumbers;
sciMain.Gutter.ZeroStart := bGutterStartAtZero;
sciMain.Gutter.LeadingZeros := bGutterShowLeadingZeros;
sciMain.Gutter.UseFontStyle := bGutterUseGutterFont;
sciMain.Gutter.Color := cGutterColor;
sciMain.Gutter.Font := fGutterFont;
sciMain.RightEdge := iEdgeColumn;
sciMain.RightEdgeColor := iEdgeColor;
sciMain.ExtraLineSpacing := iExtraLines;
sciMain.TabWidth := iTabWidth;
sciMain.BookMarkOptions.EnableKeys := bBookmarkKeys;
sciMain.BookMarkOptions.GlyphsVisible := bBookmarksVisible;
sciMain.Font := fEditorFont;
end;
procedure TfrmDoc.FormShow(Sender: TObject);
begin
if (sciMain.Highlighter = nil) then exit; // This next step can be ignored if there's no highlighter
dmmain.SetSelLang(sciMain.Highlighter.LanguageName);
bUpdate := True;
end;
procedure TfrmDoc.sciMainMacroRecord(Sender: TObject; message, wParam,
lParam: Integer);
begin
if strMacro = nil then strMacro := TStringList.Create;
strMacro.Add(IntToStr(Message) + '%' + IntToStr(wParam) + '%' + IntToStr(lParam));
end;
procedure TfrmDoc.FormCreate(Sender: TObject);
begin
// dmMain.SynAutoCorrect.Create(nil);
dmMain.propose.AddEditor(sciMain);
bHexMode := False;
LineStore := TStringList.Create;
LineStore.Add(IntToStr(sciMain.CaretY));
LoadSettings;
// SynSpellCheck.LoadDictionary('English');
end;
function TfrmDoc.GetsciMainState: string;
begin
if sciMaIn.ReadOnly then
Result := SReadOnly
else if sciMain.InsertMode then
Result := SInsert
else
Result := SOverwrite;
end;
procedure TfrmDoc.sciMainStatusChange(Sender: TObject;
Changes: TSynStatusChanges);
resourcestring
SModified = 'Modified';
var
ptCaret: TPoint;
s: String;
bMoveDown: Boolean;
begin
if sciMain.Highlighter <> nil then
if (sciMain.Highlighter.LanguageName <> sHighlighter) then begin
sHighlighter := sciMain.Highlighter.GetLanguageName;
s := GetLangName(sciMain.Highlighter) + '.lst';
s := ansiReplaceText(s, '\', '');
s := ansiReplaceText(s, '/', '');
s := ExtractFilePath(Application.ExeName) + 'propose\' + s;
if FileExists(s) then
dmMain.Propose.ItemList.LoadFromFile(s);
s := GetLangName(sciMain.Highlighter) + '.ins';
s := ansiReplaceText(s, '\', '');
s := ansiReplaceText(s, '/', '');
s := ExtractFilePath(Application.ExeName) + 'propose\' + s;
if FileExists(s) then
dmMain.Propose.InsertList.LoadFromFile(s);
end;
ptCaret := sciMain.CaretXY;
if LineStore[LineInt] <> IntToStr(ptCaret.Y) then begin
if bDestroying <> true then begin
LineInt := LineStore.Count;
LineStore.add(IntToStr(ptCaret.y));
end;
end;
if (ptCaret.X > 0) and (ptCaret.Y > 0) then
frmMain.stbMain.Panels[1].Text := Format(' %6d:%3d ', [ptCaret.Y, ptCaret.X])
else
frmMain.stbMain.Panels[1].Text := '';
if sciMain.Modified then begin
if bModified = False then begin
bModified := True;
frmMain.tcFiles.Repaint;
dmMain.actEditModified.Checked := True;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -