📄 searche.pas
字号:
unit SearchE;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, StdActns, ActnList;
type
TSearchForm = class(TForm)
cbxFind: TComboBox;
lblFind: TLabel;
cbxReplace: TComboBox;
lblReplace: TLabel;
btnFindFirst: TButton;
btnFindNext: TButton;
btnReplace: TButton;
btnRepAll: TButton;
btnCancel: TButton;
gbxOptions: TGroupBox;
ckxMatchCase: TCheckBox;
ckxWholeWord: TCheckBox;
rgpDirection: TRadioGroup;
rgpOrigin: TRadioGroup;
rgpScope: TRadioGroup;
btnCount: TButton;
ActionList1: TActionList;
EditCut1: TEditCut;
EditCopy1: TEditCopy;
EditPaste1: TEditPaste;
EditSelectAll1: TEditSelectAll;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure cbxFindChange(Sender: TObject);
procedure btnFindFirstClick(Sender: TObject);
procedure btnFindNextClick(Sender: TObject);
procedure btnReplaceClick(Sender: TObject);
procedure btnRepAllClick(Sender: TObject);
procedure btnCountClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EditPaste1Execute(Sender: TObject);
procedure EditCut1Execute(Sender: TObject);
procedure EditCopy1Execute(Sender: TObject);
procedure EditSelectAll1Execute(Sender: TObject);
private
{ Private declarations }
procedure AddToComboBox(cbxTarget: TComboBox; sText: String);
function GetFocusedCtrlHwnd: HWND; //取得当前有焦点的编辑框或组合框的句柄
public
{ Public declarations }
m_EventUpdateSearchInfo: TNotifyEvent;
procedure SetSearchType(bFind: Boolean);
end;
var
SearchForm: TSearchForm;
implementation
uses SkyEMain;
{$R *.dfm}
procedure TSearchForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TSearchForm.FormCreate(Sender: TObject);
begin
Left := SkyForm.SearchLeft;
Top := SkyForm.SearchTop;
end;
procedure TSearchForm.FormDestroy(Sender: TObject);
begin
SkyForm.SearchLeft := Left;
SkyForm.SearchTop := Top;
if Assigned(m_EventUpdateSearchInfo) then
m_EventUpdateSearchInfo(Self);
end;
procedure TSearchForm.SetSearchType(bFind: Boolean);
var
iStdTop: Integer;
begin
lblReplace.Visible := not bFind;
cbxReplace.Visible := not bFind;
btnReplace.Visible := not bFind;
btnRepAll.Visible := not bFind;
btnCount.Visible := bFind;
btnFindFirst.Default := bFind;
if bFind then
begin
Caption := '查找';
iStdTop := 26;
btnCancel.Top := 90;
Height := 158;
end
else
begin
Caption := '查找/替换';
iStdTop := 50;
btnCancel.Top := 120;
Height := 182;
end;
btnCount.Top := 60;
gbxOptions.Top := iStdTop;
rgpDirection.Top := iStdTop;
rgpScope.Top := iStdTop + 38;
rgpOrigin.Top := iStdTop + 38;
cbxFindChange(cbxFind);
cbxFind.SelStart := 0;
if cbxFind.GetTextLen > 0 then
cbxFind.SelectAll;
end;
procedure TSearchForm.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TSearchForm.cbxFindChange(Sender: TObject);
var
bCanSearch: Boolean;
begin
bCanSearch := cbxFind.GetTextLen > 0;
btnFindFirst.Enabled := bCanSearch;
btnFindNext.Enabled := bCanSearch;
btnReplace.Enabled := bCanSearch;
btnRepAll.Enabled := bCanSearch;
btnCount.Enabled := bCanSearch;
end;
procedure TSearchForm.btnFindFirstClick(Sender: TObject);
begin //找第一个
AddToComboBox(cbxFind, cbxFind.Text);
if Assigned(m_EventUpdateSearchInfo) then
m_EventUpdateSearchInfo(Self);
SkyForm.actFindFirst.Execute;
end;
procedure TSearchForm.btnFindNextClick(Sender: TObject);
begin //找下一个
if rgpDirection.ItemIndex > 0 then
SkyForm.actFindPrev.Execute
else
SkyForm.actFindNext.Execute;
end;
procedure TSearchForm.btnReplaceClick(Sender: TObject);
begin //替换
if SkyForm.SkyEdit2.ReadOnly then
Application.MessageBox('当前文档为只读,不能进行替换!', 'Sky Editor')
else
SkyForm.SkyEdit2.SelText := cbxReplace.Text;
end;
procedure TSearchForm.btnRepAllClick(Sender: TObject);
begin //全换
AddToComboBox(cbxFind, cbxFind.Text);
AddToComboBox(cbxReplace, cbxReplace.Text);
if Assigned(m_EventUpdateSearchInfo) then
m_EventUpdateSearchInfo(Self);
SkyForm.actRepAll.Execute;
Close;
end;
procedure TSearchForm.btnCountClick(Sender: TObject);
begin //计数
AddToComboBox(cbxFind, cbxFind.Text);
if Assigned(m_EventUpdateSearchInfo) then
m_EventUpdateSearchInfo(Self);
SkyForm.actCount.Execute;
end;
procedure TSearchForm.AddToComboBox(cbxTarget: TComboBox; sText: String);
var //将某一不存在于组合框中的项目加入其中
idx: Integer;
begin
if sText <> '' then
begin
idx := cbxTarget.Items.IndexOf(sText);
if idx <> 0 then
begin
if idx > 0 then
cbxTarget.Items.Delete(idx); //已存在,且不是第一个,则先删除
cbxTarget.Items.Insert(0, sText); //加入
cbxTarget.ItemIndex := 0;
end;
end;
end;
function TSearchForm.GetFocusedCtrlHwnd: HWND;
begin //取得当前有焦点的编辑框或组合框的句柄
if cbxFind.Focused then
Result := cbxFind.Handle
else if cbxReplace.Focused then
Result := cbxReplace.Handle
else
Result := 0;
end;
procedure TSearchForm.EditPaste1Execute(Sender: TObject);
var
wnd: HWND;
begin
wnd := GetFocusedCtrlHwnd();
if wnd <> 0 then
SendMessage(wnd, WM_PASTE, 0, 0);
end;
procedure TSearchForm.EditCut1Execute(Sender: TObject);
var
wnd: HWND;
begin
wnd := GetFocusedCtrlHwnd();
if wnd <> 0 then
SendMessage(wnd, WM_CUT, 0, 0);
end;
procedure TSearchForm.EditCopy1Execute(Sender: TObject);
var
wnd: HWND;
begin
wnd := GetFocusedCtrlHwnd();
if wnd <> 0 then
SendMessage(wnd, WM_COPY, 0, 0);
end;
procedure TSearchForm.EditSelectAll1Execute(Sender: TObject);
{var
wnd: HWND;
begin
wnd := GetFocusedCtrlHwnd();
if wnd <> 0 then
SendMessage(wnd, EM_SETSEL, 0, -1);
}
begin
if cbxFind.Focused then
cbxFind.SelectAll
else if cbxReplace.Focused then
cbxReplace.SelectAll;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -