Delphi FAQ 1

Strona g│≤wna

 

 

1. Jak wy╢wietliµ obrazek z rozszerzeniem *.jpg?
2. Jak wstawiµ do RichEdit jakie╢ symbole?
3. Jak wycinaµ, wklejaµ tekst do schowka?

4. Jak wczytaµ bitmapΩ z rozszerzeniem *.dat?

5. Jak skonwertowaµ zmienn▒ String na PChar i odwrotnie?

6. Jak zapisaµ warto╢µ do rejestru?
7. Jak skopiowaµ plik?
8. Jak ╢ci▒gn▒µ plik z Internetu?
9. W jaki spos≤b wys│aµ pocztΩ lub otworzyµ stronΩ Internetow▒?
10. Jak wstawiµ do RichEdit datΩ lub godzinΩ?
11. Jak stworzyµ komponent podczas dzia│ania programu?
12. Jak zamkn▒µ, zresetowaµ, wylogowaµ siΩ z systemu?
13. Jak ustawiµ kursor w podanym przeze mnie miejscu?
14. W Delphi 4 nie mam polskich liter, co zrobiµ?
15. Jak stworzyµ animacjΩ przesuwaj▒cego siΩ napisu?
16. Jak utworzyµ, usun▒µ katalog?
17. Co to jest biblioteka DLL?
18. Jak wykryµ czy w komputerze jest zainstalowana karta muzyczna?
19. Jak sprawdziµ jaka jest pojemno╢µ dysku i ile jest wolnego miejsca?
20. Jak odczytaµ ╢cie┐kΩ katalogu Windows i System
21. Jak dopisaµ do pliku kilka linii.
22. Jak zmieniµ tapetΩ pulpitu?
23. W jaki spos≤b regulowaµ dzwiΩk?
24. Czy jest jaki╢ inny spos≤b odgrywania d╝wiΩku ni┐ poprzez komponent MediaPlayer?
25. U mnie wszystko gra, ale gdy uruchamiam program u kolegi pokazuje mi siΩ b│▒d: "Cannot find file vcl50.bpl". O co chodzi?
26. Jak po najechaniu kursorem na Image zmieni│ siΩ obrazek, a po wyj╢ciu z obszaru obrazek powr≤ci│ do poprzedniego? 
27. Jak skonwertowaµ obrazek z *.bmp na *.jpg?
28. Jak umie╢ciµ w ComboBox listΩ wszystkich zainstalowanych czcionek?

29. Jak wysun▒µ szufladkΩ CD-ROM-u.

30. Jak skopiowaµ plik, aby jego postΩp by│ pokazywany na ProgressBar?

31. Jak zrobiµ, aby forma lub komponent mia│y inny kszta│t?

32. Jak ukryµ kursor myszy?

33. Co zrobiµ, aby pliki graficzne by│y w jednym EXE, a nie w osobnych plikach?
34. Jak za│adowaµ z zasob≤w kursor?
35. Jak wydrukowaµ dokument przy pomocy np. Worda?

36.  Jak pobraµ ikony program≤w?

37. Jak ukryµ program z paska zada±?

38. Jak zablokowaµ ponowne uruchomienie programu?

39. Jak ograniczyµ po│o┐enie kursora myszki?

40. Jak korzystaµ z plik≤w INI?

41. Jak sprawdziµ czy dany plik istnieje?

42. Jak przenie╢ skasowaµ, zmieniµ nazwΩ katalogu?

43. Jak zminimalizowaµ, przywr≤ciµ, ukryµ okno? 

44. Jak utworzyµ skr≤t do programu na pulpicie lub w menu start?
45. Jak zmierzyµ szeroko╢µ i wysoko╢µ tekstu w pikselach? 
46. Jak odczytaµ numer seryjny dysku lub dyskietki? 
47. Jak pobraµ uchwyt ( Handle ) dowolnego okna?
48. Jak zmieniµ tekst dowolnego okna?

49. Jak wydrukowaµ stronΩ testow▒ drukarki? 

50. Jak skonwertowaµ zmienn▒ Integer na PChar i odwrotnie?

51. Jak w Edicie wy╢wietliµ datΩ, tak, ┐eby dwukropek by│ zawsze na tym samym miejscu
?
52. Jak nie korzystaj▒c z komponentu dokleiµ do pliku program EXE? 

53. Jak wywo│aµ migotanie programu na pasku zada±?

54. Jak przechwyciµ uruchamianie wygaszacza ekranu? 

55. Jak rysowaµ po komponencie. 

56. Jak mogΩ rysowaµ po pasku tytu│owym formy?

57. Jak zrobiµ, aby na formie by│ wy╢wietlany zegarek? 

58. Jak zmieniµ datΩ w systemie?

59. Jak usun▒µ ( odinstalowaµ ) aplikacjΩ? 

60. Co zrobiµ by menu "Help" by│o po prawej stronie, a reszta po lewej.


1. Jak wy╢wietliµ obrazek z rozszerzeniem *.jpg?
Do listy modu│≤w uses dodaj s│owo jpeg. To nie zadzia│a na pewno w Delphi 2, a byµ mo┐e w Delphi 3.

Image.Picture.LoadFromFile('C:\image.jpg');



2. Jak wstawiµ do RichEdit jakie╢ symbole?
Najpierw musisz znaµ numer ASCII takiego znaku. W tym celu u┐yj mojego programu do podawania kod≤w ASCII. Jest to program z kodem ╝r≤d│owym i ┐eby go u┐ywaµ musisz go skompilowaµ. »eby to zrobiµ potrzebujesz Delphi 5. Je┐eli nie masz takiej wersji Delphi - napisz do mnie, a ja prze╢le Ci wersje skompilowan▒. 
Gdy ju┐ znasz kod takiego symbolu do RichEdit wpisz: 
   RichEdit.SelText := #169 // np. taki numer....



3. Jak wycinaµ, wklejaµ tekst do schowka?
Mo┐esz u┐yµ funkcji:
Memo1.CopyToClipBoard; // Kopiowanie...
Memo1.CutToClipboard;  // Wycinanie...
Memo1.PasteFromClipboard;  // Wklejanie...



4. Jak wczytaµ bitmapΩ z rozszerzeniem *.dat?
Nie mo┐esz do tego celu u┐yµ komponentu Image gdy┐ podczas wczytywania zasygnalizuje b│▒d. Zmieniasz wiΩc rozszerzenie obrazka, a programie piszesz:
var
   B : TBitmap;
begin
   B := TBitmap.Create;
   B.LoadFromFile('C:\Bitmap.dat'); // wczytanie...
   Canvas.Draw(10, 10, Bitmap); // w punkcie 10, 10 zostaje wczytaan
   B.Free;
end;


5. Jak skonwertowaµ zmienn▒ String na PChar i odwrotnie?
Zmienn▒ PChar na String  zmiania funkcja: StrPas, a String na PChar zmienia funkcja StrPCopy. 


6. Jak zapisaµ warto╢µ do rejestru?
Aby wykorzystywaµ funkcje zapisywania warto╢ci do rejestru nale┐y do listy uses dopisaµ s│owo: Registry. 
ProszΩ zapoznaµ siΩ z artyku│em "Rejestry" w dziale "Delphi". Tam dok│adne om≤wienie tego zagadnienia. 



7. Jak skopiowaµ plik?
Poni┐szy kod nie do╢µ, ┐e kopiuje plik to daje do wyboru jaki plik skopiowaµ i gdzie. Wska╝nik postΩpu pokazywany jest na komponencie Gauge.

procedure TForm1.Button1Click(Sender: TObject);
var
  Src : File;
  FSize,i: Integer;
  F : Pchar;
begin
if OpenDialog.Execute then //Wybranie pliku...
  AssignFile(Src, OpenDialog.FileName); 
  SaveDialog.FileName := OpenDialog.FileName;
  Reset(Src ,1);
  FSize := FileSize(Src); //Pobranie rozmiaru...
  Label1.Caption := IntToStr(FSize) + ' bajt≤w'; 
{ Wyswietlenie na etykiecie rozmiaru pliku }

  Sleep(1000);
try
if SaveDialog.Execute then //Gdzie zapisaµ...

 Application.ProcessMessages;

F := PChar(OpenDialog.FileName);

  CopyFile(F, PChar(SaveDialog.FileName), True);
for
i:=0 to 100 do
begin

  Application.ProcessMessages;
  Sleep(Trunc(FSize / 1024)); //Czekaj...
             
  Progress.Progress := I; //Pokazuje wska╝nika postΩpu

 end;
finally
ShowMessage('Kopiowanie zako±czone!');

end;
end;



8. Jak ╢ci▒gn▒µ plik z Internetu?
Przede wszytkim nale┐y do listy modu│≤w uses dodaµ s│owo: URLMon.

 if URLDownloadToFile(nil,'http://www.serwer.com/plik.htm', 'c:\plik.htm',0, nil) <> 0 then
    ShowMessage('B│▒d podczas ╢ci▒gania pliku');


9. W jaki spos≤b wys│aµ pocztΩ lub otworzyµ stronΩ Internetow▒?
Nale┐y zastosowaµ funkcje ShellExecute. Do listy modu│≤w musisz dodaµ s│owo SHELLAPI. 

ShellExecute(Handle, 'open', 'www.programowanie.of.pl', nil, nil, SW_SHOWMAXIMIZED);

Przy okazji tego pytania om≤wiΩ tak┐e konstrukcje funkcji ShellExecute. Pierwszy parametr to uchwyt okna (co to jest? Patrz: WinAPI FAQ ) Kolejny parametr to znak, ┐e chcesz skorzystaµ z funkcji open, nastΩpnie podajesz ╢cie┐kΩ programu, adres strony, lub adres e-mail ( w postaci: mailto:boduch@poland.com ). Ostatnim parametrem jest spos≤b wy╢wietlenia okna: 
Domy╢lne:  SW_SHOWNORMAL;
Zmaksymilizowane: SW_SHOWMAXIMIZED;
Zminimalizowane: SW_SHOWMINIMIZED;
Ukryte: SW_HIDE;



10. Jak wstawiµ do RichEdit datΩ lub godzinΩ?
Po pierwsze, aby wstawiµ datΩ lub godzinΩ do RichEdit musisz datΩ skonwertowaµ. Robi to funkcja DateToStr, TimeToStr. Og≤lna postaµ:

RichEdit1.SelText := DateToStr(Date);
RichEdit1.SelText := TimeToStr(Time);

Powy┐szy kod mo┐e nie dzia│aµ w starych wersjach Delphi gdy┐ nie s▒ przystosowane do daty 2000 i pokazuj▒ date: 99-12-30 :) 



11. Jak stworzyµ komponent podczas dzia│ania programu?
Oto kodzik: 

var
  Button : TButton;
begin
  Button := TButton.Create(Self);
  Button.Parent := Self; // Przypisanie rodzica
  Button.Caption := 'Przycisk 1'; 
  Button.Left := 100;
  Button.Top := 100;
end;



12. Jak zamkn▒µ, zresetowaµ, wylogowaµ siΩ z systemu?
Win32Check(ExitWindows(0, 0));
// Zaloguj siΩ jako nowy u┐ytkownik

Win32Check(ExitWindowsEx(EWX_REBOOT, 0));
//Uruchom ponownie komputer

Win32Check(ExitWindowsEx(EWX_SHUTDOWN, 0));
// Wy│▒cz komputer


13. Jak ustawiµ kursor w podanym przeze mnie miejscu?
To tego s│u┐y funkcja SetCursorPos(10, 10);
W tym przypadku ustawi kursor myszy w punkcie 10, 10.



14. W Delphi 4 nie mam polskich liter, co zrobiµ?
Uruchom rejestr Windows i stw≤rz now▒ warto╢µ typu DWORD:

HKEY_CURRENT_USER\Software\Borland\Delphi\4.0\
Editor\Options\NoCtrlAltKeys

Z warto╢ci▒ na "1". 


15. Jak stworzyµ animacjΩ przesuwaj▒cego siΩ napisu?
Poczytaj artyku│ o animacjach w dziale "Delphi". 


16. Jak utworzyµ, usun▒µ katalog?
Funkcja MkDir('Nazwa katlogu') tworzy katalog, a funkcja RmDir('Nazwa katalogu') go usuwa.



17. Co to jest biblioteka DLL?
Je┐eli chcesz siΩ dowiedzieµ co to jest biblioteka DLL i jak siΩ j▒ tworzy poczytaj artyku│ na ich temat. 



18. Jak wykryµ czy w komputerze jest zainstalowana karta muzyczna?
Po pierwsze musisz dodaµ do listy uses nazwΩ modu│u MMSystem.
Nale┐y u┐yµ funkcji WaveOutGetNumDevs

if WaveOutGetNumDevs > 0 then 
  Label1.Caption := 'Jest karta d╝wiΩkowa!'
else
  Label1.Caption := 'Brak karty d╝wiΩkowej!';



19. Jak sprawdziµ jaka jest pojemno╢µ dysku i ile jest wolnego miejsca?
To podawania wolnej ilo╢ci na dysku s│u┐y funkcja DiskFree, a do podawania ca│ego rozmiaru s│u┐y DiskSize.

begin
  Label1.Caption := Format('Wolne miejsce: %d',[DiskFree(0)]);
  Label2.Caption := Format('Ca│e miejsce: %d', [DiskSize(0)]);
end;



20. Jak odczytaµ ╢cie┐kΩ katalogu Windows i System
Do uzyskiwania takiej informacji s│u┐▒ funkcje GetWindowsDirectory i GetSystemDirectory.

var
  WDir : array[0..255] of char;
begin
GetSystemDirectory(WDir, SizeOf(WDir));
Label1.Caption := WDir;

»eby uzyskaµ ╢cie┐kΩ katalogu System nale┐y po prostu zamiast GetWindowsDirectory podstawiµ GetSystemDirectory.



21. Jak dopisaµ do pliku kilka linii.
var
  TF : TextFile;
begin
  AssignFile(TF, 'Nazwa pliku.txt');
  Append(TF);
    Writeln(TF, 'Moja strona w Internecie:');
    Writeln(TF, 'www.programowanie.of.pl');
  CloseFile(TF);
end;


22. Jak zmieniµ tapetΩ pulpitu?
var
 
S : String;
begin
  S := 'zdjecie.bmp';
  SystemParametersInfo(SPI_SETDESKWALLPAPER,0, PChar(s),
   SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE);


23. W jaki spos≤b regulowaµ dzwiΩk?
To tego celu s│u┐y funkcja WaveOutSetVolume. Warto╢µ dzwiΩku jest waro╢ci▒ Integer. Poni┐sza linia ustawia dzwiΩk na warto╢ci maksymalnej:

WaveOutSetVolume(0, $FFFFFFFF);

poni┐sza linia ustawia dzwiΩk na cichszy: 

WaveOutSetVolume(0, $20002000);

Konstrukcja jest do╢µ prosta. Po znaku $ ustawiana jest g│o╢no╢µ prawego i lewego g│o╢nika. W powy┐szych przypadkach na obu g│o╢nikach warto╢µ jest taka sama. Aha, je┐eli chcesz korzystaµ z tej funkcji musisz dodaµ do listy uses s│owo MMSystem. 


24. Czy jest jaki╢ inny spos≤b odgrywania d╝wiΩku ni┐ poprzez komponent MediaPlayer?
Tak, musisz skorzystaµ z modu│u MMSystem. NastΩpnie skorzystaj z funkcji PlaySound:

PlaySound('Dzwiek.wav', 0, SND_FILENAME);

WiΩcej o d╝wiΩkach poczytaj sobie w dziale "Delphi".



25. U mnie wszystko gra, ale gdy uruchamiam program u kolegi pokazuje mi siΩ b│▒d: "Cannot find file vcl50.bpl". O co chodzi?
Jest to wina kompilacji. Musisz skompilowaµ program wraz z plikiem vcl50.bpl, czyli plikiem pakietu. Je┐eli Tw≤j kumpel nie posiada Delphi, nie posiada tak┐e tego pliku. Mo┐esz do│▒czyµ ten plik do programu, albo skompilowaµ program wraz z tym plikiem. Wtedy program znacznie "zgrubieje", ale jest to konieczne. Aby to zrobiµ musisz otworzyµ menu "project" wybraµ "Options" i odznaczyµ opcjΩ "Bulid with runtime packages".



26. Jak po najechaniu kursorem na Image zmieni│ siΩ obrazek, a po wyj╢ciu z obszaru obrazek powr≤ci│ do poprzedniego?
ªci▒gnij sobie komponent, kt≤ry dzia│a tak jak Image z tym, ┐e potrafi kontrolowaµ wej╢cie myszki w obszar komponentu. ªci▒gnij go tutaj.
Je┐eli nie wiesz jak go zainstalowaµ poczytaj to.


27. Jak skonwertowaµ obrazek z *.bmp na *.jpg?
Pocz▒wszy od Delphi 3 znajduje siΩ modu│ jpeg. To w│a╢nie dziΩki niemu mo┐na dokonaµ konwersji. Wystarczy, ┐e zrobisz co╢ takiego:

var
  Bitmap : TBitmap;
  JPG : TJPEGImage;
begin
  try
    Bitmap := TBitmap.Create;
    Bitmap.LoadFromFile('C:\plik.bmp');
    JPG := TJPEGImage.Create;
    JPG.Assign(B);
    JPG.SaveToFile('C:\plik.jpg');
  finally
    B.Free;
    JPG.Free;
  end;
end;



28. Jak umie╢ciµ w ComboBox listΩ wszystkich zainstalowanych czcionek?
Wystarczy tylko jedna linia kodu:

ComboBox1.Items := Screen.Fonts;


29. Jak wysun▒µ szufladkΩ CD-ROM-u.
Nale┐y skorzystaµ z modu│u MMSystem. Oto kod:

mciSendString('Set cdaudio door open wait',nil,0,handle); //wysu±
mciSendString('Set cdaudio door closed wait',nil,0,handle); //wsu±


30. Jak skopiowaµ plik, aby jego postΩp by│ pokazywany na ProgressBar?
Mo┐na skorzystaµ z poni┐szego kodu: ProgressBar jest pod nazw▒ CopyB.

procedure TMainFrm.BtnInstallClick(Sender: TObject);
var
  FSize : Integer; //Rozmiar pliku
  Src : File; //Nazwa programu do skopiowania
  I : Integer;
begin

try
  AssignFile(Src, 'NazwaPlik.exe');// Nazwa
  Reset(Src, 1);// Otw≤rz...
  FSize := FileSize(Src);// Pobierz rozmiar

try
  while not Done do
    begin
      for I:=0 to 100 do
      begin
        Application.ProcessMessages;
        Sleep(Trunc(FSize / 10000));
        CopyFile(PChar(InstallProgram),          PChar('C:\Nazwa.exe'), True);//Kopiuj
        Application.ProcessMessages;
        CopyB.Progress := I;//Pokaz na wskazniku
          if I = 100 thne //Je┐eli koniec to Done na True
            Done := True; 
  if (Done) then //Je┐eli Done n True to przerwij
    Break;
     end;
   end;
 except
   raise Excepion.Create(
          'B│▒d podczas kopiowania!');
  end;
    finally
      CloseFile(Src);
   end;


31. Jak zrobiµ, aby forma lub komponent mia│y inny kszta│t?
Poni┐sza linia robi z formy elipsΩ. Je┐eli chcesz zmieniµ kszta│t innego komponentu to zamiast Handle podajesz np. Button1.Handle

SetWindowRgn(Handle,CreateEllipticRgn(0, 0, Width, Height), True);


32. Jak ukryµ kursor myszy?
ShowCursor(False); 
ShowCursor(True);


33. Co zrobiµ, aby pliki graficzne by│y w jednym EXE, a nie w osobnych plikach?
Musisz skorzystaµ z edytora zasob≤w dostarczanego wraz z Delphi. Je┐eli nie wiesz jak to zrobiµ poczytaj artyku│ o tym w dziale Delphi.


34. Jak za│adowaµ z zasob≤w kursor?
Gdy ju┐ masz przygotowany kursor w edytorze zasob≤w robisz np. co╢ takiego:

{$R NAZWAZASOBU.RES}
const
  crMojKursor = 1; //Numer musi byµ wiΩkszy od zera.
begin
  Screen.Cursors[crMojKursor] := 
       LoadCursor(hInstance,'MOJKURSOR');
 Form1.Cursor := crMojKursor;

NastΩpuje tutaj za│adowanie kursora z zasob≤w. Na samym pocz▒tku deklarowana jest nazwa zasobu, a p≤╝niej sta│a z nazw▒ kursora. WiΩcej o zasobach mo┐esz poczytaµ sobie w dziale Delphi.


35. Jak wydrukowaµ dokument przy pomocy np. Worda?
Musisz podaµ nazwΩ pliku z rozszerzeniem *.doc. Aby wydrukowaµ taki dokument skorzystaj z modu│u SHELLAPI;

uses ShellAPI;

begin
  ShellExecute(Handle,'print','C:\Dokument.doc',nil, nil, SW_HIDE);

DziΩki zastosowaniu znacznika SW_HIDE okno Worda siΩ nie poka┐e, a dokument zostanie wydrukowany. Tak samo mo┐esz wydrukowaµ dokument u┐ywaj▒c Notatnika. 


36.  Jak pobraµ ikony program≤w? 
Nale┐y skorzystaµ z modu│u SHELLAPI oraz funkcji ExtractIcon

uses ShellApi; 

procedure
TForm1.FormCreate(Sender: TObject); 
begin
 
  Image1.Picture.Icon.Handle:=
 ExtractIcon(Hinstance,'c:\Program.exe',32); 
end;


37. Jak ukryµ program z paska zada±?
Pasek musi byµ ukryty zanim stworzone zostan▒ formy. Poni┐szy kod nale┐y wiΩc dodaµ do ╝r≤d│a projektu ( Project | View Source ). Tak powinna wygl▒daµ ca│o╢µ:

program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var
  Ex : Integer;

begin
Application.Initialize;

 Ex:=GetWindowLong(Application.Handle, GWL_EXSTYLE);
 SetWindowLong(Application.Handle,GWL_EXSTYLE,
 Ex or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Program jest ukrywany z paska zada± dziΩki parametrowi WS_EX_TOOL_WINDOW.


38. Jak zablokowaµ ponowne uruchomienie programu?

var
  hM : HDC;
begin
 
hM:=CreateFileMapping(THANDLE($FFFFFFFF),nil,
 PAGE_READONLY,0,32,'ApplicationTestMap');

if GetLastError=ERROR_ALREADY_EXISTS then
begin
  ShowMessage('Nie mo┐na uruchomiµ tego samego programu');
  Application.Terminate;
  CloseHandle(hM);
end;


39. Jak ograniczyµ po│o┐enie kursora myszki?
S│u┐y do tego funkcja ClipCursor. A ca│o╢µ mo┐e wygl▒daµ np. tak:

var
R : TRect;
begin
  with R do
  begin
    Top := 20;
    Bottom := 20;
    Left := 20;
    Right := 20;
  end;
 ClipCursor(@R);
end;


40. Jak korzystaµ z plik≤w INI?
W dziale Delphi znajdziesz artyku│ dotycz▒cy plik≤w INI, zapisywanie odczyta itp.


41. Jak sprawdziµ czy dany plik istnieje?
S│u┐y do tego funkcja FileExists. Np:

if FileExists('C:\Moj.txt') then
  ShowMessage('Plik isnieje!')
else
  ShowMessage('Plik nie istnieje!');


42. Jak przenie╢ skasowaµ, zmieniµ nazwΩ katalogu?
Najlepiej jest skorzystaµ z modu│u SHELLAPI. Oto przyk│ad:

uses ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var R : TSHFileOpStructA;
begin
 with
R do
 begin

  Wnd:=Handle; // oznaczenie uchwytu
  wFunc:=FO_COPY;// opcja
  pFrom:='c:\moj'; // z katalogu
  pTo:='c:\dokumenty\moj';// do katalogu...
  fFlags:=FOF_NOCONFIRMMKDIR;
 end;
 if
SHFileOperation(R)<>0 then
   ShowMessage('B│▒d podczas kopiowania')
end;

Zamiast parametru FO_COPY mo┐esz u┐yµ:

  • FO_DELETE - kasuje wFrom
  • FO_RENAME - zmienia nazwΩ z wFrom do w wTo
  • FO_MOVE - przenosi z wFrom do wTo

43. Jak zminimalizowaµ, przywr≤ciµ, ukryµ okno?
S│u┐y do tego funkcja ShowWindow. Pierwszym parametrem jest uchwyt okna, a drugim stan okna. Mo┐e on byµ:

  • SW_HIDE - ukrywa okno.
  • SW_MAXIMIZE - maksymalizuje okno.
  • SW_MINIMIZE - minimalizuje. 
  • SW_SHOw - pokazuje.   

Np. ShowWindow(Handle, SW_SHOW);



44. Jak utworzyµ skr≤t do programu na pulpicie lub w menu start?
To nie zadzia│a w wypadku Delphi 2. W tym wypadku tworzony jest skr≤t do programu Notepad. 

uses  ShlObj, ActiveX, ComObj, Registry;

procedure TForm1.Button1Click(Sender: TObject);
var  MyObject:IUnknown;
     MySLink:IShellLink; 
     MyPFile:IPersistFile;  
     FileName:String;
     Directory:String;  
     WFileName:WideString;  
     MyReg:TRegIniFile;
begin
 MyObject:=CreateComObject(CLSID_ShellLink);
 MySLink:=MyObject as IShellLink;  
 MyPFile:=MyObject as IPersistFile;
 FileName:='C:\Windows\NOTEPAD.EXE';  
 with MySLink do 
 begin   
  SetPath(PChar(FileName));
  SetWorkingDirectory(PChar(ExtractFilePath(FileName)));  
 end;

 MyReg := TRegIniFile.Create('Software\MicroSoft\Windows\'+

'CurrentVersion\Explorer');

             // Poni┐sze dodaje skr≤t do desktopu
 Directory := MyReg.ReadString('Shell Folders','Desktop','');

 // A to do menu Start
Directory := MyReg.ReadString('Shell Folders','Start Menu','')+
'\Microspace';

  CreateDir(Directory);

 WFileName := Directory+'\Notatnik.lnk';  
 MyPFile.Save(PWChar(WFileName),False);
 MyReg.Free;
end;


45. Jak zmierzyµ szeroko╢µ i wysoko╢µ tekstu w pikselach?
S│u┐▒ do tego funkcje:
Canvas.TextWidth, Canvas.TextHeight; 

Canvas.TextWidth('Programowanie');


46. Jak odczytaµ numer seryjny dysku lub dyskietki? 

var
 Bufor:array[0..MAX_PATH] of Char;
 MaxCompLength, FileSystemFlags : Integer;
 Drive:Char;
 Serial:DWORD;
begin
 Drive:='A';
 GetVolumeInformation(PChar(Drive + ':\'),Bufor,SizeOf(Bufor),
  @Serial,MaxCompLength,FileSystemFlags,nil,0);
end;

Zmienna "Serial" posiada numer seryjny dyskietki, a "Bufor" etykietΩ. 
W przypadku dysku podaje numer partycji.


47. Jak pobraµ uchwyt ( Handle ) dowolnego okna?
S│u┐y do tego funkcja "FindWindow". »eby pobraµ uchwyt nale┐y znaµ w│a╢ciwo╢µ "Caption" lub "ClassName". Je┐eli nie znamy, kt≤rego╢ z tych element≤w wstawiamy nil. Przyk│ad pobrania uchwytu Inspektora Obiekt≤w. 

var
  H : THandle;
begin
  FindWindow(nil,'Object Inspector');


48. Jak zmieniµ tekst dowolnego okna?
Musisz znaµ uchwyt okna. (patrz: przyk│ad powy┐ej).

SetWindowText(Handle, 'Nowa nazwa okna');


49. Jak wydrukowaµ stronΩ testow▒ drukarki?
Nale┐y odwo│aµ siΩ do biblioteki rundll.dll i skorzystaµ z modu│u ShellAPI.

uses ShellAPI;

ShellExecute(Handle, 'open',
'rundll32','msprint2.dll, RUNDLL_PrintTestPage',nil,
SW_SHOWNORMAL);


50. Jak skonwertowaµ zmienn▒ Integer na PChar i odwrotnie?
Chyba najpro╢ciej bΩdzie u┐yµ funkcji Ord i Chr:

 // Char na Integer
 ShowMessage(IntToStr(Ord('C'))); // kod ASCII litery Char

// i odwrotnie...
 ShowMessage(Chr(25)); // znak odpowiadaj▒cy cyfrze 25


51. Jak w Edicie wy╢wietliµ datΩ, tak, ┐eby dwukropek by│ zawsze na tym samym miejscu?
Do tego celu najlepiej jest u┐yµ komponentu "MaskEdit" ( paleta: Additional ). 
Wybierasz w│a╢ciwo╢µ "EditMask" - pojawia siΩ okno do wyboru maski, a nastΩpnie klikasz na przycisku "Mask" i w oknie wybierasz plik "us.dem". Po prawej stronie pojawi│a siΩ lista masek. Wybierz z niej "Short Time" i OK! Gotowe. 


52. Jak nie korzystaj▒c z komponentu dokleiµ do pliku program EXE?
Jest to ╢rednio trudne. PostΩpuj wed│ug poni┐szych wskaz≤wek:
Naszym celem bΩdzie dodanie do zasob≤w Windows. Poniewa┐ standardowy edytor zasob≤w nie umo┐liwia tego musimy to zrobiµ rΩcznie. Do jednego katalogu skopiuj Tw≤j plik EXE oraz program "brcc32.exe", kt≤ry jest czΩ╢ciom Delphi [ znajduje siΩ w katalogu ...\Delphi\Bin ]. 
Teraz stw≤rz plik z rozszerzeniem *.rc, a nastΩpnie uruchom go w Notatniku. Wpisz taki tekst:

PROGRAM RCDATA "Program.exe"

Program.exe to oczywi╢cie nazwa Twojego programu, kt≤ry chcesz w│▒czyµ do EXEca. Ok, teraz zapisz ten plik. 
Musisz u┐yµ programu brcc32.exe, aby skompilowaµ zas≤b. W tym celu uruchom okienko MS - DOS'a i przejd╝ do katalogu w kt≤rym skopiowa│e╢ program brcc32.exe. W MS - DOS'ie do katalogu przechodzi siΩ poleceniem:

cd NazwaKatalogu

a przej╢cie do katalogu wy┐ej powoduje polecenie:

cd..

Gdy ju┐ jeste╢ w tym katalogu wpisz:

brcc32.exe PlikRC.rc

"PlikRC.rc" to plik, kt≤ry przed chwil▒ edytowa│e╢. Je┐eli wszystko p≤jdzie dobrze w katalogu powiniene╢ ujrzeµ plik z rozszerzeniem *.res, kt≤ry zawiera Tw≤j program! Moje gratulacje - w│a╢nie do│▒czy│e╢ program do zasob≤w. 
Teraz w programie nale┐y w kt≤rym╢ miejscu dopisaµ liniΩ:

{$R PLIKRC.RES}

Teraz w kt≤rej╢ procedurze wpisz:

var
  Res : TResourceStream;
begin
  Res:=TResourceStream.Create(hInstance,'PROGRAM',RT_RCDATA);
  Res.SaveToFile('Program.exe'); // zapisz na dysk
  Res.Free;
end; 

Je┐eli postΩpowa│e╢ wg. powy┐szych wskaz≤wek powinno siΩ udaµ. Po kompilacji w jednym EXEcu powinien znale╝µ siΩ Tw≤j doklejony program. 


53. Jak wywo│aµ migotanie programu na pasku zada±?
Normalnie je┐eli chesz, aby na pasku zada± nazwa Twojego programu siΩ "zapali│a" to piszesz co╢ takiego:

FlashWindow(Application.Handle,True);

Je┐eli chcesz, aby program przesta│ byµ zaznaczony to zamiast "True" piszesz "False". Teraz je┐eli chcesz, aby nazwa raz siΩ zapala│a, a raz "gais│a" to musisz na formie postawiµ komponent Timer. Zmien "Enabled" na False. W procedurze "OnTimer" tego┐ komponentu piszesz:

var
  Miganie : Boolean;
begin
  Miganie := not Miganie;
  FlashWindow(Application.Handle, Miganie);

Teraz ┐eby uruchomiµ zegar musisz napisaµ:

Timer1.Enabled := True;


54. Jak przechwyciµ uruchamianie wygaszacza ekranu?
W sekcji "private" umie╢µ tak▒ liniΩ kodu:

procedure WMSYSCommand(var M: TMessage); message WM_SYSCOMMAND;

W sekcji "Implementation" natomiast:

procedure TForm1.WMSYSCommand(var M: TMessage);
begin
  if M.WParam <> SC_SCREENSAVE then inherited
  else ShowMessage('Uruchamianie wygaszacza...');
end;

55. Jak rysowaµ po komponencie.

var 
  C:TCanvas;
begin
  C:=TCanvas.Create;
  C.Handle:=GetDC(Button1.Handle); // na Buttonie
    {Tu mo┐esz rysowaµ jak po zwyk│ym Canviasie}
  C.Free;

56. Jak mogΩ rysowaµ po pasku tytu│owym formy?
Jest to do╢µ trudnΩ gdy┐ rysowaµ mo┐esz za pomoc▒ funkcji API:
1. W sekcji "Interface" dodaj liniΩ:
  var
     DC : Integer;
2. W OnCreate formy wpisz:
     DC := GetWindowDC(handle);
3. Teraz w procedurze wpisz: 

var
  Text : PChar;
begin
  Text := 'Adam Boduch';
  TextOut(DC, 3, 4, Text, StrLen(Text));

Funkcja "TextOut" to funkcja API. Najpierw mamy uchwyt do paska, p≤╝niej pozycja wy╢wietlanego tekstu, tekst i w ko±cu okre╢lenie d│ugo╢ci tekstu ( StrLen ). 


57. Jak zrobiµ, aby na formie by│ wy╢wietlany zegarek?
Na formie umieszczasz komponent "Timer" i w procedurze "OnTimer" wpisujesz: 

  Canvas.Brush.Style := bsClear; // prze╝roczyste t│o 
  Refresh; // od╢wie┐
  Canvas.TextOut(20, 20, TimeToStr(Time)); {
   wy╢wietl w punkcie 20, 20 }

58. Jak zmieniµ datΩ w systemie?

var
 Data:Systemtime;
begin
 Data.wMonth:= 12;
 Data.wDay:=22;
 Data.wYear:=1995;
 SetLocalTime(Data);

59. Jak usun▒µ ( odinstalowaµ ) aplikacjΩ?
W przyk│adzie, kt≤ry za chwilΩ podam nasza aplikacja usuie samego siebie. Tak. W tym celu stworzony zostanie program ( ! ) ktory usunie pliki naszego programu. Program zostanie stworzony w katalogu Windows\Temp, gdy┐ ten katalogu jest czΩsto opr≤zniany, a nasz program zajmowa│ bΩdzie tylko 18 bajt≤w! Tak, to bΩdzie program dosowy z rozszerzeniem *.bat. A wiΩc oto kod:

var
  TF: TextFile;
begin
  PostMessage(Handle, wm_Quit, 0, 0); // zamkniecie naszej aplikacji

  AssignFile(TF, 'C:\Windows\Temp\kill.bat'); // zapisz plik
  Rewrite(TF);
  Writeln(TF, ':kill');
  Writeln(TF, 'cd ' + ParamStr(0));
  Writeln(TF, 'del ' + ExtractFileName(ParamStr(0)));
  Writeln(TF, 'if exist ' + 
  ExtractFileName(ParamStr(0))+ ' goto kill');
  CloseFile(TF);

// uruchom program
  WinExec('C:\Windows\Temp\kill.bat', sw_Hide);

60. Co zrobiµ by menu "Help" by│o po prawej stronie, a reszta po lewej. 
Zak│adaj▒c, ┐e "MainMenu" to komponent "TMainMenu", a "Pomoc1" to menu z pomoc▒ mo┐na zrobiµ tak w procedurze "OnCreate" formy:

procedure TForm1.FormCreate(Sender: TObject);
var
  Info: TMenuItemInfo;
  Buff: array[0..MAX_PATH] of Char;
begin
  Info.cbSize := SizeOf(TMenuItemInfo);
  Info.fMask := MIIM_TYPE;
  Info.dwTypeData := Buff;
  Info.cch := SizeOf(Buff);
  GetMenuItemInfo(MainMenu1.Handle, Pomoc1.Command, False, Info);
  Info.fType := Info.fType or MFT_RIGHTJUSTIFY;
  SetMenuItemInfo(MainMenu1.Handle, Pomoc1.Command, False, Info);
end;

 

< TOP >