Delphi FAQ 2

Strona g│≤wna

 

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

  • CF_TEXT - tekst;

  • CF_BITMAP - bitmapa

  • CF_PALETTE - paleta kolor≤w.

  • CF_METAFILE  - metaplik.


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 >