Přizpůsobení prohlížečů pomocí skriptů |
Top Previous Next |
Seznam témat: příklad použití - Přidání akce do lišty browseru
Chování prohlížečů lze ovlivnit pomocí skriptů napojených na události, jež nastávají během práce s prohlížečem. Tyto skripty se definují v rámci akce "Přizpůsobit" v kontextové nabídce každého prohlížeče. Volání jednotlivých událostí s ohledem na životní fáze prohlížeče znázorňuje toto schéma: K dispozici jsou níže uvedené události s příklady. U příkladů se předpokládá jejich aplikace na uživatelský prohlížeč selektující všechny sloupce z tabulky měnových kurzů (dba.gkurzy). Událost nastane těsně před otevřením datové množiny. Je to vhodný okamžik pro modifikaci dotazu SQL či nastavení parametrů datové množiny (BrowserData). Zde je také možné modifikovat vlastnosti prohlížeče (Browser). Pomocí kontextové proměnné CanOpen lze inicializaci prohlížeče stornovat (nastavením na False).
Příklad č.1 ukazuje jak lze v dotazu SQL uživatelského prohlížeče nastavit parametr zadaný uživatelem. Příklad č.2 ukazuje jak lze změnit dotaz SQL. Další příklady ukazují jak lze základě dat uvnitř množiny obarvit buňky (příklad č.3), resp. celé řádky (příklad č.4).
Příklad 1 var DT: TDateTime; begin DT := Date+Time; //přednastav aktuální datum a čas
//zeptej se na datum+čas a podle toho nastav parametr v SQL u browseru if DateBox('Zadejte počátek logu', DT, True) then BrowserData.Params.ParamByName('datum_od').AsDateTime := DT else CanOpen := False; //stornuj otevření browseru end.
Příklad 2 begin with TQueryPlus(BrowserData) do SQLSelect := SQLSelect + ',(cena*pocet) as celkem'; end.
Příklad 3 procedure CellLayout(Sender: TObject; Field: TField; Dataset: TDataset; Font: TFont; var Background: TColor; Highlight: Boolean); begin if Highlight then Exit; //pokud je buňka vybraná, nech barvy výchozí
if (Field.FieldName = 'prcena') and (Field.AsFloat = 0) then begin Background := clYellow; Font.Style := Font.Style + fsBold; Font.Color := clNavy; end; end;
begin Browser.OnCellLayout := @CellLayout; end.
Příklad 4 procedure CellLayout(Sender: TObject; Field: TField; Dataset: TDataset; Font: TFont; var Background: TColor; Highlight: Boolean); begin if Highlight then Exit; //pokud je buňka vybraná, nech barvy výchozí
if Dataset.FieldByName('prcena').AsFloat = 0 then begin Background := clYellow; Font.Style := Font.Style + fsBold; Font.Color := clNavy; end; end;
begin Browser.OnCellLayout := @CellLayout; end.
Událost nastane vždy po otevření datové množiny prohlížeče. Je to vhodný okamžik k nastavení polí datové množiny (BrowserData). Pozor na to, že tento skript může být volán vícekrát během práce s prohlížečem, protože datová množina je otevřena také např. v rámci funkce obnovení dat.
Příklad 1 Ukazuje jak lze u uživatelského prohlížeče povolit akce pro editaci věty (jsou implicitně zakázané) a jak nastavit jméno editované tabulky (nutné pro schopnost prohlížeče editovat záznam). Dále je vidět jak lze u sloupců upravit text záhlaví, popř. sloupce skrýt.
begin Browser.DisabledActions := 0; Browser.TableName := 'dba.gkurzy'; BrowserData.FieldByName('dne').DisplayLabel := 'K datu'; BrowserData.FieldByName('stat').Visible := False; BrowserData.FieldByName('menad').Visible := False; end.
Příklad 2 Postup jak s pomocí skriptů zajistit podmínečný překlad sloupců u vybraných browserů platí od klienta (2.1.28.0821, v141), kvůli novým funkcím zjišťujícím jazyk aplikace.
Příklad skriptu pro přeložení záhlaví sloupců do němčiny:
begin {pokud není němčina primárním jazykem aplikace, tak nic nedělej} if StrFind('DE', GetPrimaryLanguage) <> 1 then Exit;
{nastav jiný text záhlaví pro vybrané sloupce} BrowserData.FieldByName('cas').DisplayLabel := 'Zeit'; BrowserData.FieldByName('vyrobeno').DisplayLabel := 'Hergestellt'; BrowserData.FieldByName('mnoz').DisplayLabel := 'Menge'; end.
Vnitřní jméno sloupce lze získat podržením myši nad záhlavím sloupce v browseru nebo v informacích o browseru (Ctrl+I).
Událost nastává po zobrazení prohlížeče. Je to vhodný okamžik pro různé interakce s uživatelem, které vyžadují, aby prohlížeč byl již zobrazen.
Příklad Ukazuje jak lze po zobrazení prohlížeče a po potvrzení uživatelem aplikovat dodatečnou filtrační podmínku na zobrazená data.
begin if YesNoBox('Zobrazit jen kurzy EUR?') then Browser.ApplyFilter(BrowserForm, 'mena_id = ''EUR''', nil) end.
Událost nastává po každé změně (posunu) aktuálního záznamu v prohlížeči. Událost je vhodným okamžikem pro operace závislé na momentálně vybraném záznamu, např. pro povolení/zakázání určité funkce v prohlížeči. Příklad ukazuje jak v prohlížeči s kurzy zakázat odstranění záznamů s měnou "EUR". var Act: TAction; begin Act := Browser.FindActionByCmd(cmDelete); if BrowserData.FieldByName('mena_id').AsString = 'EUR' then Act.Enabled := False else Act.Enabled := True; end.
Událost slouží k odchycení základních ovládacích příkazů prohlížeče (viz konstanty cmXXX). Příkaz prohlížeče lze přes proměnnou BrowserCommand modifikovat, popř. stornovat nastavením na nulu (cmNone). Příklad zajistí, že na příkaz update se program zeptá na datum a otevře modální prohlížeč se seznamem kurzů.
var Br: TBrowser; Datum1: TDateTime; begin if BrowserCommand <> cmUpdate then Exit;
//stornuj původní příkaz BrowserCommand := cmNone;
//zeptej se na datum (předvyplň dnešní datum) Datum1 := Date; if not DateBox('Zadej datum', Datum1) then Exit;
//vytvoř a otevři browser Br := TBrowser.Create(nil); try Br.Name := 'BrKurzyCustom'; Br.Caption := 'Číselník kurzů'; Br.PrimaryKeys.Add('mena_id'); Br.PrimaryKeys.Add('dne'); Br.PrimaryKeys.Add('stat'); Br.SQL.Add('select * from dba.gkurzy where dne >= :datum1'); Br.Params[0].AsDateTime := Datum1; Br.ShowModal; finally Br.Free; end; end.
Událost slouží k vytvoření a předání editačního dialogu prohlížeči. Tímto způsobem lze zcela nahradit stávající dialog nebo učinit editovatelným prohlížeč, který byl doposud pouze ke čtení. Formulář lze vytvořit buď vizuálně pomocí Editoru formulářů (najdete jej v menu Skripty) anebo přímo kódem ve skriptu. Příklad skriptu OnWantDialog s využitím formuláře vytvořeného vizuálním editorem:
BrowserDialog := LoadFormForBrowser('cesta\nazev', Browser, BrowserForm);
Příklad skriptu OnWantDialog s tvorbou formuláře kódem (editační dialog pro číselník měnových kurzů):
var Edit: TBrowserEdit; NEdit: TBrowserNumEdit; DEdit: TBrowserDateEdit; LEdit: TBrowserLookupEdit; Lbl: TLabelPlus; Btn: TButton; CurrEdit: TBrowserCurrEdit; begin BrowserDialog := TFormBrowserDlg.CreateForBrowser(Browser, BrowserForm); BrowserDialog.Height := 280; BrowserDialog.Name := 'FormMujDialogProKurzy';
Btn := TButton(BrowserDialog.FindComponent('BtnOk')); Btn.Top := 220;
Btn := TButton(BrowserDialog.FindComponent('BtnCancel')); Btn.Top := 220;
//Měna LEdit := TBrowserLookupEdit.Create(BrowserDialog); LEdit.Name := 'EditMena'; //vnitřní název - nutné jen, pokud je nutné najít prvek podle jména LEdit.Left := 20; LEdit.Top := 30; LEdit.Width := 100; LEdit.FieldName := 'mena_id'; LEdit.Parent := BrowserDialog; LEdit.LookupDatabase := DefaultDatabaseName; LEdit.LookupSQL.Add('select m.id_mena, s.nazev, s.cleneu'); LEdit.LookupSQL.Add('from dba.gmeny as m, dba.gstaty as s'); LEdit.LookupSQL.Add('where s.id_stat = m.stat_id order by 1'); LEdit.LookupField := 'id_mena'; LEdit.TabOrder := 0; LEdit.AllowNull := False;
Lbl := TLabelPlus.Create(BrowserDialog); Lbl.Caption := 'Měna'; Lbl.Parent := BrowserDialog; Lbl.FocusControl := LEdit; Lbl.Attached := True;
//Platnost od DEdit := TBrowserDateEdit.Create(BrowserDialog); DEdit.Left := 20; DEdit.Top := 80; DEdit.Width := 100; DEdit.FieldName := 'dne'; DEdit.Parent := BrowserDialog; DEdit.TabOrder := 1; DEdit.AllowNull := False;
Lbl := TLabelPlus.Create(BrowserDialog); Lbl.Caption := 'Platnost od'; Lbl.Parent := BrowserDialog; Lbl.FocusControl := DEdit; Lbl.Attached := True;
//Stát LEdit := TBrowserLookupEdit.Create(BrowserDialog); LEdit.Left := 20; LEdit.Top := 130; LEdit.Width := 100; LEdit.FieldName := 'stat'; LEdit.Parent := BrowserDialog; LEdit.LookupDatabase := DefaultDatabaseName; LEdit.LookupSQL.Add('select id_stat, nazev, cleneu'); LEdit.LookupSQL.Add('from dba.gstaty order by 1'); LEdit.LookupField := 'id_stat'; LEdit.TabOrder := 2; LEdit.AllowNull := False;
Lbl := TLabelPlus.Create(BrowserDialog); Lbl.Caption := 'Stát'; Lbl.Parent := BrowserDialog; Lbl.FocusControl := LEdit; Lbl.Attached := True;
//Činitel (pro názornost použijeme TBrowserEdit, ikdyž //by byl vhodnější TBrowserNumEdit) Edit := TBrowserEdit.Create(BrowserDialog); Edit.Left := 20; Edit.Top := 180; Edit.Width := 40; Edit.FieldName := 'cinitel'; Edit.Parent := BrowserDialog; Edit.DataType := dtInteger; Edit.InputFilter := ifInteger; //půjdou vkládat jen číslice Edit.TabOrder := 3; Edit.AllowNull := False;
Lbl := TLabelPlus.Create(BrowserDialog); Lbl.Caption := 'Činitel'; Lbl.Parent := BrowserDialog; Lbl.FocusControl := Edit; Lbl.Attached := True;
//Kurz NEdit := TBrowserNumEdit.Create(BrowserDialog); NEdit.Left := 65; NEdit.Top := 180; NEdit.Width := 55; NEdit.FieldName := 'koef'; NEdit.Parent := BrowserDialog; NEdit.DataType := ntFloat; NEdit.ButtonVisible := False; NEdit.TabOrder := 4; NEdit.AllowNull := False;
Lbl := TLabelPlus.Create(BrowserDialog); Lbl.Caption := 'Kurz'; Lbl.Parent := BrowserDialog; Lbl.FocusControl := NEdit; Lbl.Attached := True;
//Domácí měna LEdit := TBrowserLookupEdit.Create(BrowserDialog); LEdit.Left := 150; LEdit.Top := 30; LEdit.Width := 100; LEdit.FieldName := 'menad'; LEdit.Parent := BrowserDialog; LEdit.LookupDatabase := DefaultDatabaseName; LEdit.LookupSQL.Add('select m.id_mena, s.nazev, s.cleneu'); LEdit.LookupSQL.Add('from dba.gmeny as m, dba.gstaty as s'); LEdit.LookupSQL.Add('where s.id_stat = m.stat_id order by 1'); LEdit.LookupField := 'id_mena'; LEdit.TabOrder := 5; LEdit.AllowNull := False;
Lbl := TLabelPlus.Create(BrowserDialog); Lbl.Caption := 'Domácí měna'; Lbl.Parent := BrowserDialog; Lbl.FocusControl := LEdit; Lbl.Attached := True; end.
Událost nastává těsně po vytvoření editačního dialogu u operací typu insert a delete. Je to vhodný okamžik pro modifikaci prvků na dialogu (skrytí prvku, změna popisku, přidání nového prvku, apod).
Příklad 1. Skript obarví žlutou barvou editační prvek se jménem "EditMena". Tip: Jména a třídy prvků lze nad otevřeným editačním dialogem zjistit stiskem Ctrl+F12 a podržením myši nad prvkem.
var Edit: TBrowserLookupEdit; begin Edit := TBrowserLookupEdit(BrowserDialog.FindComponent('EditMena')); if Edit <> nil then Edit.Color := clYellow; end.
Příklad 2. Skript přidá na dialog tlačítko, po jehož kliknutí se spustí externí program s parametrem přejatým z prvku na dialogu. var NewBtn: TButton;
procedure NewBtnClick(Sender: TObject); var Edit: TBrowserEdit; begin Edit := TBrowserEdit(BrowserDialog.FindComponent('EditCislo')); if Edit <> nil then ShellExec('c:\cesta\program.exe', Edit.Text, False); end;
begin NewBtn := TButton.Create(BrowserDialog); with NewBtn do begin Parent := BrowserDialog; Left := 100; Top := 100; Caption := 'Click me'; OnClick := @NewBtnClick; end;
Událost nastává těsně před zobrazením editačního dialogu u operací typu insert a delete. Stejně jako u události OnCreateDialog lze i zde modifikovat prvky okna.
Událost nastává po naplnění prvků na editačním dialogu daty z aktuálního editovaného záznamu (v případě operace update), resp. výchozími hodnotami (v případě operace insert). Událost je možné využít k modifikaci prvků na dialogu na základě dat z aktuálního záznamu.
Událost nastane při pokusu o uložení změn v editačním dialogu. Je to okamžik vhodný pro validaci či dodatečnou změnu údajů na dialogu. Pomocí kontextové proměnné CanSave lze pokus o uložení dat stornovat a ponechat prohlížeč v editačním režimu.
Příklad Ukazuje jak lze v číselníku skl. položek při editaci každého záznamu uživateli nabídnout publikaci skl. položky na web, pokud ještě publikována není.
var ChBox: TBrowserCheckBox; begin //najdi komponentu pro volbu zda publikovat na webu ChBox := TBrowserCheckBox(BrowserDialog.FindComponent('BrChBoxWeb')); if ChBox <> nil then if not ChBox.Checked then case MsgBox('Zpřístupnit na webu', 'Tento artikl není označen pro zpřístupnění v eshopu. Označit nyní?', mtConfirmation, mbYes+mbNo+mbCancel) of
mrYes: ChBox.Checked := True; //zaškrtni volbu mrCancel: CanSave := False; //pokračuj v editaci end; end.
Událost nastává během vlastního ukládání změn do databáze. Událost je vhodná pro transakční spřažení databázové změny provedené uživatelem s dalšími operacemi. Událost je volána dvakrát - jednou před vlastní akcí a podruhé po akci. To, ve které fázi je skript volán je rozlišeno kontextovou proměnnou BeforeStage (True/False). Jak skript, tak i samotná výkonná akce jsou uzavřeny do databázové transakce, takže případná výjimka (chyba) ve skriptu stornuje změny provedené v předchozích fázích této události.
Pozor! Kontextová proměnná BrowserDialog je naplněna jen u operací typu insert a update, zatímco u operace typu delete obsahuje tato proměnná hodnotu nil.
Událost nastává při uzavření prohlížeče. Je to reciproční událost k OnShow. Tato událost není dostupná u prohlížečů typu "detail", tj. prohlížečů existujících v rámci editačních dialogů.
Příklad použití - Přidání akce do lišty browseru
Příklad ukazuje jak přidat do lišty browseru novou akci (tlačítko) spouštějící aplikaci MS Excel (s kláv. zkratkou Ctrl+Alt+F7)
1. Připravit si obrázek - msexcel.bmp reprezentující akci jako bitmapu o velikosti 16x16 pixelů a uložit ji do dokumentů (do databáze) pod jméno (např.):
System\Actions\msexcel.bmp
2. V menu Skripty - Speciální skripty nadefinovat tento skript:
System.OnInit var ImgIdx: integer; begin ImgIdx := RegisterActionImage('System\Actions\msexcel.bmp'); SetGlobalVar('ExcelImageIndex', ImgIdx); end.
3. V daném browseru nadefinovat tyto skripty pro přizpůsobení:
OnInit var Cmd: integer; begin Cmd := Browser.RegisterAction('ACT_EXCEL', 'Spustit MS Excel', GetGlobalVar('ExcelImageIndex'), False, VK_F7, ssCtrl+ssAlt); SetGlobalVar('CMD_EXCEL', Cmd); end.
OnCommand begin if BrowserCommand = GetGlobalVar('CMD_EXCEL') then ShellExec('excel.exe', '', False); end.
Poznámky: Levý dolní pixel v bitmapě definuje transparentní barvu (tato barva bude zobrazena jako průhledná).
Související témata |