Metoda Hot Key
Poprzednio poznaliśmy metodę przechwytywania klawiatury o nazwie Key Press. Metoda
Hot Key jest drugą możliwością przechwytywania klawiatury i
tworzenia skrótów klawiaturowych, jaką daje nam Delphi (zakładka
Tools Pallete).
Podobnie,
jak w poprzednim przypadku, do testowania naszych działań
wykorzystamy stworzoną przez nas procedurę o nazwie „Opcja
niedostępna”. Oprócz niej używać będziemy jeszcze procedurę
WMHotKey, którą deklarujemy w sekcji Private.
W
metodzie, którą przedstawiamy, aby przyswoić któryś z klawiszy
do naszych potrzeb, musimy najpierw zarejestrować go w funkcji Hot
Key i przypisać polecenie, które ma zostać wykonane po jego
naciśnięciu. Każdy klawisz i każda kombinacja klawiszy (skróty
klawiaturowe) musi zostać osobno zarejestrowana. Rejestracji
dokonujemy w procedurze Form Create. Jest to chyba oczywiste miejsce:
Przechwytu klawiszy musimy dokonać razem z uruchamiającym się
programem.
Spójrzmy
na zapis z rejestracji pierwszego klawisza:
RegisterHotKey(Handle,$0001,0,VK_F1)
Polecenie
„RegisterHotKey” mówi samo za siebie: „zarejestruj skrót
klawiaturowy”. Po słowie Handle mamy identyfikator tego skrótu,
który jest liczbą kolejną, począwszy od pierwszej, czyli 0001.
Jak widzimy po tej sekcji, w sumie zarejestrowaliśmy 171 różnych
klawiszy i ich kombinacji. Po identyfikatorze umieszczamy kod
klawisza lub klawiszy, które chcemy przejąć. Nie spotkaliśmy się
jeszcze z taką formą identyfikowania klawiszy. Jest ona drugim,
równorzędnym sposobem oznaczania klawiszy. Po literach „VK”
wpisujemy słowną nazwę klawisza, oczywiście w języku angielskim,
który w środowisku Delphi obowiązuje. Chcąc zatem przejąć dany
klawisz, musimy wiedzieć, jak się on nazywa. W materiałach
pomocniczych do Delphi odnajdziemy bez problemu takie informacje.
W
przypadku, gdy chcemy zarejestrować kombinację klawiszy, musimy
podać nazwy obu klawiszy, pamiętając o tym, że dla klawiszy
rozszerzonych (Alt, Ctrl, Shift, Win) nie stosujemy początkowych
liter w postaci VK, lecz MOD, a także musimy pamiętać
o tym, że dla klawisza Ctrl stosujemy jego pełną nazwę, czyli
Control.
Po
rejestracji klawiszy musimy jeszcze oprogramować procedury, które
zostaną wykonane po ich naciśnięciu. Polecenia te zawieramy w
procedurze WMHotKey. Cała ta procedura to zbiór osobnych warunków,
które przypisane są do poszczególnych klawiszy zarejestrowanych
wcześniej. Program sprawdza, czy któryś z klawiszy (opatrzony tu
identyfikatorem „$” został naciśnięty:
if
Msg.wParam= $0001 then
begin
Opcja_niedostepna;
end;
Jeżeli
przyjrzymy się bliżej kodowi metody Hot Key, stwierdzimy, że nie
jest ona zbyt skomplikowana. Wydaje się ona być trudna z uwagi na
jej rozbudowaną formę, wynikającą tylko i wyłącznie z tego, iż
musimy zarejestrować i oprogramować każdy klawisz z osobna.
Całą
ideę metody Hot Key możemy zawrzeć w następujący schemat:
Form
Create: RegisterHotKey(Handle,$0001,0,VK_F1)
WMHotKey:
if
Msg.wParam= $0001
then
...
Najpierw
rejestrujemy klawisz, a następnie przypisujemy do niego polecenie,
które ma zostać wykonane. Taka budowa hooka pozwala nam na wybranie
do przechwytu tylko takie klawisze i skróty, jakie chcemy. Nie
musimy więc stosować pełnej wersji tej metody, którą tu
zamieszczamy. Po wybraniu klawiszy, rejestrujemy je w dowolnej
kolejności, pamiętając o tym, aby poszczególne identyfikatory
($0000) były ciągiem kolejnych liczb naturalnych: 0001, 0002, 0003
itd.
Oto
pełny kod metody Hot Key:
unit
Unit1;
interface
uses
Windows,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 =
class(TForm)
procedure
Opcja_niedostepna;
procedure
FormCreate(Sender: TObject);
private
{ Private declarations }
procedure
WMHotKey(var Msg: TMessage); message WM_HOTKEY;
public
{ Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R
*.dfm}
// PROCEDURA OPCJA
NIEDOSTĘPNA //
procedure
TForm1.Opcja_niedostepna;
begin
ShowMessage('Opcja
niedostępna');
end;
//rejestracja skrótów
klawiaturowych
procedure
TForm1.FormCreate(Sender: TObject);
begin
// SKRÓTY KLAWIATUROWE F1-F12
i Esc //
RegisterHotKey(Handle,$0001,0,VK_F1);
// F1
RegisterHotKey(Handle,$0002,0,VK_F2);
// F2
RegisterHotKey(Handle,$0003,0,VK_F3);
// F3
RegisterHotKey(Handle,$0004,0,VK_F4);
// F4
RegisterHotKey(Handle,$0005,0,VK_F5);
// F5
RegisterHotKey(Handle,$0006,0,VK_F6);
// F6
RegisterHotKey(Handle,$0007,0,VK_F7);
// F7
RegisterHotKey(Handle,$0008,0,VK_F8);
// F8
RegisterHotKey(Handle,$0009,0,VK_F9);
// F9
RegisterHotKey(Handle,$0010,0,VK_F10);
// F10
RegisterHotKey(Handle,$0011,0,VK_F11);
// F11
RegisterHotKey(Handle,$0012,0,VK_F12);
// F12
RegisterHotKey(Handle,$0013,0,VK_ESCAPE);
// Esc
// SKRÓTY KLAWIATUROWE Alt+F1-F12,Esc
RegisterHotKey(Handle,$0014,MOD_ALT,VK_F1);
//Alt+F1
RegisterHotKey(Handle,$0015,MOD_ALT,VK_F2);
//Alt+F2
RegisterHotKey(Handle,$0016,MOD_ALT,VK_F3);
//Alt+F3
RegisterHotKey(Handle,$0017,MOD_ALT,VK_F4);
//Alt+F4
RegisterHotKey(Handle,$0018,MOD_ALT,VK_F5);
//Alt+F5
RegisterHotKey(Handle,$0019,MOD_ALT,VK_F6);
//Alt+F6
RegisterHotKey(Handle,$0020,MOD_ALT,VK_F7);
//Alt+F7
RegisterHotKey(Handle,$0021,MOD_ALT,VK_F8);
//Alt+F8
RegisterHotKey(Handle,$0022,MOD_ALT,VK_F9);
//Alt+F9
RegisterHotKey(Handle,$0023,MOD_ALT,VK_F10);
//Alt+F10
RegisterHotKey(Handle,$0024,MOD_ALT,VK_F11);
//Alt+F11
RegisterHotKey(Handle,$0025,MOD_ALT,VK_F12);
//Alt+F12
RegisterHotKey(Handle,$0026,MOD_ALT,VK_ESCAPE);
//Alt+Esc
// SKRÓTY
KLAWIATUROWE Ctrl+ F1-F12,Esc
RegisterHotKey(Handle,$0027,MOD_CONTROL,VK_F1);
//Ctrl+F1
RegisterHotKey(Handle,$0028,MOD_CONTROL,VK_F2);
//Ctrl+F2
RegisterHotKey(Handle,$0029,MOD_CONTROL,VK_F3);
//Ctrl+F3
RegisterHotKey(Handle,$0030,MOD_CONTROL,VK_F4);
//Ctrl+F4
RegisterHotKey(Handle,$0031,MOD_CONTROL,VK_F5);
//Ctrl+F5
RegisterHotKey(Handle,$0032,MOD_CONTROL,VK_F6);
//Ctrl+F6
RegisterHotKey(Handle,$0033,MOD_CONTROL,VK_F7);
//Ctrl+F7
RegisterHotKey(Handle,$0034,MOD_CONTROL,VK_F8);
//Ctrl+F8
RegisterHotKey(Handle,$0035,MOD_CONTROL,VK_F9);
//Ctrl+F9
RegisterHotKey(Handle,$0036,MOD_CONTROL,VK_F10);
//Ctrl+F10
RegisterHotKey(Handle,$0037,MOD_CONTROL,VK_F11);
//Ctrl+F11
RegisterHotKey(Handle,$0038,MOD_CONTROL,VK_F12);
//Ctrl+F12
RegisterHotKey(Handle,$0039,MOD_CONTROL,VK_ESCAPE);
//Ctrl+Esc
//
PRZECHWYT KLAWISZY STRZALEK //
RegisterHotKey(Handle,$0040,0,VK_LEFT);
// strzałka
w lewo
RegisterHotKey(Handle,$0041,0,VK_RIGHT);
// strzałka w
prawo
RegisterHotKey(Handle,$0042,0,VK_UP);
//
strzałka w górę
RegisterHotKey(Handle,$0043,0,VK_DOWN);
// strzałka w
dół
// PRZECHWYT INNYCH
KLAWISZY I SKRÓTÓW KLAWIATUROWYCH //
RegisterHotKey(Handle,$0044,MOD_CONTROL,VK_TAB);
//Ctrl+Tab
RegisterHotKey(Handle,$0045,MOD_ALT,VK_TAB);
//Alt+Tab
RegisterHotKey(Handle,$0046,MOD_CONTROL,VK_CAPITAL);
//Ctrl+CapsLock
RegisterHotKey(Handle,$0047,MOD_ALT,VK_CAPITAL);
//Alt+CapsLock
RegisterHotKey(Handle,$0048,0,VK_TAB);
//klawisz TAB
RegisterHotKey(Handle,$0049,0,VK_CAPITAL);
//klawisz CAPS LOCK
RegisterHotKey(Handle,$0050,0,VK_INSERT);
//klawisz INSERT
RegisterHotKey(Handle,$0051,0,VK_HOME);
//klawisz Home
RegisterHotKey(Handle,$0052,0,VK_PRIOR);
//klawisz PAGE UP
RegisterHotKey(Handle,$0053,0,VK_DELETE);
//klawisz DELETE
RegisterHotKey(Handle,$0054,0,VK_END);
//klawisz END
RegisterHotKey(Handle,$0055,0,VK_NEXT);
//klawisz PAGE DOWN
RegisterHotKey(Handle,$0056,0,VK_SNAPSHOT);
//klawisz PRINT SCRN
RegisterHotKey(Handle,$0057,0,VK_SCROLL);
//klawisz SCROLL LOCK
RegisterHotKey(Handle,$0058,0,VK_PAUSE);
//klawisz PAUSE BREAK
RegisterHotKey(Handle,$0059,0,VK_SPACE);
//klawisz Spacja
RegisterHotKey(Handle,$0060,0,VK_NUMLOCK);
//klawisz NumLock
RegisterHotKey(Handle,$0061,0,VK_ADD);
//klawisz '+' klawiatura
numeryczna
RegisterHotKey(Handle,$0062,0,VK_SUBTRACT);
//klawisz '-' klawiatura numeryczna
RegisterHotKey(Handle,$0063,0,VK_MULTIPLY);
//klawisz '*' klawiatura numeryczna
RegisterHotKey(Handle,$0064,0,VK_DIVIDE);
//klawisz '/' klawiatura numeryczna
RegisterHotKey(Handle,$0065,MOD_ALT,VK_BACK);
//Alt+Backpace
RegisterHotKey(Handle,$0066,MOD_ALT,VK_SPACE);
//Alt+Spacja
RegisterHotKey(Handle,$0067,MOD_ALT,VK_RETURN);
//Alt+Enter
RegisterHotKey(Handle,$0068,MOD_ALT,VK_SNAPSHOT);
//Alt+PrintScrn
RegisterHotKey(Handle,$0069,MOD_ALT,VK_SCROLL);
//Alt+ScrollLock
RegisterHotKey(Handle,$0070,MOD_ALT,VK_PAUSE);
//Alt+Pause
RegisterHotKey(Handle,$0071,MOD_ALT,VK_INSERT);
//Alt+Insert
RegisterHotKey(Handle,$0072,MOD_ALT,VK_HOME);
//Alt+Home
RegisterHotKey(Handle,$0073,MOD_ALT,VK_PRIOR);
//Alt+PageUp
RegisterHotKey(Handle,$0074,MOD_ALT,VK_DELETE);
//Alt+Delete
RegisterHotKey(Handle,$0075,MOD_ALT,VK_END);
//Alt+End
RegisterHotKey(Handle,$0076,MOD_ALT,VK_NEXT);
//Alt+PageDown
RegisterHotKey(Handle,$0077,MOD_ALT,VK_LEFT);
//Alt+Strzałka lewa
RegisterHotKey(Handle,$0078,MOD_ALT,VK_UP);
//Alt+Strzałka górna
RegisterHotKey(Handle,$0079,MOD_ALT,VK_RIGHT);
//Alt+Strzałka prawa
RegisterHotKey(Handle,$0080,MOD_ALT,VK_DOWN);
//Alt+Strzałka dolna
RegisterHotKey(Handle,$0081,MOD_ALT,VK_NUMLOCK);
//Alt+NumLock
RegisterHotKey(Handle,$0082,MOD_ALT,VK_ADD);
//Alt+ '+' klawiatura
numeryczna
RegisterHotKey(Handle,$0083,MOD_ALT,VK_SUBTRACT);
//Alt+ '-' klawiatura
numeryczna
RegisterHotKey(Handle,$0084,MOD_ALT,VK_MULTIPLY);
//Alt+ '*' klawiatura
numeryczna
RegisterHotKey(Handle,$0085,MOD_ALT,VK_DIVIDE);
//Alt+ '/' klawiatura
numeryczna
RegisterHotKey(Handle,$0086,MOD_CONTROL,VK_BACK);
//Ctrl+BackPace
RegisterHotKey(Handle,$0087,MOD_CONTROL,VK_SPACE);
//Ctrl+Space
RegisterHotKey(Handle,$0088,MOD_CONTROL,VK_RETURN);
//Ctrl+Enter
RegisterHotKey(Handle,$0089,MOD_CONTROL,VK_BACK);
//Ctrl+BackPace
RegisterHotKey(Handle,$0090,MOD_CONTROL,VK_SNAPSHOT);
//Ctrl+PrintScrn
RegisterHotKey(Handle,$0091,MOD_CONTROL,VK_INSERT);
//Ctrl+Insert
RegisterHotKey(Handle,$0092,MOD_CONTROL,VK_HOME);
//Ctrl+Home
RegisterHotKey(Handle,$0093,MOD_CONTROL,VK_PRIOR);
//Ctrl+PageUp
RegisterHotKey(Handle,$0094,MOD_CONTROL,VK_DELETE);
//Ctrl+Delete
RegisterHotKey(Handle,$0095,MOD_CONTROL,VK_END);
//Ctrl+End
RegisterHotKey(Handle,$0096,MOD_CONTROL,VK_NEXT);
//Ctrl+PageDown
RegisterHotKey(Handle,$0097,MOD_CONTROL,VK_LEFT);
//Ctrl+Strzałka lewa
RegisterHotKey(Handle,$0098,MOD_CONTROL,VK_UP);
//Ctrl+Strzałka górna
RegisterHotKey(Handle,$0099,MOD_CONTROL,VK_RIGHT);
//Ctrl+Strzałka prawa
RegisterHotKey(Handle,$0100,MOD_CONTROL,VK_DOWN);
//Ctrl+Strzałka dolna
RegisterHotKey(Handle,$0101,MOD_CONTROL,VK_ADD);
//Ctrl+ '+' klawiatura
numeryczna
RegisterHotKey(Handle,$0102,MOD_CONTROL,VK_SUBTRACT);
//Ctrl+'-'
klawiatura numeryczna
RegisterHotKey(Handle,$0103,MOD_CONTROL,VK_MULTIPLY);
//Ctrl+'*'
klawiatura numeryczna
RegisterHotKey(Handle,$0104,MOD_CONTROL,VK_DIVIDE);
//Ctrl+'/' klawiatura
numeryczna
//
SKRÓTY KLAWIATUROWE Win+ klawisz
RegisterHotKey(Handle,$0105,MOD_WIN,VK_F2);
//Win+F2
RegisterHotKey(Handle,$0106,MOD_WIN,VK_F3);
//Win+F3
RegisterHotKey(Handle,$0107,MOD_WIN,VK_F4);
//Win+F4
RegisterHotKey(Handle,$0108,MOD_WIN,VK_F5);
//Win+F5
RegisterHotKey(Handle,$0109,MOD_WIN,VK_F6);
//Win+F6
RegisterHotKey(Handle,$0110,MOD_WIN,VK_F7);
//Win+F7
RegisterHotKey(Handle,$0111,MOD_WIN,VK_F8);
//Win+F8
RegisterHotKey(Handle,$0112,MOD_WIN,VK_F9);
//Win+F9
RegisterHotKey(Handle,$0113,MOD_WIN,VK_F10);
//Win+F10
RegisterHotKey(Handle,$0114,MOD_WIN,VK_F11);
//Win+F11
RegisterHotKey(Handle,$0115,MOD_WIN,VK_F12);
//Win+F12
RegisterHotKey(Handle,$0116,MOD_WIN,VK_ESCAPE);
//Win+Esc
RegisterHotKey(Handle,$0117,MOD_WIN,VK_BACK);
//Win+Backpace
RegisterHotKey(Handle,$0118,MOD_WIN,VK_CAPITAL);
//Win+CapsLock
RegisterHotKey(Handle,$0119,MOD_WIN,VK_SPACE);
//Win+Spacja
RegisterHotKey(Handle,$0120,MOD_WIN,VK_RETURN);
//Win+Enter
RegisterHotKey(Handle,$0121,MOD_WIN,VK_SNAPSHOT);
//Win+PrintScrn
RegisterHotKey(Handle,$0122,MOD_WIN,VK_SCROLL);
//Win+ScrollLock
RegisterHotKey(Handle,$0123,MOD_WIN,VK_INSERT);
//Win+Insert
RegisterHotKey(Handle,$0124,MOD_WIN,VK_HOME);
//Win+Home
RegisterHotKey(Handle,$0125,MOD_WIN,VK_PRIOR);
//Win+PageUp
RegisterHotKey(Handle,$0126,MOD_WIN,VK_DELETE);
//Win+Delete
RegisterHotKey(Handle,$0127,MOD_WIN,VK_END);
//Win+End
RegisterHotKey(Handle,$0128,MOD_WIN,VK_NEXT);
//Win+PageDown
RegisterHotKey(Handle,$0129,MOD_WIN,VK_LEFT);
//Win+Strzałka lewa
RegisterHotKey(Handle,$0130,MOD_WIN,VK_UP);
//Win+Strzałka górna
RegisterHotKey(Handle,$0131,MOD_WIN,VK_RIGHT);
//Win+Strzałka prawa
RegisterHotKey(Handle,$0132,MOD_WIN,VK_DOWN);
//Win+Strzałka dolna
RegisterHotKey(Handle,$0133,MOD_WIN,VK_NUMLOCK);
//Win+NumLock
RegisterHotKey(Handle,$0134,MOD_WIN,VK_ADD);
//Win+ '+' klawiatura
numeryczna
RegisterHotKey(Handle,$0135,MOD_WIN,VK_SUBTRACT);
//Win+ '-' klawiatura
numeryczna
RegisterHotKey(Handle,$0136,MOD_WIN,VK_MULTIPLY);
//Win+ '*' klawiatura
numeryczna
RegisterHotKey(Handle,$0137,MOD_WIN,VK_DIVIDE);
//Win+ '/' klawiatura
numeryczna
//
SKRÓTY KLAWIATUROWE Shift + klawisz
RegisterHotKey(Handle,$0138,MOD_SHIFT,VK_F1);
//Shift+F1
RegisterHotKey(Handle,$0139,MOD_SHIFT,VK_F2);
//Shift+F2
RegisterHotKey(Handle,$0140,MOD_SHIFT,VK_F3);
//Shift+F3
RegisterHotKey(Handle,$0141,MOD_SHIFT,VK_F4);
//Shift+F4
RegisterHotKey(Handle,$0142,MOD_SHIFT,VK_F5);
//Shift+F5
RegisterHotKey(Handle,$0143,MOD_SHIFT,VK_F6);
//Shift+F6
RegisterHotKey(Handle,$0144,MOD_SHIFT,VK_F7);
//Shift+F7
RegisterHotKey(Handle,$0145,MOD_SHIFT,VK_F8);
//Shift+F8
RegisterHotKey(Handle,$0146,MOD_SHIFT,VK_F9);
//Shift+F9
RegisterHotKey(Handle,$0147,MOD_SHIFT,VK_F10);
//Shift+F10
RegisterHotKey(Handle,$0148,MOD_SHIFT,VK_F11);
//Shift+F11
RegisterHotKey(Handle,$0149,MOD_SHIFT,VK_BACK);
//Shift+Backpace
RegisterHotKey(Handle,$0150,MOD_SHIFT,VK_TAB);
//Shift+Tab
RegisterHotKey(Handle,$0151,MOD_SHIFT,VK_CAPITAL);
//Shift+CapsLock
RegisterHotKey(Handle,$0152,MOD_SHIFT,VK_SPACE);
//Shift+Spacja
RegisterHotKey(Handle,$0153,MOD_SHIFT,VK_RETURN);
//Shift+Enter
RegisterHotKey(Handle,$0154,MOD_SHIFT,VK_SNAPSHOT);
//Shift+PrintScrn
RegisterHotKey(Handle,$0155,MOD_SHIFT,VK_SCROLL);
//Shift+ScrollLock
RegisterHotKey(Handle,$0156,MOD_SHIFT,VK_PAUSE);
//Shift+Pause
RegisterHotKey(Handle,$0157,MOD_SHIFT,VK_INSERT);
//Shift+Insert
RegisterHotKey(Handle,$0158,MOD_SHIFT,VK_HOME);
//Shift+Home
RegisterHotKey(Handle,$0159,MOD_SHIFT,VK_PRIOR);
//Shift+PageUp
RegisterHotKey(Handle,$0160,MOD_SHIFT,VK_DELETE);
//Shift+Delete
RegisterHotKey(Handle,$0161,MOD_SHIFT,VK_END);
//Shift+End
RegisterHotKey(Handle,$0162,MOD_SHIFT,VK_NEXT);
//Shift+PageDown
RegisterHotKey(Handle,$0163,MOD_SHIFT,VK_LEFT);
//Shift+Strzałka lewa
RegisterHotKey(Handle,$0164,MOD_SHIFT,VK_UP);
//Shift+Strzałka górna
RegisterHotKey(Handle,$0165,MOD_SHIFT,VK_RIGHT);
//Shift+Strzałka prawa
RegisterHotKey(Handle,$0166,MOD_SHIFT,VK_DOWN);
//Shift+Strzałka dolna
RegisterHotKey(Handle,$0167,MOD_SHIFT,VK_NUMLOCK);
//Shift+NumLock
RegisterHotKey(Handle,$0168,MOD_SHIFT,VK_ADD);
//Shift+ '+' klawiatura
numeryczna
RegisterHotKey(Handle,$0169,MOD_SHIFT,VK_SUBTRACT);
//Shift+ '-' klawiatura
numeryczna
RegisterHotKey(Handle,$0170,MOD_SHIFT,VK_MULTIPLY);
//Shift+ '*' klawiatura
numeryczna
RegisterHotKey(Handle,$0171,MOD_SHIFT,VK_DIVIDE);
//Shift+ '/' klawiatura
numeryczna
end;
//procedury wykonawcze do skrótów klawiaturowych
procedure
TForm1.WMHotKey(var Msg:
TMessage);
begin
if
Msg.wParam=$0001 then
//jezeli naciszniesz klawisz F1 to ...
begin
//...
Opcja_niedostepna;
end;
if
Msg.wParam=$0002 then
//jezeli naciszniesz klawisz F2 to...
begin
//...
Opcja_niedostepna;
end;
(...)
if
Msg.wParam=$0170 then
//jezeli nacisniesz klawisz Shift+'*'
klawiatura numeryczna,
wtedy...
begin
//...
Opcja_niedostepna;
end;
if
Msg.wParam=$0171 then
//jezeli nacisniesz klawisz Shift+'/'
klawiatura numeryczna,
wtedy...
begin
//...
Opcja_niedostepna;
end;
end;
end.
< Wstecz 1...3/5 Dalej >
Artykuł pochodzi z mojej książki pt. "Delphi w przykładach dla początkujących". Zapraszam na Stronę książki.
Ciekawe artykuły:
- Zabawy matematyczne w Delphi
- Gry matematyczne w Delphi
- Przeżycia na pograniczu śmierci
- Zabawy rozwijające pamięć w Delphi
- AntyNoble - śmieszne badania naukowe
Zapoznaj się z innymi artykułami. Przejdź do zakładki Spis artykułów.
Brak komentarzy:
Prześlij komentarz