Přizpůsobení prohlížečů pomocí skriptů

Top  Previous  Next

Seznam témat:

úvod

příklad použití - Přidání akce do lišty browseru

 

Úvod

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).

OnInit

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.

 

 

 

OnOpen

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).

 

OnShow

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.

 

OnDataScroll

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.

 

OnCommand

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.

 

 

 

OnWantDialog

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.

 

 

 

OnCreateDialog

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;

 

OnShowDialog

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.

 

 

OnSyncData

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.

 

OnValidate

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.

 

 

OnSaveData

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.

 

OnClose

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