Monday, July 30, 2007

procedure ListComponentProperties(Component: TComponent; Strings: TStrings);
var
Count, Size, I: Integer;
List: PPropList;
PropInfo: PPropInfo;
PropOrEvent, PropValue: string;
begin
Count := GetPropList(Component.ClassInfo, tkAny, nil);
Size := Count * SizeOf(Pointer);
GetMem(List, Size);
try
Count := GetPropList(Component.ClassInfo, tkAny, List);
for I := 0 to Count - 1 do
begin
PropInfo := List^[I];
if PropInfo^.PropType^.Kind in tkMethods then
PropOrEvent := 'Event'
else
PropOrEvent := 'Property';
PropValue := VarToStr(GetPropValue(Component, PropInfo^.Name));
Strings.Add(Format('[%s] %s: %s = %s', [PropOrEvent, PropInfo^.Name,
PropInfo^.PropType^.Name, PropValue]));
end;
finally
FreeMem(List);
end;
end;

Labels:

Sunday, July 29, 2007

Zobrazení vlastností komponent

Tento příklad zřejmě nevyužijete v reálných aplikacích či přesněji řečeno, nejedná o funkci, kterou by uživatelé vašich aplikací na první pohled mohli ocenit. Ukážeme si, jak jednoduchým způsobem zjišťovat za běhu aplikace vlastnosti všech komponent, které obsahuje. Může to být neocenitelná pomoc při ladění aplikace při fázi vývoje, při logování chyb v případě pádu aplikace a podobně.
Umístěte si na formulář komponentu Memo, do které budeme v naší ukázce vlastnosti komponent vypisovat. Poté můžete na formulář umístit libovolné další komponenty, na kterých si ověříte funkčnost našeho příkladu.

Labels:

Nyní si na formulář umístěte komponentu WebBrowser. Ne každá verze Delphi ji má, takže pokud ji na záložce Internet nevidíte a nebo podobnou záložku vůbec nemáte, není tento příklad bohužel pro vás.
Samotné použití naší funkce demonstruje poněkud neohrabaným způsobem následující kód, který berte spíše jako odstrašující příklad, nicméně je ideální pro pochopení celého principu. Tedy pokud ovládáte alespoň základy HTML, v opačném případě si zřejmě z tohoto tipu nic neodnesete.
procedure TForm1.Button1Click(Sender: TObject);
begin
WB_LoadHTML(WebBrowser1,'Testovací stránka');
end;
Tato kratičká ukázka zobrazí v okně "prohlížeče" jednoduchý text bílou barvou na modrém pozadí. Jak vidíte, tímto způsobem zobrazovat celé stránky pochopitelně není moc praktické, ale věřím, že si již dokážete poradit sami a určitě pro vás nebude problém načíst stránku

Labels:

Thursday, July 26, 2007

Zobrazení HTML

kódu v komponentě WebBrowser
Ukážeme si velmi jednoduchý příklad, jak pomocí kratičké funkce zobrazit v komponentě WebBrowser HTML kód. Funkce bude vypadat takto:
procedure WB_LoadHTML(WebBrowser: TWebBrowser; HTMLCode: string);
var
sl: TStringList;
ms: TMemoryStream;
begin
WebBrowser.Navigate('about:blank');
if Assigned(WebBrowser.Document) then
begin
sl := TStringList.Create;
try
ms := TMemoryStream.Create;
try
sl.Text := HTMLCode;
sl.SaveToStream(ms);
ms.Seek(0, 0);
(WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
end;
finally
sl.Free;
end;
end;
end;

Labels:

příklad

Náš příklad přidá do nástrojové lišty tlačítko s nadpisem Text tlačítka a přidá do menu položku Název položky v menu. Pokud se vám na lištu tlačítko nepřidá, budete ho muset přes menu Zobrazit -> Panely nástrojů -> Vlastní přidat ručně a najdete ho mezi dostupnými položkami.
Aktivací tlačítka nebo položky z menu dojde ke spuštění Kalkulačky. Jak vidíte podle parametrů, lze též nastavit ikonku, která bude na tlačítku zobrazena a to jak ve své neaktivní podobě, tak po najetí myší. Místo mnou zvolené systémové ikony s číslem 4 můžete jako parametr pochopitelně uvést cestu k libovolné ikoně v souboru ICO nebo k nějaké jiné knihovně.
A jak se tlačítka a položky v menu zbavit, když už nás omrzí ? Jednoduše z registru smažeme příslušnou větev. To jsme ale již prováděli několikrát a tak věřím, že to každý zvládne sám.
V registrech se dá ale nastavit ohledně IE ještě řada dalších zajímavých věcí, takže zájemci nechť si otevřou Editor registru a pustí se do hledání dalších lahůdek.

Labels:

Tuesday, July 24, 2007

Celé je to vlastně velmi jednoduché

a je to opět záležitost systémového registru, kam do příslušné větve IE vložíme náš záznam. Zdrojový kód tedy může vypadat například takto:
procedure TlacitkoIE(Path: string);
const
Tagit = '\{10954C80-4F0F-11d3-B17C-00C0DFE39736}\';
var
Reg: TRegistry;
Vetev: string;
begin
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
Vetev := 'Software\Microsoft\Internet Explorer\Extensions' + Tagit;
OpenKey(Vetev, True);
WriteString('ButtonText', 'Text tlačítka');
WriteString('MenuText', 'Název položky v menu');
WriteString('MenuStatusBar', 'Run Script');
WriteString('ClSid', '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}');
WriteString('Default Visible', 'Yes');
WriteString('Exec', Path);
WriteString('HotIcon', ',4');
WriteString('Icon', ',4');
end
finally
Reg.CloseKey;
Reg.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TlacitkoIE('c:\windows\calc.exe');
end;

Labels:

Přidání vlastního tlačítka do panelu nástrojů v IE

Možná znáte různé programy, které se snaží vylepšit a rozšířit funkce Internet Exploreru. Oblíbenou módou zejména různých vyhledávačů (a to i českých) je vnutit svým uživatelům drobné utility, které například rozšíří nástrojový panel IE o vyhledávací políčko daného vyhledávače nebo umožní například odeslat zprávu SMS. Ponechme teď stranou, jak užitečné či neužitečné podobné prográmky jsou a zkusme si něco obdobného. Ukážeme si, jak přidat do panelu nástrojů vlastní tlačítko, které spustí námi definovanou aplikaci. Zároveň se do menu Nástroje přidá další položka se stejnou funkcí.

Labels:

Monday, July 23, 2007

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;

Friday, July 20, 2007

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;

Labels:

Tuesday, July 17, 2007

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.

Labels:

Sunday, July 15, 2007

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:

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;

Labels:

Friday, July 13, 2007

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

Labels:

Thursday, July 12, 2007

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.

Labels:

Tuesday, July 10, 2007

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:

Monday, July 09, 2007

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

Friday, July 06, 2007

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

Labels:

Tuesday, July 03, 2007

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:

Sunday, July 01, 2007

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.