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

Tipy a triky v Delphi, díl 17. - Vyvolání dialogových oken z Ovládacích panelů; Úprava standardního dialogového okna; Změna titulku u FontDialogu

Jan Šindelář - 14.11.2001

Jak jsem slíbil minule, zaměříme se v dnešním dílu na dialogová okna. Nejprve si ukážeme, jak vyvolat některé dialogy z Ovládacích panelů. Druhé hlavní téma bude, jak si přizpůsobit parametry standardních dialogových oken, jako je titulek okna, font a barva textu či libovolné popisky tlačítek (a další parametry) přesně podle našich požadavků.

Vyvolání dialogových oken z Ovládacích panelů

Často se v našich aplikacích stává, že je třeba změnit určitá systémová nastavení a podobně. V tom případě se můžeme o všechno postarat sami (podle pokynů uživatele) a požadovaných nastavení dosáhnout například změnou registrů. Pokud však nevíme, jak některé konkrétní nastavení změnit, a nebo prostě jen nechceme uživatele plést, můžeme využít poměrně jednoduché možnosti a vyvolat příslušný systémový dialog. Ten jednak uživatel zná a ví, kde má co nastavit, a navíc jeho správná funkčnost by měla být (doufám) zaručena.

Následujícím jednoduchým a krátkým kódem dosáhneme požadovaného efektu:

procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec(Pchar(`rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl`),SW_NORMAL);
end;

Chci jen upozornit, že zdánlivě chybějící mezera (z typografického hlediska) za čárkou mezi "shell32.dll" a "Control_RunDLL" chybí zcela úmyslně, neboť je to součást parametrů pro "rundll32.exe". Při vložení mezery vám příklad nebude fungovat a systém se ohlásí chybovou hláškou.

Nejdůležitější částí parametrů je úplný konec, v naší ukázce "mmsys.cpl". Právě tento parametr určuje, který ovládací panel bude zobrazen (v našem příkladu jsou to Multimédia). V následující tabulce najdete další z možných parametrů (jedná se o běžné soubory .cpl, které se nachází v systémovém adresáři Windows) :

access.cpl - nastavení přístupových práv
appwiz.cpl - přidat nebo odebrat programy
desk.cpl - obrazovka
intl.cpl - místní nastavení
joy.cpl - možnosti her
main.cpl - myš
mmsys.cpl - multimédia
modem.cpl - modemy
sysdm.cpl - systém
timedate.cpl - datum a čas

Některá z těchto položek může být závislá na verzi Windows, nebo můžete použít i jiné .cpl soubory, ovšem měli byste vždy pamatovat na to, že ne každý má nainstalováno totéž co vy, a pokud to funguje u vás doma, nemusí to běžet všude. Proto bych se asi držel spíše těch standardních ovládacích panelů. Jediný problém takto použitých dialogů bych viděl v tom, že nemáte přesně pod kontrolou, jaké parametry uživatel zvolí. Lépe řečeno: to, co si uživatel vybral, se váš program bezprostředně nedozví, a ani nepoznáte (pokud se sami v programu nepostaráte o detekci), zda je již dialog uzavřen. Proto se asi hodí spíše pro použití v tom případě, kdy odezva uživatele (či spíše jeho provedená volba) není bezprostředně nutná pro další běh vaší aplikace.

Úprava standardního dialogového okna

Pokud se vám nelíbí standardní dialogové okno, můžeme ho snadno upravit k obrazu svému. Ukážeme si, jak změnit titulek okna, jak změnit barvu, velikost či font textu a také nápisy tlačítek.

Jak je vidět ze zdrojového kódu, změna parametrů je relativně jednoduchá, položky jsou přehledné a jasné. Takto vytvořenou funkci voláme místo klasického dialogu s patřičnými parametry, jak je vidět taktéž v naší ukázce v události stisku tlačítka. První parametr určuje titulek okna, dále je to samotný text, typ dialogu (který mimo jiné určuje zobrazenou ikonku, i tu je však možno změnit, to vám nechám za domácí úkol), dále jsou to zobrazovaná tlačítka, defaultní tlačítko a kontext nápovědy.

Vlastní parametry dialogu v naší funkci jsou zvoleny poněkud křiklavě – tučný červený text, ale to je pouze pro názornou ukázku, aby bylo na první pohled vidět, co vše se dá změnit. Červená barva ale nemusí být úplně na škodu, záleží na typu dialogu. Parametry funkce by možná stálo za to ještě rozšířit právě o onu zmiňovanou barvu či typ písma, pokud budete často používat různé druhy dialogů.

A jaké je kromě vizuálního dojmu ještě využití tohoto tipu? Napadá mě třeba využití při lokalizaci vašich aplikací do různých jazyků, pokud nebudete chtít použít resources. Nevypadá moc dobře, když lokalizujete v programu kde co, ale dialogová okna zůstanou standardně z Delphi v angličtině.

function DefMessageDlg(const Title : string; const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; DefButton : integer; HelpCtx : longint): integer;
var cnt : integer;
    btn : TButton;

begin
with CreateMessageDialog(Msg, DlgType, Buttons) do
try
  Caption := Title;
  HelpContext := HelpCtx;
  Font.Color := clRed;
  Font.Size := 7;
  Font.Style := [fsBold];
  Font.Color := clRed;
  Font.Name := `Verdana`;
  for Cnt := 0 to ComponentCount - 1 do
  begin
    if Components[Cnt] is TButton then
    begin
    Btn:= TButton(Components[Cnt]);
    Btn.Default := Btn.ModalResult = DefButton;
    if Btn.Caption = `&Yes` then Btn.Caption := `&Ano`;
    if Btn.Caption = `&No` then Btn.Caption := `&Ne`;
    if Btn.Caption = `Cancel` then Btn.Caption := `&Storno`;
    if Btn.Default then ActiveControl := Btn;
    end;
  end;
  Result := ShowModal;
finally
  free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if DefMessageDlg(`Otázka ?`, `Chcete opravdu zformátovat disk ?`, mtConfirmation, mbYesNoCancel, mrNo, 0) = mrYes then ShowMessage(`Formátuji...čekejte`);
end;

Všimněte si také (tedy až si ukázku spustíte, protože ze zdrojáku to nemusí být na první pohled jasné), že zvolený font nemá vliv jen na samotný text, ale stejný font a velikost bude použit i na tlačítka. To nemusí být vždycky dobré, proto můžete změnit například velikost fontu tlačítek přidáním následujícího řádku do místa kódu, kde se mění nadpisy tlačítek. Jeho velikost si nastavíme třeba na 10:

.
.
.
if Btn.Caption = `&No` then Btn.Caption := `&Ne`;
if Btn.Caption = `Cancel` then Btn.Caption := `&Storno`;
if Btn.Default then ActiveControl := Btn;

Btn.Font.Size:=10;
.
.
.

Jak vidíte, parametrů a různých kombinací je celá řada. Když půjdeme úplně do detailu, můžete snadno docílit toho, aby mělo každé tlačítko jinou velikost fontu (defaultní tlačítka například o něco větší), ale to je ze zdrojáků snad již jasné a nechám vás experimentovat.

Další zajímavý parametr, který můžete nastavit, je Hint (bublinková nápověda) pro daná tlačítka, což standardní dialogy také nemají a někdy je alespoň tímto způsobem dobré uživateli přesněji vysvětlit, co přesně se stane při stisknutí daného tlačítka. Některé otázky v dialozích bývají někdy tak nejednoznačné, že často není jisté, jak vlastně odpovědět.

Taktéž můžete změnit velikosti jednotlivých tlačítek a jejich umístění. Nastavit se zkrátka dají v podstatě všechny klasické parametry běžných tlačítek, takže se pusťte do zkoušení.

Změna titulku u FontDialogu

A na závěr tu máme jeden kratičký tip spíše kosmetického významu. V Delphi, přesněji řečeno v Object Inspectoru, nelze nastavit u dialogu pro výběr fontu vlastní nadpis okna. Ne že by to byla nějaká velká ztráta, ale přesto si ukážeme, jak tento nadpis celkem snadno zvolit podle sebe. Můžete pak tímto nadpisem uživatele přesně informovat, pro co že to vlastně ten font právě vybírá.

Kód je jednoduchý, do události OnShow příslušného dialogu vložte tento řádek:

procedure TForm1.FontDialog1Show(Sender: TObject);
begin
SendMessage(FontDialog1.Handle, WM_SETTEXT, 0, LPARAM(PCHAR(`Vyberte písmo pro použití v menu`)));
end;