201 lines
4.9 KiB
ObjectPascal
201 lines
4.9 KiB
ObjectPascal
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.
|
|
|