【注意】このチュートリアルはデモンストレーションのみを目的としており、作者が特定の実践を推奨または反対することを意味するものではなく、また、これらのコードが他の実用的な用途を持つことを意味するものではありません。
QMacros は、豊富な機能を提供する効率的なスタック検索および置換エンジンです。次のコードは、PHP+HTML 混合コードの一部からすべての PHP 定義変数名を取得する方法を示しています (ソース コードは Memo1 に配置され、出力変数名は Memo2 に直接配置されます)。
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } procedure DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean); procedure DoVarNameFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var AMacros: TQMacroManager; AResult: TQMacroComplied;begin AMacros := TQMacroManager.Create; try AList.Duplicates := dupIgnore; AMacros.OnMacroMissed := DoCodeBlockFound; //Complie is enough AResult := AMacros.Complie(Memo1.Text, '<?php', '?>'); if Assigned(AResult) then //We don't use the result for replace,so free it. FreeAndNil(AResult); finally AMacros.Free; end;end;procedure TForm1.DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean);var AVarParser: TQMacroManager; AReplace: TQMacroComplied;begin AVarParser := TQMacroManager.Create; try AVarParser.OnMacroMissed := DoVarNameFound; AReplace := AVarParser.Complie(AName, '$', '', MRF_END_WITH_INVALID_CHAR); if AReplace <> nil then begin ASender.Push(AName, ''); AHandled := True; FreeAndNil(AReplace); end; finally FreeAndNil(AVarParser); end;end;procedure TForm1.DoVarNameFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean);begin Memo2.Lines.Add(AName); ASender.Push(AName, ''); AHandled := True;end;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } procedure DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean); procedure DoVarNameFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);var AMacros: TQMacroManager; AResult: TQMacroComplied;begin AMacros := TQMacroManager.Create; try AList.Duplicates := dupIgnore; AMacros.OnMacroMissed := DoCodeBlockFound; //Complie is enough AResult := AMacros.Complie(Memo1.Text, '<?php', '?>'); if Assigned(AResult) then //We don't use the result for replace,so free it. FreeAndNil(AResult); finally AMacros.Free; end;end; procedure TForm1.DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean);var AVarParser: TQMacroManager; AReplace: TQMacroComplied;begin AVarParser := TQMacroManager.Create; try AVarParser.OnMacroMissed := DoVarNameFound; AReplace := AVarParser.Complie(AName, '$', '', MRF_END_WITH_INVALID_CHAR); if AReplace <> nil then begin ASender.Push(AName, ''); AHandled := True; FreeAndNil(AReplace); end; finally FreeAndNil(AVarParser); end;end; procedure TForm1.DoVarNameFound(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW; var AHandled: Boolean);begin Memo2.Lines.Add(AName); ASender.Push(AName, ''); AHandled := True;end;
誰もが比較できるようにインターフェースを投稿します:
OK、Button1 の OnClick イベントの応答関数 Button1Click でこれを実行しました:
TMacroManager オブジェクトのインスタンス AMacros を作成し、次に、 OnMacroMissed イベントの応答関数を DoCodeBlockFound 関数に指定します。この関数は、 で終わるコード ブロックを見つけるために使用されます。 DoCodeBlockFound 関数はさらに次の処理を実行します。
TQMacroManager オブジェクトのインスタンスを作成し、その OnMacroMissed イベント応答関数を DoVarNameFound を指すように設定します。 DoVarNameFoundでは、見つかった変数名をMemo2に出力します。