📄 pcredemomain.pas
字号:
unit PCREDemoMain;
interface
uses
Windows, Messages,
SysUtils, Classes, Forms, Dialogs, ActnList, ComCtrls, StdCtrls, Controls,
JclPCRE;
type
TfrmMain = class(TForm)
edRegExpr: TEdit;
btnFind: TButton;
btnFindNext: TButton;
Label1: TLabel;
reFile: TMemo;
btnOpen: TButton;
alMain: TActionList;
acFind: TAction;
acFindNext: TAction;
acOpen: TAction;
odOpen: TOpenDialog;
chkIgnoreCase: TCheckBox;
chkMultiLine: TCheckBox;
chkDotAll: TCheckBox;
chkExtended: TCheckBox;
chkAnchored: TCheckBox;
chkDollarEndOnly: TCheckBox;
chkExtra: TCheckBox;
chkNotBOL: TCheckBox;
chkNotEOL: TCheckBox;
chkUnGreedy: TCheckBox;
chkNotEmpty: TCheckBox;
chkUTF8: TCheckBox;
sbMain: TStatusBar;
procedure acOpenExecute(Sender: TObject);
procedure acFindExecute(Sender: TObject);
procedure acFindNextExecute(Sender: TObject);
procedure edRegExprChange(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
RE: TJclAnsiRegEx;
FMatchIndex: integer;
procedure SelectText(Offset: TJclAnsiCaptureOffset);
procedure Match;
function GetUIOptions: TJclAnsiRegExOptions;
procedure UpdateUIOptions;
procedure LoadFromFile(const Filename:string);
protected
procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses
ShellAPI;
{$R *.dfm}
procedure TfrmMain.acOpenExecute(Sender: TObject);
begin
if odOpen.Execute then
LoadFromFile(odOpen.Filename);
end;
procedure TfrmMain.acFindExecute(Sender: TObject);
begin
FreeAndNil(RE);
RE := TJclAnsiRegEx.Create;
RE.Options := GetUIOptions;
RE.Compile(edRegExpr.Text, false, false);
FMatchIndex := 1;
Match;
end;
procedure TfrmMain.acFindNextExecute(Sender: TObject);
begin
if RE = nil then
acFind.Execute
else
Match;
end;
procedure TfrmMain.SelectText(Offset: TJclAnsiCaptureOffset);
begin
reFile.SelStart := Offset.FirstPos;
reFile.SelLength := Offset.LastPos - Offset.FirstPos;
end;
procedure TfrmMain.Match;
begin
RE.Options := GetUIOptions;
if not RE.Match(reFile.Lines.Text, FMatchIndex) then
begin
FreeAndNil(RE);
MessageDlg('No matches found', mtInformation, [mbOK], 0);
end
else
begin
SelectText(RE.CaptureOffset[0]);
FMatchIndex := RE.CaptureOffset[0].LastPos;
end;
UpdateUIOptions;
end;
function TfrmMain.GetUIOptions: TJclAnsiRegExOptions;
begin
Result := [];
if chkIgnoreCase.Checked then
Include(Result, roIgnoreCase);
if chkMultiLine.Checked then
Include(Result, roMultiLine);
if chkDotAll.Checked then
Include(Result, roDotAll);
if chkExtended.Checked then
Include(Result, roExtended);
if chkAnchored.Checked then
Include(Result, roAnchored);
if chkDollarEndOnly.Checked then
Include(Result, roDollarEndOnly);
if chkExtra.Checked then
Include(Result, roExtra);
if chkNotBOL.Checked then
Include(Result, roNotBOL);
if chkNotEOL.Checked then
Include(Result, roNotEOL);
if chkUngreedy.Checked then
Include(Result, roUnGreedy);
if chkNotEmpty.Checked then
Include(Result, roNotEmpty);
if chkUTF8.Checked then
Include(Result, roUTF8);
end;
procedure TfrmMain.UpdateUIOptions;
var
Options: TJclAnsiRegExOptions;
begin
if RE = nil then Exit;
Options := RE.Options;
chkIgnoreCase.Checked := roIgnoreCase in Options;
chkMultiLine.Checked := roMultiLine in Options;
chkDotAll.Checked := roDotAll in Options;
chkExtended.Checked := roExtended in Options;
chkAnchored.Checked := roAnchored in Options;
chkDollarEndOnly.Checked := roDollarEndOnly in Options;
chkExtra.Checked := roExtra in Options;
chkNotBOL.Checked := roNotBOL in Options;
chkNotEOL.Checked := roNotEOL in Options;
chkUngreedy.Checked := roUnGreedy in Options;
chkNotEmpty.Checked := roNotEmpty in Options;
chkUTF8.Checked := roUTF8 in Options;
end;
procedure TfrmMain.edRegExprChange(Sender: TObject);
begin
FreeAndNil(RE);
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
FreeAndNil(RE);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;
procedure TfrmMain.WMDropFiles(var Message: TWMDropFiles);
var
i:integer;
buf:array [0..MAX_PATH] of char;
begin
i := DragQueryFile(Message.Drop, $FFFFFFFF, nil, 0);
if i > 0 then
try
DragQueryFile(Message.Drop, 0, buf, sizeof(buf));
if FileExists(buf) then
LoadFromFile(buf);
finally
DragFinish(Message.Drop);
end;
end;
procedure TfrmMain.LoadFromFile(const Filename: string);
begin
reFile.Lines.LoadFromFile(Filename);
sbMain.Panels[0].Text := ' ' + Filename;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -