Tipy a triky v Delphi, díl 38.

Po čase tu máme opět několik tipů z různých oblastí. Předvedeme si, jak vizuálně zvýraznit právě aktivní prvek na formuláři a zpřehlednit tak uživateli práci. Dále si ukážeme, jak prohodit tlačítka na myši, převod barev formátu TColor do hexa podoby a také si ukážeme, jak zjistit z registrů seznam nainstalovaných aplikací.
Vizuální zvýraznění aktivní komponenty Edit

Komponenta Edit, tedy editační pole pro vyplňování dat rozličného druhu, je jistě jedním z nejběžnějších prvků uživatelského prostředí. Ukážeme si jedno drobné vylepšení, kterým se může práce s těmito editačními poli zvláště v případě rozsáhlejších formulářů pro uživatele velmi zpřehlednit. Toho docílíme tak, že editační pole, které bude zrovna aktivní (tedy uživatel do něj bude právě něco vyplňovat nebo bude prostě označeno – bude mít tzv. Focus), určitým způsobem zvýrazníme. Zvýraznit jej můžeme třeba tím, že se změní jeho barva a font písma nebo některé jiné vizuální vlastnosti, které daná komponenta má. Postup lze totiž aplikovat i na komponenty typu Edit, které nejsou standardně dodávané s Delphi, máte-li některé takové nainstalovány a používáte-li je raději. Ale obecně se dá říci, že je postup použitelný na všechny vizuální komponenty, které mají události OnExit a OnEnter (viz. dále), tedy například tlačítka a různé další prvky. Ne každý takový prvek má však například vlastnost Color, takže je potřeba individuálně podle potřeb náš příklad upravit.

V naší ukázce si předvedeme změnu parametrů u Editu a u tlačítka. U komponenty Edit bude při aktivaci změněna barva, u tlačítka se změní font popisku na tučný. Provedeme to tak, že si vytvoříme vlastní obsluhy událostí OnEnter a OnExit, které nazveme prostě Enter a Exit. Poté na formulář umístěte libovolný počet editačních polí a nějaká tlačítka. U všech těchto prvků poté nastavte v Object Inspectoru obsluhu událostí OnEnter a OnExit právě na naše připravené procedury. U těch komponent, kde tyto události nenastavíte, se nestane pochopitelně nic, což ovšem rozhodně nemusí být na škodu a můžete si tak vybrat, které komponenty budou takto "postiženy".

.
.
.
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Enter(Sender: TObject);
    procedure Exit(Sender: TObject);
.
.
.

procedure TForm1.Enter(Sender: TObject);
begin
if (Sender is TCustomEdit) then TEdit(Sender).Color := clRed;
if (Sender is TButton) then TButton(Sender).Font.Style := [fsBold];
end;

procedure TForm1.Exit(Sender: TObject);
begin
if (Sender is TCustomEdit) then TEdit(Sender).Color := clWindow;
if (Sender is TButton) then TButton(Sender).Font.Style := [];
end;

Jak vidíte, každá obsluha obsahuje podmínku, podle které se určuje, jaké parametry budou změněny na základě typu daného vizuálního objektu (tedy u typu TButton font, u TEdit zase barva). Změnit se dají vlastně libovolné parametry, ale nás budou zřejmě zajímat pouze ty vizuální. V události OnEnter jednotlivých komponent tedy naše procedura Enter změní barevnost či další parametry a poté, když uživatel přejde na jinou komponentu (zaktivuje ji), původní hodnoty budou opět obnoveny procedurou Exit v události OnExit. Tím docílíme jednoduchého efektu, kdy právě aktivní prvek na formuláři bude vždy zvýrazněn.

Prohození tlačítek myši

Tento tip je opět jedním z těch, které asi v praxi příliš nevyužijeme, ale možná se může hodit, když budeme chtít například někoho trošku pozlobit. Ukážeme si, jak se snadno dají prohodit tlačítka na myši. Tedy pravé tlačítko se bude poté chovat jako levé a naopak. Poslouží nám k tomu následující jednoduchá funkce, jejímž parametrem je logická proměnná, určující, zda mají či nemají být klávesy prohozeny.

procedure ProhoditTlacitka(prohodit: Boolean);
begin
if prohodit then SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, nil, 0)
else SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, nil, 0);
end;

Převod barvy formátu TColor na HTML

Následující jednoduchá funkce převede barvu ve formátu TColor, tedy formát běžně v Delphi používaný, na její hexa formu (či chcete-li "HTML barvu").

function ColorToHtml(Color: TColor): string;
var
col: LongInt;
begin
col := ColorToRGB(Color);
Result := `#` + IntToHex(col and $FF, 2) + IntToHex(col shr 8 and $FF, 2) + IntToHex(col shr 16 and $FF, 2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ColorToHtml(clLime));
end;

Seznam nainstalovaných aplikací

Chcete-li vědět či přesněji řečeno programově zjistit, které programy máte v systému nainstalovány, není to žádný problém. Jako většina podobných informací o systému jsou i tyto informace uloženy v registrech, takže je stačí jen najít a přečíst si je. Jejich součástí je také tzv. odinstalační řetězec, což není nic jiného než cesta k příslušnému odinstalačnímu programu včetně případných parametrů. Pokud budete chtít, můžete si tímto způsobem vytvořit vlastní program podobný systémovému ovládacímu panelu "Přidat nebo odebrat programy" a odebrat tak libovolnou aplikaci, i když to není asi primární cíl našeho příkladu. Využít však seznamu nainstalovaných aplikací můžete ve vašem programu k různým účelům, protože některé aplikace třeba vyžadují ke své práci současně nainstalované i další programy, takže pokud je váš program podobného ražení, může si sám otestovat přítomnost všech potřebných součástí. Ovšem vše jen za předpokladu, že jsou aplikace korektně nainstalovány v systému a mají svůj záznam v registrech.

Ale pojďme k naší ukázce. Jelikož budeme používat registry, přidejte si do projektu knihovnu Registry. Dále si přidejte na formulář ListView a nastavte jeho styl na vsReport. Právě do tohoto ListView si do dvou sloupců vypíšeme názvy příslušných nainstalovaných aplikací a jejich odinstalační řetězec. Tvorba hlavičky ListView je vyřešena přímo v programu, takže po přidání komponenty na formulář a nastavení jejího zobrazovacího stylu (ačkoliv i to bychom mohli přidat přímo do programu) se již o víc nemusíte starat. Na závěr po načtení celého seznamu bude ještě pro přehlednost setříděn podle abecedy.

procedure TForm1.Button1Click(Sender: TObject);
const
    UNINST_PATH = `Software\Microsoft\Windows\CurrentVersion\Uninstall`;
var
    Reg : TRegistry;
    SubKey: TSTringList;
    ListItem: TListItem;
    I : Integer;
    sDisplayName, sUninstallString : String;
begin
    with ListView1 do begin       
        Columns.Add;
        Columns.Add;
        Columns[0].Caption := `Jméno`;
        Columns[1].Caption := `Odinstalační řetězec`;
        Columns[0].Width := 200;
        Columns[1].Width := 300;
    end;
    Reg := TRegistry.Create;
    try
        With ListView1.Items do
            try
                BeginUpdate;
                Clear;
                Reg.RootKey := HKEY_LOCAL_MACHINE;
                if Reg.OpenKeyReadOnly(UNINST_PATH) then begin
                    SubKey := TStringList.Create;
                    try
                        Reg.GetKeyNames(SubKey);
                        Reg.CloseKey;
                        for i := 0 to subKey.Count - 1 do
                        if Reg.OpenKeyReadOnly(Format(`%s\%s`, [UNINST_PATH, SubKey[i]]))
                        then begin
                            try
                                sDisplayName := Reg.ReadString(`DisplayName`);
                                sUninstallString := Reg.ReadString(`UninstallString`);
                                if (sDisplayName) <> `` then begin
                                    ListItem := Add;
                                    ListItem.Caption := sDisplayName;
                                    ListItem.SubItems.Add(sUninstallString);
                                end;
                            finally
                                Reg.CloseKey;
                            end;
                        end;
                    finally
                        SubKey.Free;
                    end;
                end;
            finally
                ListView1.AlphaSort;
                EndUpdate;
            end;
        finally
            Reg.CloseKey;
            reg.Free;
        end;
end;

Diskuze (2) Další článek: Volný a Pandora v novém

Témata článku: Software, Programování, Trik, Podobné parametry, TRI, DEL, Díl, Aktivní prvek, Exit, Prohozená klávesa, Odinstalační program, Libovolná aplikace, FF, Podobný typ


Určitě si přečtěte

Elon Musk podpořil Signal jako náhradu WhatsAppu. Aplikaci okamžitě zavalili uživatelé
Markéta Mikešová
WhatsAppElon MuskFacebook
Čekali jsme skoro šest let. Android Auto jede do Česka i na Slovensko
Lukáš Václavík
Android AutoNavigaceGoogle
Google vymyslel technologii superpřesného GPS. Už ji podporuje Pixel 5 a dorazí i na ostatní telefony

Google vymyslel technologii superpřesného GPS. Už ji podporuje Pixel 5 a dorazí i na ostatní telefony

** Kvalita GPS ve městech občas stojí za starou bačkoru ** Mohou za to odrazy signálu od okolních budov ** Google má jejich 3D model, a tak spolupracuje s výrobci GPS čipů

Jakub Čížek | 46

Jakub Čížek
NavigaceTechnologieGoogle
26 užitečných rozšíření pro Chrome: Naučte prohlížeč nové věci

26 užitečných rozšíření pro Chrome: Naučte prohlížeč nové věci

** Prohlížeč Chrome obsahuje širokou škálu funkcí, neumí ale všechno ** Jeho schopnosti můžete rozšířit pomocí rozšíření ** Vybrali jsme pro vás zajímavé a užitečné doplňky

Karel Kilián | 47

Karel Kilián
Doplňky do prohlížečeChromeProhlížeče
Technici nestíhají. Cetin dočasně přerušil zavádění VDSL bondingu
Lukáš Václavík
CETINPřipojení k internetu
Elon Musk už není nejbohatší na světě. Během jediného dne přišel o 324 miliard korun
Karel Kilián
Jeff BezosTesla MotorsElon Musk
Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

** Vybrali jsme nejlepší monitory na práci i pořádné hraní ** Nejlevnější monitor s kvalitním panelem nestojí ani tři tisíce ** Rozlišení 4K a větší obrazovka už není nedostupný luxus

David Polesný | 31

David Polesný
Monitory
Lépe bylo bez Googlu, přiznal s odstupem bývalý šéf Waze
Markéta Mikešová
WazeGoogle