Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 95. - Vyhledání a označení nalezeného textu v komponentě RichEdit; Dynamická změna hlavního formuláře na základě spouštěcích parametrů aplikace

Jan Šindelář - 18.6.2003

Vyhledání a označení nalezeného textu v komponentě RichEdit

Začneme tedy hledáním a označováním textu v komponentě RichEdit. Podobně jako každá rozumná "textová" komponenta nám i RichEdit nabízí řadu metod pro práci s textem a nechybí mezi nimi pochopitelně ani hledání textu. Konkrétně se jedná o metodu FindText, které musíme jednak říci, jaký text hledáme, kde (tedy odkud kam) a parametry hledání (rozlišování velikosti písmen, pouze celá slova...). Na výstupu dostaneme pozici prvního znaku nalezeného řetězce a nebo "-1" v případě neúspěchu.

Tolik tedy hlavní myšlenka, která je ostatně popsána v nápovědě. My si poté získanou hodnotu vezmeme jako základ pro druhou část úkolu - pro označení textu. Nejprve nastavíme komponentě Focus, aby se nám výřez okna vždy přesunul na nalezenou část textu. Dále zvolíme počáteční bod označení textu, kterým je právě ona pozice nalezená v první části úkolu a konečně zvolíme délku označení. Ta je samozřejmě shodná s délkou hledaného textu, kterou rovněž známe.

function SearchAndSelect(RichEdit: TRichEdit; SearchText: string): Boolean;
var
  Position: Integer;
begin
  Result := False;
  with RichEdit do
  begin
    Lines.BeginUpdate;
    Position := FindText(SearchText, 0, Length(RichEdit.Text), [stMatchCase]);
    if Position <> -1 then
    begin
      SetFocus;
      SelStart := Position;
      SelLength := Length(SearchText);
      Result := true;
    end;
    Lines.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not SearchAndSelect(RichEdit1, `hledaný text`) then ShowMessage(`Nenalezeno`);
end;

Takto napsaná funkce nám najde první výskyt hledaného výrazu a označí jej. Budete-li chtít nalézt i ostatní výrazy, stačí dát celou „věc“ do cyklu a posouvat hranice prohledávaného textu. Označit více nesouvislého textu bohužel nelze.

Dynamická změna hlavního formuláře na základě spouštěcích parametrů aplikace

A dostáváme se k druhému dnešnímu tématu. Ukážeme si, jak na základě parametrů při spouštění naší aplikace zvolit, který formulář bude otevřen jako první (hlavní). Toho se dá využít mnoha způsoby, například můžete podle vstupních parametrů měnit uživatelské rozhraní a podobně. Této změny docílíme velmi snadno drobnou úpravou projektového souboru, který bude vypadat takto:

program Project1;

uses
  Forms, Classes, SysUtils,
  Unit1 in `Unit1.pas` {Form1}
  Unit2 in `Unit2.pas` {Form2}

{$R *.res}

var
  InstanceClass: TComponentClass;
  FormReference: TForm;

begin
Application.Initialize;
  if FindCmdLineSwitch(`druhy`,  [`-`, `/`], True) then
  begin
    InstanceClass := TForm2;
    FormReference := Form2;
  end
  else
  begin
    InstanceClass := TForm1;
    FormReference := Form1;
  end;
  Application.CreateForm(InstanceClass, FormReference);
  Application.Run;
end.

Jak vidíte, do "klasické" struktury je vloženo jednoduché větvení na základě vstupního parametru při spouštění. Vložíte-li tedy za název aplikace a lomítko (pomlčku) parametr "druhy", bude hlavním formulářem druhý formulář místo prvního. Tímto způsobem samozřejmě můžete volit mezi mnoha různými formuláři na základě celé řady vstupních parametrů či jejich kombinací.