Friday, April 30, 2010

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.

Labels:

Thursday, April 29, 2010

Tipy a triky v Delphi

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.

Labels:

Tuesday, April 27, 2010

Tipy a triky v Delphi

Popis jednotlivých částí najdete v podobě komentářů ve zdrojovém kódu. Samotný princip je snad dostatečně jasný, jsou to vlastně jen jednoduché čáry s textovým popisem, umístěné na příslušných místech, které se vypočítají z rozměrů formuláře (grafu).
Ještě jedno malé upozornění. Jelikož je pro vykreslení grafu, tedy propojení vypočítaných bodů křivkou, použita procedura Polyline, která všechny jednotlivé po sobě jdoucí body spojí bez ohledu na matematiku, je tento konkrétní postup použitelný na spojité funkce. Ostatní funkce by bylo vhodné vykreslovat buď bod po bodu (tedy bez jejich vzájemného propojení, a proto je třeba kvůli dobré vizuální podobě grafu použít větší přesnost – vypočítat více bodů) a nebo jiným způsobem.

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.

Labels:

Monday, April 19, 2010

Kreslení grafu funkce

Tento příklad sice patří mezi klasické, skoro až školní příklady z učebnice programování, ale přesto si jej ukážeme. Pokročilejším čtenářům se tedy omlouvám, ale vydržte to.
V naší ukázce budeme pro názornost kreslit graf funkce sinus. Co také jiného. Kdo ví proč se obvykle v příkladech používá tato funkce, takže nebudeme bourat tradice.
Vytvořte si tedy nový projekt a na formulář umístěte komponentu PaintBox, ve které bude graf kreslen. Vlastnost Align nastavte tak, aby komponenta vyplňovala celý formulář (tedy na hodnotu alClient). Využijeme toho k tomu, aby se nám graf automaticky přizpůsoboval velikosti okna.
Nejprve tedy zdrojový kód (jeho popis bude následovat):
.
.
.
const pInterval=1000;

private
{ Private declarations }
FPoints: array [0..pInterval] of TPoint;

.
.
.

procedure VypocitatGraf;
var
RozsahX, RozsahY: Integer;
pocatek: TPoint;
radian, interval: Double;
i: Integer;
begin
RozsahX := (Form1.paintbox1.Width - 2) div 4;
RozsahY := (Form1.paintbox1.Height - 2) div 2;
pocatek := Point(Form1.paintbox1.Width div 2, Form1.paintbox1.Height div 2);
radian := -2.0 * Pi;
interval := 4.0 * Pi / pInterval;
for i := 0 to High(Form1.FPoints) do
begin
Form1.FPoints[i].X := pocatek.x + Round(radian * RozsahX / Pi);
Form1.FPoints[i].Y := pocatek.y - Round(sin(radian) * RozsahY);
radian := radian + interval;
end;
end;
Konstanta pInterval udává "rozlišení" grafu (počet jeho bodů) na intervalu od -2Pi do 2Pi, na kterém budeme funkci vykreslovat. Čím vyšší číslo, tím více body bude graf tvořen a tím lépe bude vypadat. Tyto body budou poté propojeny výslednou křivkou (viz dále). Počátek souřadnicové soustavy grafu je umístěn na střed PaintBoxu, rozsah X-ových souřadnic je dán Pi, Y-ové souřadnice ohraničuje samozřejmě jednička. Y-ové souřadnice jsou zároveň "převráceny", jak už to u počítačů bývá. Tedy nerostou z levého dolního rohu směrem nahoru, ale z levého horního rohu směrem dolů. Že se počítá v radiánech a ne ve stupních, snad netřeba zdůrazňovat.
Takže máme tedy vypočítané body, nyní nám zbývá nakreslit samotný graf. Kreslení bude provedeno jako událost OnPaint komponenty PaintBox:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
with PaintBox1.Canvas do
begin
Pen.Color := clBlue;
Polyline(FPoints);
end;
end;
Dále je třeba zajistit překreslování v daném měřítku při změně velikosti formuláře. Proto musíme ještě doplnit události OnCreate a OnResize formuláře:
procedure TForm1.FormResize(Sender: TObject);
begin
VypocitatGraf;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
VypocitatGraf;
end;
A tím je vlastně základ hotov. Funkce je již vykreslena. Příklad by však nebyl úplný bez nakreslení a popsání souřadnicových os. Přidáme si proto opět do události OnPaint několik dalších řádků; celá procedura tedy bude vypadat takto:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
pocatek: TPoint;
RozsahX, RozsahY: Integer;
begin
with PaintBox1.Canvas do
begin
{bílé pozadí grafu}
Brush.Color := clWhite;
Brush.Style := bsSolid;
Fillrect(paintbox1.BoundsRect);

{souřadnicový kříž}
pocatek := Point(paintbox1.Width div 2, paintbox1.Height div 2);
Pen.Color := clBlack;
Pen.Style := psSolid;
Pen.Width := 1;
MoveTo(1, pocatek.Y);
LineTo(paintbox1.Width - 1, pocatek.y);
MoveTo(pocatek.x, 1);
LineTo(pocatek.x, paintbox1.Height - 1);

Font.Name := 'Symbol';
Font.Size := 8;
Font.Color := clBlack;
RozsahX := (paintbox1.Width - 2) div 4;
RozsahY := (paintbox1.Height - 2) div 2;

{ukazatele a popis osy X}
MoveTo(pocatek.x - 2 * RozsahX, pocatek.y - 4);
LineTo(pocatek.x - 2 * RozsahX, pocatek.y + 4);
TextOut(pocatek.x - 2 * RozsahX + 2, pocatek.y + 2, '-2p');
MoveTo(pocatek.x - RozsahX, pocatek.y - 4);
LineTo(pocatek.x - RozsahX, pocatek.y + 4);
TextOut(pocatek.x - RozsahX + 2, pocatek.y + 2, '-p');
MoveTo(pocatek.x + RozsahX, pocatek.y - 4);
LineTo(pocatek.x + RozsahX, pocatek.y + 4);
TextOut(pocatek.x + RozsahX - 2 - TextWidth('p'), pocatek.y + 2, 'p');
MoveTo(pocatek.x + 2 * RozsahX, pocatek.y - 4);
LineTo(pocatek.x + 2 * RozsahX, pocatek.y + 4);
TextOut(pocatek.x + 2 * RozsahX - 2 - TextWidth('2p'), pocatek.y + 2, '2p');

{ukazatele a popis osy Y}
MoveTo(pocatek.x - 4, pocatek.y - RozsahY);
LineTo(pocatek.x + 4, pocatek.y - RozsahY);
TextOut(pocatek.x + 4, pocatek.y - RozsahY, '1.0');
MoveTo(pocatek.x - 4, pocatek.y - RozsahY div 2);
LineTo(pocatek.x + 4, pocatek.y - RozsahY div 2);
TextOut(pocatek.x + 4, pocatek.y - (RozsahY + TextHeight('1')) div 2, '0.5');
MoveTo(pocatek.x - 2, pocatek.y + RozsahY div 2);
LineTo(pocatek.x + 2, pocatek.y + RozsahY div 2);
TextOut(pocatek.x + 3, pocatek.y + (RozsahY - TextHeight('1')) div 2, '-0.5');
MoveTo(pocatek.x - 2, pocatek.y + RozsahY);
LineTo(pocatek.x + 2, pocatek.y + RozsahY);
TextOut(pocatek.x + 3, pocatek.y + RozsahY - TextHeight('1'), '-1.0');

{nakreslení samotné funkce}
Pen.Color := clBlue;
Polyline(FPoints);
end;
end;