Jest to druga czΩ╢µ
FAQ o Delphi. Przeczytaj czΩ╢µ 1 oraz WinAPI
FAQ.
1. Jak podczas pracy programu dodaµ now▒
pozycje do PopupMenu?
2. Jak dodaµ ikonΩ programu do Tray'a. ( ikonka obok zegara Windows ).
3. Jak sprawiµ, aby dymki z podpowiedziami nie znika│y.
4. Jak rozpoznaµ w jakim systemie operacyjnym dzia│a
program?
5. Jak sprawdziµ jaki typ danych jest w schowku?
6. Jak zapisaµ, odczytaµ warto╢µ binarn▒ z rejestru?
7. Jak zrobiµ, aby w ListBox ka┐da czcionka by│a w osobnym kroju (
tak jak w Wordzie 2000) ?
8. Jak ustawiµ jaki╢ komponent aktywnym podczas pracy programu?
9. Jak pobraµ wsp≤│rzΩdne myszy?
10. Jak pobraµ ikonΩ dowolnego programu?
11. Jak odczytaµ nazwΩ zalogowanego u┐ytkownika?
12. Jak pobraµ nazwΩ komputera?
13. Jak rozpoznaµ typ klawiatury?
14. Jak rysowaµ po pulpicie?
15. Co zrobiµ, aby lewy przycisk dzia│a│ tak jak prawy i
odwrotnie?
16. W jaki spos≤b zmieniµ szybko╢µ dwukrotnego klikniΩcia mysz▒?
17. Jak ukryµ kursor klawiatury?
18. Jak ukryµ lub pokazaµ kursor
myszy?
19. Jak mogΩ usun▒µ katalog, w kt≤rym s▒ pliki?
20. Jak cofn▒µ ostatni▒ operacje w komponencie Memo?
21. Jak sprawdziµ jaki typ danych znajduje siΩ w schowku?
22. Jak odegraµ muzykΩ o formacie mp3?
23. Jak ukryµ jaki╢ plik ( atrybut: Ukryty ).
24. Jak wys│aµ pocztΩ tak, aby w tre╢ci by│a zawarto╢µ komponentu
Memo?
25. Jak stworzyµ komponent dynamicznie?
26.
Jak po umieszczeniu "Labela" na "Image'u" sprawiµ,
aby t│o etykiety by│y prze╝roczysty?
27. Jak sprawdziµ pisownie w RichEdit przy pomocy s│ownika
Worda?
28. Jak zrobiµ program bez formularza?
29. Jak sprawdziµ ostatni
znak np. w Edit?
30. Jak wykonaµ procedurΩ
po naci╢niΩciu klawisza ENTER?
31. Jak wczytaµ z pliku
tekstowego tekst z dw≤ch kolumn do 2-≤ch komponent≤w
ComboBox?
32. Jak wys│aµ pocztΩ?
33. Jak sprawdziµ czy klawisze Num Lock, Caps Lock, Scroll Lock, Insert
s▒ w│▒czone?
34. Jak odczytaµ numer seryjny dysku?
35. Jak od╢wie┐yµ listΩ folder≤w "DirectoryListBox"?
Refresh nie dzia│a.
36. Jak odczytaµ numer kolumny i wiersza w RichEdit?
37. Jak wykryµ moment zamykania Windows?
38. Jak uzyskaµ systemowe ikonki?
39. Nie dzia│a "StayOnTop". Co robiµ?
40. Jak "przechwyciµ" zaznaczony tekst w RichEdit?
41. Jak do zasob≤w "wrzuciµ" plik muzyczny *.wav?
42. Jak znale╝µ tekst w RichEdit?
43. Jak ustawiµ wygaszacz ekranu na brak?
44. W jaki spos≤b ustawiµ g│o╢no╢µ dla CD?
45. Jak zmieniµ po│o┐enie i rozmiar dowolnego okna?
46. Jak zmaksymilizowac, zminimalizowaµ dowolne okno?
47. Jak zawiesiµ dzia│anie myszki?
48. Jak sprawdziµ, czy uchwyt jest przypisany do widocznego okna?
49. Jak odwo│aµ siΩ jednocze╢nie do wszystkich komponent≤w np. typu
"TLabel"?
50. Jak wy╢wietliµ ikonΩ skojarzon▒ z danym rozszerzeniem?
51. Jak regulowaµ d╝wiΩk
przy pomocy "ScrollBar'a"?
52. Jak zaokr▒gliµ wynik do dw≤ch miejsc po przecinku?
53. Jak zrobiµ zrzut z ekranu?
54. Jak wy│▒czyµ skr≤ty w Windows? ( Ctrl + Del + Alt ).
55. Jak skojarzyµ moj▒ aplikacjΩ z rozszerzeniem danego typu?
56. Jak sformatowaµ datΩ do postaci: 25 stycznia 2001 np?
57. Jak ukryµ lub pokazaµ pasek stanu?
58. Jak zamkn▒µ inn▒ aplikacjΩ znaj▒c jej ╢cie┐kΩ?
59. Jak zarejestrowaµ skr≤t klawiaturowy dla ca│ego systemu?
60. Jak sprawdziµ ile miejsca na dysku zajmuje plik?
61. Jak wy╢wietliµ okno z pro╢b▒ o podanie has│a?
62.
Jak zaszyfrowaµ jaki╢ plik tekstowy?
63. Jak narysowaµ tekst w pionie?
64. Jak dostosowaµ program, aby wygl▒da│ tak samo w r≤┐nych
rozdzielczo╢ciach?
65. Jak zmieniµ rozdzielczo╢µ?
66. Jak przej╢µ w stan oczekiwania?
67. Jak usun▒µ moj▒ aplikacjΩ z listy znajduj▒cej siΩ po naci╢niΩciu
klawiszy: Ctrl + Alt + Del?
68. Jak uzyskaµ informacjΩ o katalogu Windows\Temp?
69. Jak od╢wie┐yµ widok pulpitu?
70. Jak wy╢wietliµ Windowsowe bia│e okno informacj▒ o b│Ωdzie?
71. Jak odczytaµ rozdzielczo╢µ ekrnau?
72. Nie mogΩ w Delphi2 otworzyµ programu, kt≤ry zosta│ napisany w
Delphi5, co robiµ?
73. Jak sprawdziµ, czy u┐ytkownik jest w
Internecie?
74.
Co zrobiµ, aby film wy╢wietla│ siΩ np. na komponencie Panel?
75. Jak odczytaµ numer linii w komponencie Memo?
76. Jak przewijaµ zawarto╢µ Memo poprzez naciskanie przycisku?
77. Jak przesuwaµ formΩ je┐eli BorderStyle = bsNone?
78. Jak odczytaµ po│o┐enia kursora w Memo lub RichEdit?
79. Co zrobiµ, aby ka┐d▒ liniΩ RichEdit'a zapisaµ w osobnej
zmiennej?
80. Jak po up│ywie 30 sek. zamkn▒µ program?
81. Jak uzyskaµ listΩ plik≤w ( EXE) uruchomionych w systemie?
82. Jak pozmieniaµ znaki w
okre╢lonym miejscu pliku?
83. Jak wykonaµ jak▒╢ operacje o danej
godzinie?
84. Jak usun▒µ plik do kosza?
85. Jak rysowaµ po ListBox'ie?
86. Jak dodaµ pozycjΩ do menu je┐eli kliknie siΩ na ikonΩ aplikacji
na pasku zada±?
87.
Jak zrobiµ w RichEdit indeks dolny lub g≤rny? ( tak jak w Wordzie ).
88.
W jaki spos≤b sprawdziµ jak▒ liter▒ oznaczony jest napΩd CD-ROM?
89. Jak w│▒czyµ lub wy│▒czyµ diody klawiszy NumLock, CapsLock?
90. Jak zapisaµ zawarto╢µ schowka do pliku, i zawarto╢µ pliku do
schowka?
91. Jak wykryµ po│▒czenie z netem?
92. Do czego s│u┐▒ funkcje Round i Trunc?
93. Jak skasowaµ wszystkie pliki z katalogu wyj▒tkiem np. a.txt oraz
a.dat
94. W jaki spos≤b sprawdziµ ile miejsca zajmuj▒ wszystkie pliki w
danym katalogu?
95. Jak odczytaµ tag z pliku mp3?
96. Jak wywo│aµ okno po│▒czenia Internetowego?
97.
W jaki spos≤b zaznaczyµ wybrany element w ListView?
98. W jaki spos≤b uniemo┐liwiµ zamkniΩcie programu?
99.
Jak zmieniµ datΩ modyfikacji pliku?
100. Jak wydaµ dzwiΩk z g│o╢niczka w komputerze?
101. Wy╢wietlenie okna do regulacji g│o╢no╢ci?
102. Jak zrobiµ aby formularz by│ prze╝roczysty?
103. Jak za│adowaµ obrazek ze schowka do komponentu Image?
104. Odczyt liczby przycisk≤w myszy.
105. Jak uruchomiµ wygaszacz ekranu?
1. Jak podczas pracy programu dodaµ now▒ pozycje do
PopupMenu?
Na przyk│ad tak:
var
Menu : TMenuItem;
begin
Menu := TMenuItem.Create(Self);
Menu.Caption := 'Moja pozycja';
PopupMenu1.Items.Add(Menu);
end;
2. Jak dodaµ ikonΩ programu do Tray'a. ( ikonka
obok zegara Windows ).
Oto kod. Aha, dodaj do listy modu│≤w s│owo "ShellAPI".
1. Do sekcji private dodaj takie pozycje:
IconNotifyData : TNotifyIconData;
procedure WndProc(var Msg : TMessage); override;
2. Teraz w OnCreate wpisz taki oto kod:
with IconNotifyData do
begin
hIcon:=Application.Icon.Handle;
uCallbackMessage:=WM_USER+1;
cbSize:=SizeOf(IconNotifyData);
Wnd:=Handle;
uID:=100;
uFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
end;
// Kopiujemy tytu│ aplikacji jako "dymek"
StrPCopy(IconNotifyData.szTip, Application.Title);
// Dodajemy ikonΩ do traya
Shell_NotifyIcon(NIM_ADD,@IconNotifyData);
NastΩpnie uzupe│nij procedure "WndProc" w taki oto spos≤b:
procedure TMainFrm.WndProc(var Msg : TMessage);
var
p : TPoint;
begin
{
Ta procedura s│u┐y do przechwytywania komunikat≤w po naci╢niΩciu przycisku w
obrΩbie ikony.
}
//Jezeli nacisnieto prawym przyciskiem myszy
if (Msg.Msg=WM_USER+1) and (Msg.lParam = WM_RBUTTONDOWN)
then
begin
//Nastepuje pobranie pozycji kursora myszki
GetCursorPos(p);
//i wyswietlenie menu
TrayMenu.Popup(p.x, p.y);
end;
//Jezeli nacisnieto lewy przycisk nastepuje wyswietlenie
//formy
if Msg.LParam = WM_LBUTTONDOWN then
MainFrm.Show;
inherited;
end;
Dodatkowo przy zamykaniu programu mo┐esz dopisaµ
linie:
Shell_NotifyIcon(NIM_DELETE, @IconNotifyData);
Usuwa ona ikone z Tray'a.
3. Jak sprawiµ, aby dymki z podpowiedziami nie znika│y.
Nale┐y w OnCreate wpisaµ:
Application.HintHidePause(1000000);
// np.
4. Jak rozpoznaµ w jakim systemie operacyjnym dzia│a
program?
Oto kod:
var
OS:TOsVersionInfo;
begin
OS.dwOSVersionInfoSize:=SizeOf(os);
GetVersionEx(os);
case os.dwPlatformId of
VER_PLATFORM_WIN32s: Caption:='WIN 3.1';
VER_PLATFORM_WIN32_WINDOWS: Caption:='WIN 95\98';
VER_PLATFORM_WIN32_NT: Caption:='WIN NT';
end;
end;
5. Jak sprawdziµ jaki typ danych jest w schowku?
Nale┐y skorzystaµ z modu│u Clipbrd; NastΩpnie mo┐esz sprawdziµ,
czy w schowku jest tekst, bitmapa itp:
var
B : Tbitmap;
begin
try
try
if Clipboard.HasFormat(CF_TEXT) then
ShowMessage(
ClipBoard.AsText);
if Clipboard.HasFormat(CF_BITMAP) then
B := Tbitmap.Create;
B.Assign(ClipBoard);
B.Width := 120;
B.Height := 100;
finally
B.Free;
end;
except
raise Exception.Create(
'Ne ma nic w schowku!');
end;
CF_TEXT - tekst.
CF_BITMAP - bitmapa Windows;
CF_PICTURE - zdjΩcie klasy TPicture.
CF_METAFILEPICT - metaplik;
6. Jak zapisaµ, odczytaµ warto╢µ binarn▒ z rejestru?
Zapisywanie odbywa siΩ podobnie jak zapis z tym, ┐e zamiast WriteBinaryData
piszesz ReadBinary.
var
Rejestr : TRegistry;
Zmienna : String;
begin
Zmienna := 'www.programowanie.of.pl';
Rejestr:=TRegistry.Create;
Rejestr.OpenKey('Software\Pad',True);
Rejestr.WriteBinaryData('Nazwa warto╢ci',Zmienna,SizeOf(Zmienna));
Rejestr.Free;
Nie zapomnij dodaµ do listy uses s│owo:
Registry;
7. Jak zrobiµ, aby w ListBox ka┐da czcionka by│a w
osobnym kroju ( tak jak w Wordzie 2000) ?
Je┐eli kto╢ ma Worda 2000 to zauwa┐y│ pewnie, ┐e po rozwiniΩciu
listy czcionek ka┐da napisana jest osobn▒ czcionk▒ :) Jak to zrobiµ
na przyk│adzie ListBox'a.
W on Create:
Screen.Fonts := ListBox.Items;
W DrawItem list box'a:
with ListBox1.Canvas do
begin
FillRect(Rect);
Font.Name := ListBox1.Items[Index];
Font.Size := 0;
TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;
W MeasureItem list box'a:
with ListBox1.Canvas do
begin
Font.Name := Listbox1.Items[Index];
Font.Size := 0;
Height := TextHeight('!!') ;
end;
Teraz w Inspektorze Obiekt≤w musisz zmieniµ w│a╢ciwo╢µ
"Style" komponentu "ListBox" na "lbOwnerDrawVariable".
8. Jak ustawiµ jaki╢ komponent aktywnym podczas pracy programu?
Oto kod; s│u┐y do tego funkcja SetFocus:
Windows.SetFocus(RichEdit.Handle);
9. Jak pobraµ wsp≤│rzΩdne myszy?
S│u┐y do tego funkcja GetCursorPos - np:
var
P : TPoint;
begin
GetCursorPos(P);
ShowMessage(IntToStr(P.X, P.Y));
10. Jak pobraµ ikonΩ dowolnego programu?
S│uzy do tego funkcja "ExrtactIcon". Ikona programu
przechowywana jest pod postaci▒ zmiennej typu HIcon.
var
H : HIcon;
begin
H := ExtractIcon(Handle,
'Nazwa Programu.exe', 0);
Image.Picture.Icon.Assign(H);
11. Jak odczytaµ nazwΩ zalogowanego u┐ytkownika?
var
User : String;
Buff : DWORD;
begin
// dlugoosc Nazwiska
Buff := 12;
SetLength(User, Buff);
GetUserName(PChar(User), Buff);
ShowMessage(User);
12. Jak pobraµ nazwΩ komputera?
var
Comp : String;
Buff : DWORD;
begin
Buff := 64;
SetLength(Comp, Buff);
GetComputerName(PChar(Comp), Buff);
ShowMessage(Comp);
13. Jak rozpoznaµ typ klawiatury?
W zale┐no╢ci od wyniku proceury:
1. IBM 83 klawisze.
2. Olivetti ( 102 klawisze ).
3. IBM PC/AT (83-84 klawisze ).
4. IBM 103 - 104 klawisze.
5. Nokia 1050
6. Nokia 9140
7. Japo±ska klawiatura.
A oto procedura:
ShowMessage(IntToStr(
GetKeyboardType(0));
14. Jak rysowaµ po pulpicie?
Po pulpicie mo┐na rysowaµ jak w zwyk│ym Canvasie. Wystarczy tylko
pobraµ uchwyt pulpitu:
Canvas.Handle:=GetWindowDC(GetDesktopWindow);
//tutaj u┐ywamy funkcji Canvas'a do rysowania
// rysujemy np. kwadrat
Canvas.Rectangle(20, 20, 220, 220);
15. Co zrobiµ, aby lewy przycisk dzia│a│ tak jak
prawy i odwrotnie?
Je┐eli jako parametr funkcji SwapMouseButton podasz True to
przyciski siΩ zmieni▒ - je┐eli podasz "False" bΩdzie jak
dawniej.
SwapMouseButton(True);
16. W jaki spos≤b zmieniµ szybko╢µ dwukrotnego klikniΩcia
mysz▒?
SetDoubleCliktime(100);
Domy╢lnie jest to 500. »eby pobraµ prΩdko╢µ nale┐y
skorzystaµ z funkcji GetDoubleClickTime.
17. Jak ukryµ kursor klawiatury?
ShowCaret(Handle); //
poka┐
HideCaret(Handle); // ukryj
18. Jak ukryµ lub pokazaµ kursor myszy?
ShowCursor(False); //ukrycie
ShowCursor(True); // poka┐
19. Jak mogΩ usun▒µ katalog, w kt≤rym s▒ pliki?
Proponuje przeczytanie artyku│≤w o kopiowaniu, usuwaniu plik≤w i
folder≤w w dziale "Delphi".
20. Jak cofn▒µ ostatni▒ operacje w komponencie
Memo?
Komponent RichEdit posiada procedure "Undo". Nie posiada
jej niestety komponent Memo. Z tego powodu nale┐y wys│aµ odpowiedni
komunikat:
SendMessage(Memo.Handle,
WM_UNDO, 0, 0);
21. Jak sprawdziµ jaki typ danych znajduje siΩ w
schowku?
Nale┐y skorzystaµ z modu│u "Clipbrd". Teraz sprawdzenie
dokonuje siΩ za pomoc▒ funkcji HasFormat:
Clipboard.HasFormat(CF_TEXT);
22. Jak odegraµ muzykΩ o formacie mp3?
Nale┐y skorzystaµ z komponentu mp3 umieszczonego na naszej
stronie. [ ªci▒gnij
] [ Zobacz... ]
23. Jak ukryµ jaki╢ plik ( atrybut: Ukryty ).
W Windowsie mo┐na nadawaµ plikom atrybut "ukryty"
dziΩki czemu s▒ one niewidoczne. W Delphi tak┐e mo┐esz co╢
takiego zrobiµ:
SetFileAttributes('C:\Plik.exe',
FILE_ATTRIBUTE_HIDDEN);
24. Jak wys│aµ pocztΩ tak, aby w tre╢ci by│a
zawarto╢µ komponentu Memo?
var
P : PChar;
begin
P := PChar('mailto:boduch@poland.com?Subject=Temat&Body='+
Memo1.Lines.Text);
ShellExecute(Handle,'open',PChar(P), nil, nil, SW_SHOW);
25. Jak stworzyµ komponent dynamicznie?
var
Button : TButton;
begin
Button := TButton.Create(Self);
Button.Parent := Self;
Button.Caption := 'Klawisz 1';
Button.Left := 20;
Button.Top := 20;
end;
26. Jak po umieszczeniu "Labela" na "Image'u"
sprawiµ, aby t│o etykiety by│y prze╝roczysty?
Komponent "Label" ma w Inspektorze Obiekt≤w w│a╢ciwo╢µ
"Transparent" po kt≤rej ustawieniu na "True" t│o
tego┐ komponentu staje siΩ prze╝roczyste.
27. Jak sprawdziµ pisownie w RichEdit przy pomocy s│ownika
Worda?
Potrzebujesz do tego specjalnego komponentu: "Spellmso".
28. Jak zrobiµ
program bez formularza?
Z menu "Project" wybierz "View Source". Teraz
mo┐esz ju┐ zamkn▒µ formularz i klikaj▒c prawym przyciskiem na zak│adce
modu│u wybierz "Close Page". Tym sposobem g│≤wny kod
programu znajdowaµ siΩ bΩdzie w pliku *.dpr. Na pocz▒tku powinien on
wygl▒daµ tak:
program Project1;
uses
Forms;
{$R *.RES}
begin
Application.Initialize;
Application.Run;
end.
29. Jak sprawdziµ ostatni
znak np. w Edit?
if Edit.Text[Length(Edit.Text)] = '\'
then
{ Cos tam }
30. Jak
wykonaµ procedurΩ po naci╢niΩciu klawisza ENTER?
Za│≤┐my, ┐e masz komponent Edit i chcia│by╢, aby po naci╢niΩciu
klawisza Enter wykona│a siΩ jaka╢ procedura. Taki kod musisz wpisaµ
w procedurze OnKeyPress:
if Key = #13 then
NazwaProcedury;
Key := #0;
31. Jak
wczytaµ z pliku tekstowego tekst z dw≤ch kolumn do 2-≤ch komponent≤w
ComboBox?
Za│≤┐my, ┐e masz plik tekstowy z dwiema kolumnami: w
jednej wpisane s▒ kraje, a po prawej stolice tych kraj≤w. Teraz chcesz
ka┐d▒ kolumnΩ wczytaµ do osobnego komponentu "ComboBox":
var
F: TextFile;
Kraj: String[20]; // na ka┐d▒ kolumnΩ przeznaczono 20 znak≤w
Stolica: String[20];
begin
AssignFile(F, 'PLIK.TXT');
Reset(F); // otwarcie pliku
try
while not Eof(F) do
begin
Readln(F, Kraj, Stolica); // wczytanie 2-≤ch kolumn
ComboBox1.Items.Add(Kraj); // dodanie ich do komponentu
ComboBox2.Items.Add(Stolica);
end;
finally
CloseFile(F);
end;
32. Jak wys│aµ pocztΩ?
Do tego s▒ odpowiednie komponenty w Delphi. Na zak│adce "FastNet".
Mo┐na te┐ u┐yµ komponent≤w Mail2000 [ dostΩpne w dzia│e: ¼r≤d│a
].
33. Jak sprawdziµ czy
klawisze Num Lock, Caps Lock, Scroll Lock, Insert s▒ w│▒czone?
Umie╢µ na formularzu 4 komponenty "CheckBox". W "OnCreate
formy wpisz:
CheckBox1.Checked := GetKeyState(VK_CAPITAL) <> 0;// Caps
CheckBox2.Checked := GetKeyState(VK_NUMLOCK) <> 0; // Num lock
CheckBox3.Checked := GetKeyState(VK_SCROLL ) <> 0; // Scroll Lock
CheckBox4.Checked := GetKeyState(VK_INSERT) <> 0; // Insert
34. Jak odczytaµ numer seryjny dysku?
Funkcja ta podaje tylko numer seryjny partycji lub dyskietki, a
nie dysku.
var
Bufor:array[0..255] of Char;
MaxCompLength,FileSystemFlags:Integer;
Drive:Char;
Serial:DWORD;
begin
Drive:='A';
GetVolumeInformation(PChar(Drive + ':\'),Bufor,SizeOf(Bufor),@Serial,MaxCompLength,
FileSystemFlags,nil,0);
end;
35. Jak od╢wie┐yµ
listΩ folder≤w "DirectoryListBox"? Refresh nie dzia│a.
Rozwi▒zanie: Zamiast "Refresh" zastosuj "Update".
36. Jak
odczytaµ numer kolumny i wiersza w RichEdit?
Do listy modu│≤w "uses" dodaj s│owo
"RichEdit". Teraz mo┐esz stworzyµ swoj▒ procedurΩ:
GetCursorPosition i w taki spos≤b uzupe│niµ tΩ procedurΩ:
procedure TChild.GetCursorPosition;
var
Pos: TPoint;
begin
Pos.Y := SendMessage(RichEdit.Handle, EM_EXLINEFROMCHAR, 0,
RichEdit.SelStart);
Pos.X := (RichEdit.SelStart - SendMessage(RichEdit.Handle,
EM_LINEINDEX, Pos.Y, 0));
Inc(Pos.X);
Inc(Pos.Y);
ShowMessage(Format(
'Lnia: %d; Znak: %d', [P.X, P.Y]));
end;
37. Jak wykryµ
moment zamykania Windows?
Do sekcji "private" dodaj tak▒ linie:
procedure ClosingWin(var
Message: TMessage); message WM_QUERYENDSESSION;
Teraz w sekcji "implemetation" wpisz:
procedure TForm1.ClosingWin(var Message: TMessage);
begin
if Message.Msg = WM_QUERYENDSESSION then
begin
// jaka╢ akcja
end;
DefaultHandler(Message)
end;
38. Jak uzyskaµ systemowe
ikonki?
Mo┐na np. w Image umie╢ciµ standardowe ikonki Windows. Oto jak
tego dokonaµ:
Image1.Picture.Icon.Handle := LoadIcon(0, IDI_APPLICATION);
Istnieje mo┐liwo╢µ zastosowania tak┐e tych ikonek:
IDI_ASTERISK
IDI_EXCLAMATION
IDI_HAND
IDI_QUESTION
IDI_WINLOGO
39. Nie dzia│a
"StayOnTop". Co robiµ?
Czasami "fsStayOnTop" nie dzia│a. W takim wypadku mo┐esz
zrobiµ co╢ takiego:
SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, 0);
40. Jak
"przechwyciµ" zaznaczony tekst w RichEdit?
W│a╢ciwo╢µ "RichEdit.SelText". Przechowuje informacjΩ
o zaznaczonym tek╢cie. Je┐eli chcesz np. wy╢wietliµ w okienku
zaznaczony tekst to piszesz:
ShowMessage(RichEdit.SelText);
41. Jak do
zasob≤w "wrzuciµ" plik muzyczny *.wav?
Standardowy edytor zasob≤w [ Image Editor ] dostarczany wraz z
"Delphi" siΩ do tego nie nadaje. Lepiej ╢ci▒gnij sobie
program "ResHack".
Umo┐liwia on dodanie do programu plik≤w muzycznych.
42. Jak znale╝µ
tekst w RichEdit?
Oto kod:
var
FoundAt: LongInt;
StartPos, ToEnd: Integer;
begin
with RichEdit do
begin
if SelLength <> 0 then
StartPos := SelStart + SelLength
else
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(
'Tekst', StartPos, ToEnd, [stMatchCase]);
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length('Tekst');
end;
end;
end;
43. Jak ustawiµ wygaszacz
ekranu na brak?
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,
Word(False), nil, 0);
Teraz je┐eli chcesz przywr≤ciµ domy╢lne ustawienia:
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,
Word(True), nil, 0);
44. W jaki
spos≤b ustawiµ g│o╢no╢µ dla CD?
Nale┐y skorzystaµ z modu│u MMSystem:
auxSetVolume(0, $FFFFFFFF); //
g│o╢no╢µ na maxa.
45. Jak zmieniµ po│o┐enie i rozmiar dowolnego
okna?
Na samym pocz▒tku musimy zdobyµ uchwyt okna, a nastΩpnie
ustawiµ jego pozycjΩ za pomoc▒ funkcji "SetWindowPos":
var
H : THandle;
begin
H := FindWindow(nil, 'Object Inspector');
SetWindowPos(H, HWND_TOP, 0, 100, 200, 200,SWP_SHOWWINDOW);
Najpierw zdobyli╢my uchwyt "Inspektora Obiekt≤w",
a nastΩpnie ustawiamy jego now▒ pozycjΩ.
46. Jak zmaksymilizowac, zminimalizowaµ dowolne
okno?
Tak jak w powy┐szy przyk│adzie musimy znaµ uchwyt okna ( zdobywa
siΩ go tak samo jak w powy┐szym przyk│adzie ). Je┐eli ju┐ go znamy
mo┐na skorzystaµ z takich funkcji:
ShowWindow(uchwyt, dzia│anie);
Pod s│owem dzia│anie mog▒ siΩ znale╝µ takie oto
pozycje:
SW_MAXIMIZE - maksymilizuje okno;
SW_MINIMIZE - minimalizuje okno;
SW_RESTORE - przywraca;
SW_HIDE - ukrywa;
SW_SHOW - pokazuje;
47. Jak zawiesiµ dzia│anie myszki?
Nale┐y skorzystaµ z modu│u ShellAPI. »eby przywr≤ciµ dzia│anie
myszy nale┐y zresetowaµ komputer.
uses ShellApi;
ShellExecute(Handle,'open','rundll32','mouse,disable',
nil,SW_SHOWNORMAL);
48. Jak sprawdziµ, czy uchwyt jest przypisany do
widocznego okna?
if IsWindowVisible(Handle) then
{ jaka╢ procedura }
Je┐eli ten warunek zwr≤ci warto╢µ "True"
to znaczy, ┐e okno jest widoczne, w przeciwnym wypadku zwr≤ci
"False".
49. Jak odwo│aµ siΩ jednocze╢nie do wszystkich
komponent≤w np. typu "TLabel"?
var
I : Integer;
begin
for I:=0 to componentcount do
if components[i] is TLabel then
TPanel(components[i]).Caption := 'Cze╢µ';
end;
50. Jak wy╢wietliµ ikonΩ skojarzon▒ z danym
rozszerzeniem?
uses ShellAPi;
var
Ico : PShFileInfo;
begin
GetMem( Ico, sizeof(TShFileInfo) );
try
shGetFileInfo( PChar('sciezka_i_nazwa_pliku'), 0, Icoi^,
sizeof(TShFileInfo), shgfi_sysiconindex or shgfi_icon or
shgfi_smallicon);
Image1.Picture.Icon.Handle:=Ico.hIcon;
finally
FreeMem(sfi);
end;
end;
51. Jak
regulowaµ d╝wiΩk przy pomocy "ScrollBar'a"?
Gdy umie╢cisz na komponencie komponent "ScrollBar"
chcesz, aby przy jego pomocy regulowaµ dzwiΩk. W procedurze "OnScroll"
tego komponentu powiniene╢ wpisaµ taki kod:
if ScrollPos =
100 then { jezeli jest na maxa to ustaw
dzwiek na maxa }
WaveOutSetVolume(0, $FFFFFFF)
else
WaveOutSetVolume(0, ScrollPos * 1000);
{ inaczej ustaw wg. ustawie± Scroll'a }
Nie zapomnij do listy modu│≤w ( uses ) dodaµ s│owa
"MMSystem".
52. Jak zaokr▒gliµ
wynik do dw≤ch miejsc po przecinku?
S│u┐y do tego funkcja "FormatFloat". Oto przyk│ad:
var
R : Real;
begin
R := 2.1111243432;
ShowMessage(
FormatFloat('0.00', R));
53. Jak zrobiµ
zrzut z ekranu?
Oto kod:
var
Can: TCanvas;
B : TBitmap;
begin
try
{ tworzenie zmiennej }
Can := TCanvas.Create;
{ przechwycenie uchwytu ekrnau }
Can.Handle := GetWindowDC(GetDesktopWindow);
{ tworzenie bitmapy }
B := TBitmap.Create;
B.Width := Screen.Width;
B.Height := Screen.Height;
B.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height),
Can,
Rect (0, 0, Screen.Width, Screen.Height));
try // zapisz plik
B.SaveToFile('C:\plik.bmp');
except // w wyniku bledu...
raise Exception.Create(
'B│ad w zapisie pliku...');
end;
finally
Can.Free;
B.Free;
end;
54. Jak wy│▒czyµ
skr≤ty w Windows? ( Ctrl + Del + Alt ).
Na samym pocz▒tku ostrze┐enie: poni┐szy kod nie dzia│a na
Windows NT. Nale┐y oszukaµ system tak aby my╢la│, ┐e nasz program
jest wygaszaczem ekranu.
var L:longbool;
begin
SystemParametersInfo(97,Word(True),@L,0); //W│▒cza blokadΩ
SystemParametersInfo(97,Word(False),@L,0); //Wy│▒cza blokadΩ
end;
55. Jak skojarzyµ moj▒
aplikacjΩ z rozszerzeniem danego typu?
Trzeba dodaµ odpowiednie klucze do rejestru. Np. je┐eli
chcesz skojarzyµ sw≤j program z plikiem *.txt to musisz dodaµ warto╢µ
do klucza w rejestrze.
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey(
'txtfile\shell\open\command', True);
Reg.WriteString('', '"'+ Application.ExeName + '" "%1"');
Polecam poczytanie artyku│u "Rejestry" w dziale
"Delphi".
56. Jak sformatowaµ datΩ
do postaci: 25 stycznia 2001 np?
Nale┐y skorzystaµ z funkcji "FormatDateTime". Oto przyk│ad:
ShowMessage(
FormatDateTime('dd mmmm yyyy', Now));
Takie rozwi▒zanie wy╢wietli na ekranie datΩ w
postaci:
25 stycznia 2001
Poszukaj w systemie pomocy - tam znajdziesz wiΩcej
parametr≤w.
57. Jak ukryµ
lub pokazaµ pasek stanu?
Oto dwa kody ukazuj▒ce chowanie i pokazywanie paska stanu:
{ ukrywanie paska }
var
H : THandle;
wClass : array[0..50] of Char;
begin
StrPCopy(@wClass[0], 'Shell_TrayWnd');
H := FindWindow(@wClass[0], nil);
ShowWindow(H, SW_HIDE);
{ pokazywania paska }
var
H : THandle;
wClass : array[0..50] of Char;
begin
StrPCopy(@wClass[0], 'Shell_TrayWnd');
H := FindWindow(@wClass[0], nil);
ShowWindow(H, SW_RESTORE);
58. Jak zamkn▒µ inn▒
aplikacjΩ znaj▒c jej ╢cie┐kΩ?
Je┐eli znasz ╢cie┐kΩ uruchomionego programu to mo┐esz zamkn▒µ
j▒. Jak? Pokazuje to poni┐szy kod. Aha, do listy modu│≤w uses musisz
dodaµ s│owo "TLHelp32".
var
PHandle, FHandle: THandle;
Process:TProcessEntry32;
Done, Next: Boolean;
EXE : String; // ╢cie┐ka programu
begin
EXE := 'C:\Windows\Pulpit\prog.exe';
FHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Process.dwSize := Sizeof(Process);
Next := Process32First(FHandle,Process);
while Next do
begin{ jesli sciezka dostepu sie zgadza }
if AnsiLowerCase(Process.szExeFile) = AnsiLowerCase(EXE) then
begin
PHandle:=OpenProcess(PROCESS_TERMINATE, False,
Process.th32ProcessID);
{ to probujemy zabic aplikacje }
Done := TerminateProcess(PHandle,0);
if not Done then
MessageBox(Handle, 'B│▒d', 'B│▒d', MB_OK);
end;
Next := Process32Next(FHandle,Process);
end;
CloseHandle(FHandle);
end;
59. Jak
zarejestrowaµ skr≤t klawiaturowy dla ca│ego systemu?
Czasami chcieliby╢my, aby skr≤t klawiatury by│ skojarzony z nasz▒
aplikacjΩ - np. po klikniΩciu kombinacji: Ctrl + F10 nasza aplikacja
ma wykonywaµ jak▒╢ czynno╢µ.
Najpierw w procedurze "OnCreate" nale┐y wpisaµ:
{ Ta funkcja rejestruje skr≤t: Ctrl + F4 dla naszej aplikacji }
RegisterHotKey(Form1.Handle, $0001, MOD_CONTROL, VK_F4);
Teraz w procedurze "OnClose" musisz wpisaµ:
{ zwolnienie skrotu w systemi }
UnregisterHotKey(Form1.Handle, $0001);
No i w ko±cu deklaracja samej obs│ugi skr≤tu. W sekcji "private"
dopisz tak▒ linie:
procedure wm_HOTKEY(var Msg:TMessage);message WM_HOTKEY;
Jest to komunikat "przechwytuj▒cy" skr≤ty
klawiaturowe. Najed╝ na niego kursorem myszy i wci╢nij: Ctrl + Shift +
C. Wpisz tak▒ deklaracjΩ procedury:
if Msg.WParam = $0001 then
{ reakcja na skr≤t klawiszowy }
Application.Restore; // przywr≤cenie aplikacji
60. Jak
sprawdziµ ile miejsca na dysku zajmuje plik?
var
Plik : TSearchRec;
FSize : Integer;
const // sciezka do programu
Sciezka = 'C:\Windows\Pulpit\prog.exe';
begin
if FindFirst(Sciezka, faAnyFile, Plik) = 0 then
FSize:= PLik.Size else FSize:=0;
FindClose(PLik);
// wyswietl rozmiar pliku
ShowMessage(IntToStr(FSize) + ' bajt≤w');
61. Jak wy╢wietliµ okno
z pro╢b▒ o podanie has│a?
Do tego s│u┐y funkcja "InputBox". Np:
if InputBox('Has│o', 'Podaj has│o', '') = 'Adam' then
ShowMessage('Tak') else
Application.Terminate;
62. Jak zaszyfrowaµ jaki╢
plik tekstowy?
Gdy┐ jest to do╢µ rozbudowane pojΩcie postanowi│em
chlapn▒µ artykulik na ten temat.
63. Jak
narysowaµ tekst w pionie?
Pos│u┐ siΩ takim kodem:
procedure TForm1.Button1Click(Sender: TObject);
var
LF : TLogFont;
begin
Canvas.Font.Size := 24;
GetObject(Canvas.Font.Handle, SizeOf(TLogFont), @lf);
lf.lfEscapement := 90 * 10;
lf.lfOutPrecision := OUT_TT_ONLY_PRECIS;
Canvas.Font.Handle := CreateFontIndirect(LF);
SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
Canvas.Brush.Style := bsClear;
Canvas.TextOut(
20, 200, 'Hello World!');
end;
64. Jak
dostosowaµ program, aby wygl▒da│ tak samo w r≤┐nych rozdzielczo╢ciach?
Ka┐da forma ma w│a╢ciwo╢µ "Scaled". Zmie± j▒
na False, a forma bΩdzie wygl▒da│a tak samo w r≤┐nych
rozdzielczo╢ciach.
65. Jak
zmieniµ rozdzielczo╢µ?
Oto kod:
var
Mode: TDeviceMode;
begin
with Mode do
begin
dmSize:=SizeOf(Mode);
dmBitsPerPel:=16;
dmPelsWidth:=640;
dmPelsHeight:=480;
dmFields:=DM_PELSWIDTH+DM_PELSHEIGHT;
ChangeDisplaySettings(Mode,0)
end;
end;
66. Jak przej╢µ w stan
oczekiwania?
SetSystemPowerState(true, true);
67. Jak usun▒µ
moj▒ aplikacjΩ z listy znajduj▒cej siΩ po naci╢niΩciu
klawiszy: Ctrl + Alt + Del?
W sekcji "Interface" dodaj liniΩ:
function RegisterServiceProcess(dwProcessId,dwType:dword):
Integer;stdcall;external 'kernel32.dll'
Teraz mo┐esz napisaµ:
RegisterServiceProcess(GetCurrentProcessID, 1);
68. Jak
uzyskaµ informacjΩ o katalogu Windows\Temp?
Oto kod. Zmienna "S" zawiera ╢cie┐ke katalogu
Windows\Temp:
var
Buffer: array[0..MAX_PATH-1] of Char;
S : String;
begin
SetString(S, Buffer, GetTempPath(SizeOf(Buffer), Buffer));
ShowMessage(S);
end;
69. Jak od╢wie┐yµ
widok pulpitu?
UpdateWindow(GetDesktopWindow);
70. Jak wy╢wietliµ
Windowsowe bia│e okno informacj▒ o b│Ωdzie?
Poni┐sze polecenie wy╢wietla okno na bia│ym tle z
przyciskiem "Zamknij" informuj▒ce o jakim╢ b│Ωdzie:
FatalAppExit(0, 'Zaistnia│ jaki╢ b│▒d');
71. Jak odczytaµ rozdzielczo╢µ ekrnau?
var
Rozd : packed record
X, Y : Integer;
end;
begin
Rozd.X := GetSystemMetrics(SM_CXSCREEN); // pobranie rozdzielczosci
Rozd.Y := GetSystemMetrics(SM_CYSCREEN);
ShowMessage(
Format('Rozdzialo╢µ ekranu: ' + #13+ '%d x %d', [Rozd.X, Rozd.Y]));
72. Nie mogΩ
w Delphi2 otworzyµ programu, kt≤ry zosta│ napisany w Delphi5, co robiµ?
Je┐eli klikniesz prawym przyciskiem na formie to rozwinie siΩ
menu, w jednej z pozycji bΩdzie pole "Text DFM" - odznacz tΩ
pozycje i teraz zapisuj program. Je┐eli bΩdziesz mia│ trochΩ szczΩ╢cia
( pisz▒c program w Delphi5 nie bΩdziesz u┐ywa│ komponent≤w, kt≤rych
nie ma w Delphi2 ) to mo┐e skompilujesz sw≤j program na Delphi
2.
73. Jak
sprawdziµ, czy u┐ytkownik jest w Internecie?
Ta funkcja nie wszystkim dzia│a wiΩc....
W sekcji "Interface" dodaj nag│≤wek:
function InetIsOffline(Flag: Integer):
Boolean; stdcall;
external 'URL.DLL';
Teraz w procedurze:
if InetIsOffline(0) then
ShowMessage('Jestem offline') else
ShowMessage('Jestem online');
74. Co zrobiµ, aby film
wy╢wietla│ siΩ np. na komponencie Panel?
Je┐eli chcesz wy╢wietlµ film na komponencie typu TPanel to
piszesz:
with MediaPlayer1 do
begin
Display := Panel1;
DisplayRect := Panel1.ClientRect;
end;
75. Jak
odczytaµ numer linii w komponencie Memo?
Kompletny kod programu znajduje siΩ w dziale Algorytmy. Kliknij
tutaj, a go ujrzysz :)
76. Jak
przewijaµ zawarto╢µ Memo poprzez naciskanie przycisku?
Musisz w tym celu skorzystaµ z komunikat≤w i wys│aµ
komunikat do komponentu. WiΩcej o komunikatach mo┐esz poczytaµ w
artykule "Komunikaty".
Memo1.Perform(WM_VSCROLL,SB_LINEDOWN,0); // jenda linia w dol
Memo1.Perform(WM_VSCROLL,SB_LINEUP,0); // jedna linia w gore
77. Jak
przesuwaµ formΩ je┐eli BorderStyle = bsNone?
Musisz pierw zadeklarowaµ dwie zmienne globanle:
var
MD : Boolean;
P : TPoint;
Teraz wygeneruj procedury: OnMouseDown, OnMouseMove,
OnMouseUp. Procedury te powinny wygl▒daµ tak:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := True;
P := Point(X, Y);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MD then
begin
Left := Left + (X - P.X);
Top := Top + (Y - P.Y);
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := False;
end;
78. Jak
odczytaµ po│o┐enia kursora w Memo lub RichEdit?
W dziale "Algorymy" masz kompletny kod programu. [
Zobacz... ]
79. Co zrobiµ,
aby ka┐d▒ liniΩ RichEdit'a zapisaµ w osobnej zmiennej?
Mo┐e nie do osobnej zmiennej, ale do tablicy:
var
Lines : array of String;
procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
begin
SetLength(Lines, RichEdit1.Lines.Count);
for I := Low(Lines) to High(Lines) do
Lines[i] := RichEdit1.Lines.Strings[i];
end;
Wykorzystana tu zosta│a tablica dynamiczna, kt≤ra
przybiera rozmiar, kt≤ry jest ilo╢ci▒ linii w RichEdit.
80. Jak po up│ywie
30 sek. zamkn▒µ program?
Do tego celu musisz u┐yµ komponentu TTimer. Generujesz procedurΩ
OnTimer i wpisujesz taki kod:
var
I : Integer = 30;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := 'Do zako±czenia programu pozosta│o: ' + IntToStr(I);
Dec(i);
If I = 0 then Close;
end;
81. Jak
uzyskaµ listΩ plik≤w ( EXE) uruchomionych w systemie?
Trzeba w tym celu skorzystaµ z nisko poziomowych funkcji
API:
uses TlHelp32;
procedure TForm1.btnAddEXEClick(Sender: TObject);
var
_HWND : THandle;
Proc : TProcessEntry32;
begin
_HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
Proc.dwSize:=SizeOf(Proc); // okresl rozmiar struktory
if Integer(Process32First(_HWND, Proc)) <> 0 then
repeat
ListBox1.Items.Add(Proc.szExeFile); // dodaje sciezkie pliku do ListBox'a
until Integer(Process32Next(_HWND, Proc)) = 0; // dopoki wartosc nie osiagnie 0
CloseHandle(_HWND);
end;
82. Jak
pozmieniaµ znaki w okre╢lonym miejscu pliku?
Nale┐y skorzystaµ ze strumienic. Artyku│ o strumieniach mo┐esz
przeczytaµ klikj▒c tutaj.
Procedura obejmie swoim zasiΩgiem 500 znak≤w zaczynaj▒c od 100 bajt≤w
pliku:
procedure TForm1.ChangeCharsClick(Sender: TObject);
var
F : TFileStream;
Buff : array[0..1024] of char;
iMuch, i : Integer;
begin
F := TFileStream.Create('C:\Scandisk.log', fmOpenReadWrite);
try
F.Position := 200; // ustaw na pozycji
iMuch := F.Read(Buff, 500); // odczytaj znaki
for I := 0 to iMuch do
if Buff[i] = ' ' then Buff[i] := '_'; // zastap spacje znakiem _
F.Position := 100; // ustaw na poprzedniej pozycji
F.Write(Buff, iMuch); // zapisz nowa warosc
finally
F.Free;
end;
end;
83. Jak
wykonaµ jak▒╢ operacje o danej godzinie?
W tym celu musisz skorzystaµ z komponentu TTimer. BΩdzie on
co sekunde sprawdza│, kt≤ra jest godzina. Je┐eli bΩdzie to np. 09.30
to wykona jak▒╢ operacje.
procedure TForm1.TimerTimer(Sender: TObject);
var
Present : TDateTime;
Hour, Min, Sek, MSec : Word;
begin
Present := Now;
DecodeTime(Present, Hour, Min, Sek, MSec);
if (Hour = 09) and (Min = 31) and (Sek = 0) then
ShowMessage('Jest godz: 9.30'); { <- Uruchomi sie o godz. 9.31 }
end;
84. Jak usun▒µ
plik do kosza?
Przede wszystkim do listy uses musisz dodaµ s│owo ShellAPI.
Teraz w procedurze:
var
R : TSHFileOpStruct;
begin
with R do
begin
Wnd:=Handle; // oznaczenie uchwytu
wFunc := FO_DELETE;// opcja
pFrom:='c:\kody.html'; // z pliku
fFlags := FOF_ALLOWUNDO;
end;
SHFileOperation(R);
85. Jak
rysowaµ po ListBox'ie?
Ten spos≤b dzia│a w przypadku ListBox'a jak i ComboBox'a. W
moim przyk│adzie pos│u┐Ω siΩ komponentem ComboBox, w kt≤rym tak
jak jest to w przypadku wiΩkszo╢ci przypadk≤w program≤w biurowych
zastosuje listΩ rozwijaln▒ dla czcionek. Ka┐da czcionka bΩdzie
posiada│a kwadracik symbolizuj▒cy kolor oraz nazwa koloru. Na pewno
wiesz o co chodzi - je┐eli nie wiesz to zobacz :)
Pierwsze co musisz zrobiµ to zmieniµ w│a╢ciwo╢µ Style komponentu
TComboBox na csOwnerDrawFixed. Teraz wygeneruj procedurΩ OnDrawItem
komponentu. Wpisz taki kod:
type
{ Rekord zawiera pozycje kolru i nazwy tego koloru }
TColorRec = packed record
Color : TColor;
Des : String[15];
end;
{ Tablica kolorow }
const ColorTab : array[0..6] of TColorRec =
(
(Color: clBlack; Des: 'Czarny'),
(Color: clBlue; Des: 'Niebieski'),
(Color: clGreen; Des: 'Zielony'),
(Color: clRed; Des: 'Czerwony'),
(Color: clYellow; Des: '¼≤│ty'),
(Color: clGray; Des: 'Szary'),
(Color: clWhite; Des: 'Bia│y')
);
procedure TForm1.cmbFontDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with cmbFont.Canvas do
begin
FillRect(Rect);
Brush.Style := bsSolid; // styl - jednolity
Brush.Color := ColorTab[Index].Color; // kolor z tablicy
Rectangle(Rect.Left + 2, Rect.Top + 2, Rect.Left + 32, Rect.Bottom - 2);
Brush.Style := bsClear; // t│o na przezroczyste
TextOut(Rect.Left + 40, Rect.Top + 2, ColorTab[Index].Des); // pisz tekst
end;
end;
Teraz generuj procedurΩ OnCreate:
procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
{ wypelnij pola danymi }
for I := Low(ColorTab) to High(ColorTab) do
cmbFont.Items.Add(ColorTab[i].Des);
end;
86. Jak dodaµ pozycjΩ do
menu je┐eli kliknie siΩ na ikonΩ aplikacji na pasku zada±?
Je┐eli program jest uruchomiony i kliniesz prawym przyciskiem
na na ikonΩ programu to rozwinie siΩ menu ze standardowymi opcjami (
Zamknij, Minimalizuj itp. ). Mo┐na dodaµ tam swoj▒ pozycje - wystarczy
odwo│aµ siΩ do WinAPI.
Umie╢µ deklaracjΩ nowej procedury:
private
procedure WMNewPos(var Msg : TMsg; var Handle : Boolean);
Teraz definicja powinna wygl▒daµ tak:
procedure TForm1.WMNewPos(var Msg: TMsg; var Handle: Boolean);
begin
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = 101) then
ShowMessage('Cze!');
Handle := True;
end;
To by│a obs│uga naszej nowej pozycje - wy╢wietli siΩ okno z
informacj▒. Teraz wygeneruj procedurΩ OnCreate:
procedure TForm1.FormCreate(Sender: TObject);
begin
AppendMenu(
GetSystemMenu(Application.Handle, FALSE), MF_STRING, 101, 'Kliknij mnie!' );
Application.OnMessage := WMNewPos;
end;
87. Jak zrobiµ
w RichEdit indeks dolny lub g≤rny? ( tak jak w Wordzie ).
Przede wszystkim do listy modu│≤w ( uses ) musisz dodaµ
"RichEdit".
procedure TForm1.btnIndexClick(Sender: TObject);
var
CharFormat : TCharFormat;
begin
ZeroMemory(@CharFormat, SizeOf(TCharFormat)); // zerowanie pamieci
with CharFormat do
begin
cbSize := SizeOf(TCharFormat); // przydziel pamiec
RichEdit.Perform(EM_GETCHARFORMAT, 1, LParam(@CharFormat));
yHeight:=Round(yHeight*0.7); // wysokosc
yOffset:=Round(yHeight*0.3); // polozenie
RichEdit.Perform(EM_SETCHARFORMAT, wParam(SCF_SELECTION), LParam(@CharFormat));
end;
RichEdit.SetFocus;
RichEdit.SelLength := 0;
end;
Najpierw pobierane s▒ dotychcczasowe ustawienia
czcionki, a nastΩpnie do wysoko╢ci czcionki dodawane jest po│o┐enie
( yOffset ). P≤╝niej nowa warto╢µ jest przypisywana komponentowi. Je┐eli
chcesz mieµ indeks dolny musisz nadaµ parametrowu yOffset warto╢µ
ujemn▒ - je┐eli chcesz ┐eby by│o tak jak wczΩsniej musisz nadaµ
warto╢µ zerow▒.
88. W jaki
spos≤b sprawdziµ jak▒ liter▒ oznaczony jest napΩd CD-ROM?
Poni┐sza funkcja zwraca zmienn▒ tekstow▒ z liter▒ dysku -
np: H:\
function GetCDROM : String;
var
I : Integer;
Drive : String;
DTYpe : Integer;
begin
for I := Ord('A') to Ord('Z') do
begin
Drive := Chr(i) + ':\';
DType := GetDriveType(PCHar(Drive));
if DType = DRIVE_CDROM then Result := Drive;
end;
end;
89. Jak w│▒czyµ
lub wy│▒czyµ diody klawiszy NumLock, CapsLock?
VK_CAPITAL - caps lock
VK_SCROLL - scroll lock
VK_NUMLOCK - num lock
Oto kod:
const
ON = 1;
OFF = 2;
var
KS : TKeyboardState;
begin
GetKeyboardState(KS);
KS[VK_SCROLL] := ON;
SetKeyboardState(KS);
Ten kod mo┐e nie zadzia│aµ w Win 2000/NT. Oto kod odpowiedni dla
tych platform:
keybd_event(VK_NUMLOCK, $45, KEYEVENTF_EXTENDEDKEY or 0, 0);
keybd_event(VK_NUMLOCK, $45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0);
90. Jak
zapisaµ zawarto╢µ schowka do pliku, i zawarto╢µ pliku do schowka?
Zapisywanie zawarto╢ci do pliku:
uses ClipBrd;
procedure TForm1.Button1Click(Sender: TObject);
var
TF : TextFile;
begin
AssignFile(TF, 'C:\Clipboard.txt');
try
Rewrite(TF);
Writeln(TF, ClipBoard.AsText);
finally
CloseFile(TF);
end;
end;
Kopiowanie zawarto╢ci pliku do schowka:
procedure TForm1.Button2Click(Sender: TObject);
var
TF : TextFile;
S : String;
begin
AssignFile(TF, 'C:\Clipboard.txt');
try
Reset(TF);
Readln(TF, S);
ClipBoard.AsText := S;
finally
CloseFile(TF);
end;
end;
91. Jak wykryµ po│▒czenie z netem?
U mnie dzia│a taki kod:
function Connected: Boolean;
var
Flags: DWORD;
begin
Flags := INTERNET_CONNECTION_MODEM or INTERNET_CONNECTION_LAN or
INTERNET_CONNECTION_PROXY or INTERNET_CONNECTION_MODEM_BUSY;
Result := InternetGetConnectedState(@Flags, 0); // sprawdz polaczenie.
end;
Do sekcji uses nale┐y dodaµ modu│ WinInet. Funkcja zwraca True je┐eli
jest po│▒czenie, a False je┐eli go nie ma.
92. Do czego s│u┐▒
funkcje Round i Trunc?
Funkcje te zaokr▒glaj▒ odpowiednio do do│u i do g≤ry liczbΩ
typu zmiennno-przecinkowego. Np:
var D : Double;
begin
D := 2.8;
ShowMessage(IntToStr(Trunc(D));
end;
93. Jak skasowaµ
wszystkie pliki z katalogu wyj▒tkiem np. a.txt oraz a.dat?
Oto rozwi▒zanie tego problemu:
function IsSlash(const sText: String) : String;
begin
{ sprawdzenie, czy na koncu jest znak \ }
if sText[Length(sText)] <> '\' then
Result := sText + '\' else Result := sText;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
SR: TSearchRec;
Found : Integer;
begin
{ szukaj plikow ( wszystkiech ) w danym kataogu }
Found := FindFirst(IsSlash(Edit1.Text) + '*.*', faAnyFile, SR);
while (Found = 0) do
begin
{ sprawdzenie jaka jest nazwa pliku - jezeli jest to a.txt lub a.dat -
nie rob nic }
if (SR.Name <> 'a.txt') and (SR.Name <> 'a.dat') then
DeleteFile(IsSlash(Edit1.Text) + SR.Name);
Found := FindNext(SR); // szukaj dalej
end;
FindClose(SR);
end;
94. W jaki spos≤b sprawdziµ
ile miejsca zajmuj▒ wszystkie pliki w danym katalogu?
Oto rozwi▒zanie. Procedura podaje ilo╢µ miejsca w kB:
function IsSlash(const sText: String) : String;
begin
{ sprawdzenie, czy na koncu jest znak \ }
if sText[Length(sText)] <> '\' then
Result := sText + '\' else Result := sText;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
SR: TSearchRec;
Found : Integer;
Size : Int64; { <-- dla duzych plikow - ten typ zmiennej }
begin
Size := 0; // zeruj
{ szukaj plikow ( wszystkiech ) w danym kataogu }
Found := FindFirst(IsSlash(Edit1.Text) + '*.*', faAnyFile, SR);
while (Found = 0) do
begin
Size := Size + (SR.Size);
Found := FindNext(SR); // szukaj dalej
end;
FindClose(SR);
{ dzielenie przez 1024, aby otrzymac liczbe kilobajtow }
Size := Size div 1024;
ShowMessage('Katalog: ' + Edit1.Text + ' zajmuje: ' + IntToStr(Size) + ' kB');
end;
95. Jak
odczytaµ tag z pliku mp3?
Kompletny przyk│ad mo┐esz znale╝µ ╢ci▒gaj▒µ kod ╝r≤d│owy.
Kliknij tutaj.
96. Jak wywo│aµ
okno po│▒czenia Internetowego?
WinExec('rundll32.exe rnaui.dll,RnaDial TP SA',sw_show);
Gdzie TP SA to nazwa po│▒czenia.
97. W jaki
spos≤b zaznaczyµ wybrany element w ListView?
Przyk│adowo ten kod zaznaczy 5 element:
with ListView do
begin
Selected := Items[5];
ItemFocused := Selected;
ListView.SetFocus;
end;
98. W jaki
spos≤b uniemo┐liwiµ zamkniΩcie programu?
Musisz wygenerowaµ procedurΩ OnCloseQuery i wpisaµ w niej:
CanClose := False;
99. Jak
zmieniµ datΩ modyfikacji pliku?
Na pocz▒tek procedura:
procedure FSetFileTime(FFile : String; Data : String);
var
Age, FHandle: integer;
LocalFileTime, FileTime: TFileTime;
F: File;
begin
if FileExists(FFile) then
begin
AssignFile(F, FFile);
Reset(F);
try
Age := DateTimeToFileDate(StrToDateTime(Data));
FHandle := TFileRec(F).Handle;
DosDateTimeToFileTime(LongRec(Age).Hi, LongRec(Age).Lo,
LocalFileTime);
LocalFileTimeToFileTime(LocalFileTime, FileTime);
SetFileTime(FHandle, nil, nil, @FileTime); {ustawia datΩ ostatniej modifikacji }
finally
CloseFile(F);
end;
end else
ShowMessage('B│▒d! Plik nie istnieje!');
end;
Teraz ┐eby zmieniµ datΩ piszesz:
FSetFileTime('C:\Delphi.zip', '01-01-01');
W tym wypadku na 01-01-2001 r.
100. Jak wydaµ
d╝wiΩk z g│o╢niczka w komputerze?
Na naszej sronie umieszczeony jest modu│ bleepint,
kt≤ry doskonale spe│nia tΩ funkcje.
101. Wy╢wietlenie
okna do regulacji g│o╢no╢ci?
WinExec('SNDVOL32.EXE', SW_SHOWNORMAL);
102. Jak
zrobiµ aby formularz by│ prze╝roczysty?
W sekcji private:
procedure CreateParams(var Params: TCreateParams); override;
Teraz w sekcji Implementation:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;
103. Jak za│adowaµ
obrazek ze schowka do komponentu Image?
uses Clipbrd;
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle(CF_BITMAP), 0);
end;
104.
Odczyt liczby przycisk≤w myszy.
Label1.Caption := 'Liczba przycisk≤w: ' + IntToStr(GetSystemMetrics(SM_CMOUSEBUTTONS));
105. Jak
uruchomiµ wygaszacz ekranu?
SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
< TOP >