⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searche.pas

📁 SkyEdit是一个可用彩色语法来显示及编辑各种开发语言源代码的编辑器控件。
💻 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 + -