Jak v Delphi kódovat URL a parametry

27. 6. 2017, Vladimír Klaus, přečteno 291x

Delphi
HTML/CSS

Pokud potřebujete volat nějakou http adresu, nebývá to většinou problém. Ale jen do té chvíle, kdy tam máte parametry, češtinu, mezery a jiné problematické věci. A tyto věci je třeba kódovat, jenže ani v takovém případě není úplně jasné, jak přesně s tím naložit a je třeba se rozhodovat dle konkrétní situace.

//1. toto je špatně, protože to zakóduje vše, včetně lomítek atd.,
//takže to není žádná adresa
s:=TNetEncoding.URL.Encode
  ('https://www.google.com/maps/place/Terezínská 701/4, Praha 9, 190 00');

//2. toto je špatně, protože tam nechá lomítko i u 701/4 a Google
//to odřízne, jako nepotřebnou část a najde 701, resp. 701/6
s:=TIdURI.URLEncode
  ('https://www.google.com/maps/place/Terezínská 701/4, Praha 9, 190 00');

//3. toto funguje = začátek je OK a adresa je zakódovaná včetně lomítka
s:='https://www.google.com/maps/place/' +
  TNetEncoding.URL.Encode('Terezínská 701/4, Praha 9, 190 00');

SimpleRun(s);

Co dělá SimpleRun už asi víte, ale pro jistotu zopakuji

{*----------------------------------------------------------------------
  Jednoduché spuštění aplikace nebo zobrazení souboru pomocí
  výchozí aplikace. Slouží i k navigování na web atd.
  Pozor SW_SHOW může spustit aplikaci i minimalizovanou, pro vynucení
  normálního zobrazení je třeba požít SW_SHOWNORMAL, pro skrytou zase
  SW_HIDE
-----------------------------------------------------------------------}
procedure SimpleRun (aFileName: string; aParam: string = '';
  aShowCmd: integer = SW_SHOW);
var
  i: integer;

begin
  //pro jistotu se přepnu do adresáře spouštěné aplikace
  SetCurrentDirectory(PChar(ExtractFilePath(aFileName)));
  //podle toho, jestli to volám s parametrem
  if Trim(aParam)<>'' then begin
    i:=ShellExecute(0,'open',PChar(aFileName),PChar(aParam),nil,aShowCmd);
  end else begin
    i:=ShellExecute(0,'open',PChar(aFileName),nil,nil,aShowCmd);
  end;
  //když se vrátí nízké číslo, jde o nějaký problém - já z toho dělám výjimku
  if i<=32 then begin
    raise Exception.CreateFmt('ShellExecute result = %d',[i]);
  end;
end;

Viz též: