Wednesday, February 28, 2007
Tuesday, February 27, 2007
...
Labels: delphi
Ale...
Labels: delphi
Sunday, February 25, 2007
...
...
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{$R XP.RES}
...
A to je vlastně vše. Nyní by již měla naše aplikace využívat pod Windows XP nových vizuálních stylů. Pod Windows 9x/NT/2000 se pochopitelně nic nemění.
Labels: delphi
run
C:\Náš adresář>brcc32.exe xp.rc
Výsledkem by mělo být to, že se v našem adresáři objeví zkompilovaný soubor resources pod názvem xp.res. Tím končí veškeré přípravy a nyní již můžeme přikročit k samotné úpravě naší aplikace.
Samotná úprava aplikace již spočívá v pouhém přidání takto vytvořeného a zkompilovaného resource souboru do zdrojového kódu. Nejprve tedy soubor xp.res zkopírujeme do adresáře s naším projektem a poté přidáme do zdrojového kódu (hlavního formuláře) následující direktivu:
{$R XP.RES}
Labels: delphi
Thursday, February 22, 2007
Nyní máme již soubor s resources připravený, ale takto by nám byl k ničemu. Je třeba jej nejprve zkompilovat, než jej budeme moci zakomponovat do naší aplikace. K tomu použijeme resource compiler, který je součástí Delphi a naleznete jej v adresáři Delphi\Bin pod názvem brcc32.exe. Nejpřehlednější způsob asi bude ten, že si tento soubor zkopírujete do nového prázdného adresáře, který si pro tento účel vytvoříte. Dále do tohoto adresáře zkopírujete i soubor manifestu (v našem případě xp.manifest) a zdrojový kód resources xp.rc.
Labels: delphi
Wednesday, February 21, 2007
Jedná se o stejný soubor,
Dostáváme se ke druhému bodu našeho postupu. Musíme teď vytvořit soubor resources, do něhož začleníme náš manifest. Vytvořte tedy nový textový soubor (například pomocí Poznámkového bloku), který se bude skládat pouze z tohoto jednoho řádku:
1 24 "xp.manifest"
Labels: delphi
Tuesday, February 20, 2007
Celý postup
Začněme tedy pěkně postupně. Nejprve si vytvoříme tzv. manifest, což je obyčejný textový soubor napsaný v XML, obsahující informace o aplikaci a použité verzi knihovny comctl32.dll. Vypadá takto:
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
Labels: delphi
Monday, February 19, 2007
Windows XP
Tento díl seriálu bude celý zaměřen na vizuální styly Windows XP a naučíme se, jak na ně v Delphi. Článek je jakési doplnění či rozšíření původního článku, který napsal kolega Radek Chalupa a který jste si mohli přečíst minulý týden. Méně zkušeným programátorům nebo těm, pro které nebyl původní text zcela srozumitelný, je právě určen dnešní díl seriálu tipů a triků. Vynecháme tedy teorii (tu doporučuji přečíst si ve výše zmíněném článku) a vrhneme se rovnou na příklad.
Labels: delphi
Průhledný formulář
V naší ukázce se po stisku prvního tlačítka formulář zprůhlední, po stisknutí tlačítka dvě se vše vrátí do původního stavu. Je třeba upozornit na to, že veškeré ostatní vizuální komponenty zůstanou nezměněny, takže například tlačítka se jaksi "vznášejí v prostoru". Taktéž zůstane zobrazen okraj formuláře.
private
{ Private declarations }
FullRgn, ClientRgn, CtlRgn: THandle;
procedure Pruhledny;
procedure Nepruhledny;
end;
{...}
implementation
{...}
procedure TForm1.Pruhledny;
var
AControl: TControl;
A, Margin, X, Y, CtlX, CtlY: Integer;
begin
Margin := (Width - ClientWidth) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
for A := 0 to ControlCount - 1 do
begin
AControl := Controls[A];
if (AControl is TWinControl) or (AControl is TGraphicControl) then with AControl do
begin
if Visible then
begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
end;
end;
end;
SetWindowRgn(Handle, FullRgn, True);
end;
procedure TForm1.Nepruhledny;
begin
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, True);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Pruhledny;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Nepruhledny;
end;
Sunday, February 18, 2007
Mazání všech položek ale asi není běžná činnost, proto si stačí pamatovat, že danou položku smažeme prostě a jednoduše pomocí jejího indexu, a v té souvislosti je nutné si uvědomit, že se tím pádem jednak zmenší jejich celkový počet a posunou se i indexy zbylých položek.
Friday, February 16, 2007
procedure TForm1.Fonts1Click(Sender: TObject);
begin
if Sender <> Fonts1 then Label1.Caption := (Sender as TMenuItem).Caption;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
NewItem: TMenuItem;
i: Integer;
begin
for i := 0 to Screen.Fonts.Count -1 do
begin
NewItem := TMenuItem.Create(Self);
NewItem.Caption := Screen.Fonts.Strings[i];
NewItem.OnClick := Fonts1Click;
Fonts1.Add(NewItem);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
begin
for i:=1 to Fonts1.Count do Fonts1.Delete(0);
end;
Wednesday, February 14, 2007
Přidávání položek do menu za běhu aplikace
Tuesday, February 13, 2007
var
LastKey: Word;
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
LastKey := Key;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
Srch: string;
ix: Integer;
begin
Srch := combobox1.Text;
if LastKey = $08 then
begin
LastKey := 0;
Exit;
end;
LastKey := 0;
ix := combobox1.Perform(CB_FINDSTRING, - 1, Longint(PChar(Srch)));
if ix > CB_ERR then
begin
combobox1.ItemIndex := ix;
combobox1.SelStart := Length(Srch);
combobox1.SelLength := (Length(combobox1.Text) - Length(Srch));
end;
end;
Funkce "autocomplete " v komponentě ComboBox
Monday, February 12, 2007
procedure SetNodeBoldState(Node: TTreeNode; Value: Boolean);
var
TVItem: TTVItem;
begin
if not Assigned(Node) then Exit;
with TVItem do
begin
mask := TVIF_STATE or TVIF_HANDLE;
hItem := Node.ItemId;
stateMask := TVIS_BOLD;
if Value then state := TVIS_BOLD
else state := 0;
TreeView_SetItem(Node.Handle, TVItem);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetNodeBoldState(TreeView1.Items[0],True);
end;
A to je pro dnešek všechno. Příště u dnešního tématu ještě vydržíme a i nadále si budeme pohrávat se standardními komponentami a vylepšovat je.
Saturday, February 10, 2007
Tučné položky v TreeView
Umístěte si tedy na formulář TreeView, naplňte jej cvičnými daty a vzhůru do experimentování. V naší ukázce si změníme hned první položku (s indexem 0). Opět je použita knihovna CommCtrl.
Thursday, February 08, 2007
Pro naši ukázku si na formulář umístěte jeden ListView (není třeba u něj žádné vlastnosti nastavovat, o vše se postará program sám) a dvě tlačítka. První tlačítko způsobí zobrazení jednotlivých položek a stylu zobrazení ListView (vlastně taková příprava před samotnou akcí) a druhé tlačítko je vlastně simulace nějaké činnosti, po jehož kliknutí se zvětší hodnota ProgressBaru, aby byla vidět funkčnost celé ukázky.
procedure TForm1.Button1Click(Sender: TObject);
var
r: TRect;
pb: TProgressBar;
begin
Listview1.Columns.Add.Width := 100;
Listview1.Columns.Add.Width := 200;
Listview1.ViewStyle := vsReport;
Listview1.Items.Add.Caption := 'Text';
r := Listview1.items[0].DisplayRect(drBounds);
r.left := r.Left + Listview1.columns[0].Width;
r.right := r.Left + Listview1.columns[1].Width;
pb:= TProgressBar.Create(self);
pb.Parent := Listview1;
pb.BoundsRect := r;
pb.Position := 30;
Listview1.items[0].Data := pb;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
pb: TProgressBar;
begin
pb := TProgressBar(Listview1.Items[0].Data);
pb.StepIt;
end;
Monday, February 05, 2007
ProgressBar jako položka v řádku v ListView
Sunday, February 04, 2007
Díra ve formuláři
Tvar a umístění díry si můžete vymyslet dle vlastního uvážení. V naší ukázce je to kruhová díra v levém horním rohu formuláře, která se objeví po kliknutí na příslušné tlačítko:
procedure TForm1.Button1Click(Sender: TObject);
var
region1, region2: hrgn;
begin
region1 := CreateRectRgn(0, 0, Width, Height);
region2 := CreateEllipticRgn(30, 30, 200, 200);
CombineRgn(region1, region1, region2, RGN_DIFF);
SetWindowRgn(Handle, region1, True);
end;
Thursday, February 01, 2007
Změna barvy ukazatele průběhu
...
uses commctrl;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clGreen);
end;