Saturday, November 24, 2007

Začněme tedy pěkně od začátku. Možná víte, že tyto speciální aplikace nejsou spustitelné exe soubory, mají koncovku cpl a jedná se v podstatě od knihovny podobě jako dll. Tyto aplety se vytvářejí v Delphi poměrně snadno, i když je postup mírně odlišný od tvorby běžné aplikace. Začneme tím, že založíme nový projekt. Z menu File vybereme klasicky položku New a v zobrazeném dialogu najdeme a vybereme typ Control Panel Application. Hned si můžete všimnout, že nově vytvořené soubory se drobně liší od těch klasických aplikačních. První rozdíl je v tom, že v projektovém souboru nenajdeme klasický termín Program, ale místo toho se zde nalézá označení library. Vytvořená jednotka a její hlavní objekt pak není třídy TForm, ale TAppletModule. Proto se vám také neobjevilo obvyklé okno formuláře, na které lze umisťovat další komponenty, ale místo toho vidíte jiný typ formuláře, který je však nevizuální (tj. po spuštění apletu nebude vidět) a jeho úkolem je "pouze" zprostředkování událostí. Proto je nutné vytvořit ještě běžný typ formuláře typu TForm, který přidáme do projektu a bude vlastně tvořit samotné uživatelské rozhraní apletu. Vytvořte tedy takový formulář a odkaz na jeho jednotku musíte přidat do řádku uses u jednotky apletu. Celý kód pak tedy vypadá kupříkladu takto:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
CtlPanel, unit2;

type
TAppletModule1 = class(TAppletModule)
procedure AppletModuleActivate(Sender: TObject; Data: Integer);
private
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
end;

var
AppletModule1: TAppletModule1;

implementation

{$R *.DFM}

end.

Nyní je potřeba zajistit, aby se po spuštění apletu tento nově přidaný formulář zobrazil. K tomu použijeme událost OnActivate modulu apletu:

procedure TAppletModule1.AppletModuleActivate(Sender: TObject; Data: Integer);
begin
Form2 := TForm2.Create( self );
Form2.ShowModal;
Form2.Free;
end;

Labels:

Tuesday, November 13, 2007

Ovládací panely

Jak jistě dobře víte, Ovládací panely Windows obsahují řadu různých drobných aplikací, jejichž náplní práce je nastavení vlastností všech možných částí systému od myši až po sítě a databáze. Jistě jste si také všimli, že kromě těchto základních "aplikací" (ne vždy se jedná o samostatnou aplikaci v pravém slova smyslu), které jsou nainstalovány společně se systémem, se zde po nainstalování některých dalších aplikací objeví nové ikonky. Typickým zástupcem mohou být třeba přímo Delphi, které sem umístí odkaz na BDE Administrator, ale i řada dalších programů (namátkou třeba známá Sisoft Sandra, programy od Symantecu, Adobe a další). Cokoliv tedy nějakým způsobem souvisí s nastavením systému, má své sídlo zde a pokud vytváříme aplikaci tohoto typu, jistě by bylo vhodné umístit ji rovněž sem právě v podobě aplikace pro Ovládací panely.

Labels:

Monday, November 12, 2007

Dnešní díl bude poněkud netradiční, protože se trochu ohlédneme zpátky a uděláme si malý přehled toho, o čem jsme si až doposud povídali. Ano, je tomu již skoro přesně na den rok, co vyšel první díl našeho seriálu a tak je na čase udělat malou rekapitulaci. Přehledný obsah celého seriálu, tedy seznam všech tipů, bude náplní dnešního jubilejního dílu.
Doufám, že vám tento přehled pomůže alespoň k částečné orientaci a lépe se vám bude hledat ten tip, který zrovna potřebujete. Mnoho z vás mě žádá, zda by nešel celý seriál zabalit, aby se dal stáhnout ve formě jednoho souboru. Tím vám sice dnes nemohu sloužit, ale uvidíme do budoucna. Zatím se spokojte alespoň s tímto seznamem. Ale dost zbytečných řečí, přehled právě začíná...

Labels:

Wednesday, November 07, 2007

Test rozbaleni Treeview

I druhý dnešní tip se bude týkat Treeview, konkrétně stavu jeho rozbalení. Občas se totiž může hodit informace, zda je či není celý strom kompletně rozbalen, a podle toho příslušně reagovat. Postup je tedy poměrně logický. Projdeme postupně celý strom a testujeme rozbalenost jednotlivých podvětví. K tomu nám poslouží následující jednoduchá funkce, jejímž jediným parametrem je Treeview, jehož stav nás zajímá:
function IsExpanded(TView: TTreeview) : boolean;
var
Node: TTreenode;
begin
Assert(Assigned(TView));
if TView.Items.Count > 0 then
begin
Node := TView.Items[0];
Result := True;
while Result and Assigned(Node) do
begin
Result := Node.Expanded or not Node.HasChildren;
Node := Node.GetNext;
end;
end
else
Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsExpanded(TreeView1) then ShowMessage('Strom je rozbalen')
else ShowMessage('Strom není rozbalen');
end;
Zajímavá může být též funkce, která testuje, zda je celý strom kompletně zabalen. Funkce pak vypadá naprosto totožně, liší se pouze v podmínce testování, která může vypadat například takto:
Result := not (Node.Expanded and Node.HasChildren);
O metodách FullExpand a FullCollapse, které slouží k rozbalení a opětovnému zabalení celého stromu (a souvisejí tak s našim příkladem), snad mluvit nemusím, protože je jistě dobře znáte a běžně používáte.

Labels:

Saturday, November 03, 2007

Blikání ikony u prvků v TreeView

TreeView je velmi oblíbeným prvkem aplikací, protože celkem přehledně dokáže zobrazit v podstatě libovolnou hierarchickou strukturu dat. Jednotlivé prvky mohou mít vlastní ikonku a právě této ikonky využijeme v našem příkladu. Často se totiž vyskytne případ, kdy je nutné na určitou položku stromu uživatele nějakým způsobem upozornit, upoutat jeho pozornost a vynutit si tak jeho odezvu. A toho docílíme například tím, že necháme ikonku u příslušného prvku blikat.
Pro někoho to bude možná neohrabané řešení, nicméně pro tuto jednoduchou "animaci" použijeme Timer. Pochopitelně musíte mít rovněž na formuláři TreeView naplněný daty a definované příslušné ikonky pro jednotlivé prvky. Pak již stačí jen doplnit událost OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
var
r: TRect;
bNode: TTreeNode;
ImageWidth: Integer;
begin
with Form1.TreeView1 do bNode := Items[Items.count - 1 ];
with bNode do
begin
ImageIndex := ImageIndex xor MaxInt;
SelectedIndex := SelectedIndex xor MaxInt;
if IsVisible then
begin
ImageWidth := TTreeView(Treeview).Images.Width;
r := DisplayRect(True);
r.Right := r.Left + ImageWidth;
OffsetRect(r, -ImageWidth - 4 , 0);
InvalidateRect(GetHandle, @r, True);
end;
end;
end;
Blikající prvek, označený jako bNode, je v našem případě ten úplně poslední z celého stromu. Rychlost blikání je pochopitelně ovlivněna nastavením Timeru, takže zvolte vhodný interval.

Labels:

Friday, November 02, 2007

No a to je vlastně vše. Všimněte si též toho, že kvůli překreslení titulku v případě změny okna formuláře je volání umístěno v událostech OnPaint a OnResize formuláře.
Určitě vás také napadlo, zda by nešlo klasický aplikační titulek nahradit tím naším. V podstatě ano, ale pochopitelně po drobných úpravách. Přidat ikonu či tlačítka na zavření aplikace by snad neměl být takový problém. Rovněž zamezit zobrazení originálního titulkového pruhu není samozřejmě problém. Nesmíme však zapomenout na možnost přesunutí okna, neboť za náš nový titulkový pruh se samozřejmě aplikace uchopit a přesunout nedá. Proto je potřeba "přesměrovat" možnost uchopení a přesunu právě na náš nový titulek. I o tom však již byla kdysi v našem seriálu řeč...