Showing posts with label Delphi. Show all posts
Showing posts with label Delphi. Show all posts

Thursday, October 29, 2009

Những câu hỏi về Delphi

1. Xác định thư mục của chương trình

Hàm dưới đây cho phép bạn lấy đường dẫn tới chương trình của bạn, giống như lệnh App.Path của VB

Function GetCurrentDirectory:String;
var nBufferLength:DWORD;
lpBuffer:PChar;
begin
nBufferLength:=MAX_PATH + 1;
GetMem(lpBuffer, nBufferLength);
try
if Windows.GetCurrentDirectory(nBufferLength,lpBuffer)>0 then
Result:=lpBuffer;
finally
Freemem(lpBuffer);
end;
end;


2. Xác định số Serial của một ổ đĩa bất kỳ

Số serial của ổ đĩa là một số do Hệ điều hành tạo ra, hầu như nó không bao giờ trùng nhau trên cả thế giới. Người ta thường dùng số serial của ổ đĩa để làm cơ sở cho việc hạn chế sao chép phần mềm không có bản quyền, vì mỗi phiên bản cài trên 1 ổ đĩa khác nhau nên số serial mà phiên bản đó đọc được không bao giờ trùng với các phiên bản cài trên các máy khác, do đó mã sử dụng sản phẩm của mỗi phiên bản đều khác nhau, vì vậy người dùng phải bỏ tiền ra mua sản phẩm khi cài nó vào máy khác (nhưng ngày nay nếu chỉ sử dụng cách này thì các Cracker sẽ bẻ khoá trong nháy mắt)

Function GetVolumeID(DriveChar:Char):String;
var MFL,VolFlag,SerNum:DWord;
begin
if GetVolumeInformation(PChar(DriveChar+':\'),nil,0,@SerNum,MFL,VolFlag,nil,0) then
begin
Result:=IntToStr(SerNum);
end
else
Result:='';
end;

3. Sử dụng hàm MessageBox trong Delphi

Để đưa ra các thông báo bạn có thể sử dụng hàm ShowMessage, nhưng hàm này có nhược điểm là không tạo được các nút bấm như Yes, No, Abort, Retry, Ignore... Vì vậy bạn phải sử dụng hàm MessageBox, thực chất đây là một hàm API và cách sử dụng nó như sau:

- Nội dung hàm:

MessageBox(
HWND hWnd, // handle của cửa sổ chính
LPCTSTR lpText, // địa chỉ của chữ trên hộp thông báo
LPCTSTR lpCaption, // địa chỉ của tiêu đề của hộp thông báo
UINT uType // kiểu của hộp thông báo
);

- Các tham số:

hWnd: Handle của cửa sỗ sẽ hiển thị thông báo
lpText: Con trỏ tới chuỗi nội dung thông báo
lpCaption: Con trỏ tới chuỗi nội dung tiêu đề hộp thông báo
uType: Kiểu của hộp thông báo, có các kiểu sau:
MB_ABORTRETRYIGNORE: Hộp thông báo có 3 nút: Abort, Retry, Ignore.
MB_OK:Hộp thông báo có 1 nút OK, đây là giá trị mặc định
MB_OKCANCEL: Hộp thông báo có 2 nút: OK, Cancel.
MB_RETRYCANCEL: Hộp thông báo có 2 nút: Retry, Cancel.
MB_YESNO: Hộp thông báo có 2 nút: Yes, No.
MB_YESNOCANCEL: Hộp thông báo có 3 nút: Yes, No, Cancel.


- Các biểu tượng trên hộp thông báo

MB_ICONEXCLAMATION,MB_ICONWARNING: Một biểu tượng cảnh báo.
MB_ICONINFORMATION, MB_ICONASTERISK: Một biểu tượng thông tin.
MB_ICONQUESTION: Một biểu tượng hỏi xác nhận.
MB_ICONSTOP,MB_ICONERROR, MB_ICONHAND: Một biểu tượng báo hiệu.


-Thiết đặt nút mặc định:

MB_DEFBUTTON1: Nút thứ 1 là mặc định
MB_DEFBUTTON2: Nút thứ 2 là mặc định
MB_DEFBUTTON3: Nút thứ 3 là mặc định
MB_DEFBUTTON4: Nút thứ 4 là mặc định

- Phương thức hiển thị của hộp thông báo:

MB_APPLMODAL: Phải làm việc với hộp thông báo xong mới được làm việc với cửa sổ chương trình
MB_SYSTEMMODAL: Phải làm việc với hộp thông báo xong mới được làm việc với cửa sổ chương trình, và hộp thông báo này luôn nằm trên tất cả các cửa sổ khác
MB_HELP: Thêm một nút Help vào hộp thông báo
MB_RIGHT: Căn lề phải cho chữ
MB_RTLREADING: Hiển thị chữ trên thanh tiêu đề theo chiều từ phải sang trái, dùng cho người do thái hay Arập
MB_TOPMOST: Hộp thông báo được tạo ra với kiểu nằm trên cùng WS_EX_TOPMOST.

- Giá trị trả về

Giá trị trả về là rỗng nếu không đủ bộ nhớ để tạo ra hộp thông báo.
Nếu thành công giá trị trả về sẽ là 1 trong các giá trị sau:
IDABORT: Nút Abort được chọn.
IDCANCEL: Nút Cancel được chọn.
IDIGNORE: Nút Ignore được chọn.
IDNO: Nút No được chọn.
IDOK: Nút OK được chọn.
IDRETRY: Nút Retry được chọn.
IDYES: Nút Yes được chọn.

- Ví dụ:

Tạo một hộp thông báo có 3 nút Abort-Retry-Ignore, nút Abort là mặc định, biểu tượng hộp là dấu hỏi, và luôn nằm trên cùng

MessageBox(form1.Handle,'Hello World','Message Box Demo',MB_ABORTRETRYIGNORE or MB_DEFBUTTON1 or MB_ICONQUESTION or MB_TOPMOST)

Nếu bạn muốn hiển thị nội dung thông báo từ một biến kiểu String:
msg:='Hello World';
title:='Message Box Demo';
MessageBox(form1.Handle,Pchar(msg),Pchar(title),MB_OKCancel)

Nếu bạn muốn nhận giá trị trả về của hàm:
msg:='Hello World';
title:='Message Box Demo';
If MessageBox(form1.Handle,Pchar(msg),Pchar(title),MB_OKCancel)=IDOK then
begin

{Công việc cần thực hiện khi người dùng click vào nút OK}
end;

Wednesday, October 28, 2009

Lập trình với hàm API bằng Visual Basic & Delphi

Bạn có thể thực hiện các chức năng với một cửa sổ như Phóng to, Thu nhỏ, Gửi xuống Taskbar, Di chuyển, Chỉnh kích thước hoặc bật nút Start của Windows hay đặt chế độ Standby, chạy Screen Saver thậm chí tắt màn hình máy tính của mình bằng cách gọi hàm API. Chương trình VB dưới đây mô phỏng những việc này.

Bạn thiết kế giao diện và các đối tượng như hình dưới đây

Caption Name
Standby cmdStandby
Start cmdStart
Minimize cmdMinimize
Maximize cmdMaximize
Move cmdMove
Size cmdSize
Close cmdClose

Copy đoạn code này và dán vào chương trình của bạn

Private Const WM_SYSCOMMAND = &H112
Private Const SC_SCREENSAVE = &HF140&
Private Const SC_MINIMIZE = &HF020&
Private Const SC_MAXIMIZE = &HF030&
Private Const SC_RESTORE = &HF120&
Private Const SC_TASKLIST = &HF130&
Private Const SC_MOVE = &HF010&
Private Const SC_SIZE = &HF000&

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Dim WDMax As Boolean

Private Sub cmdMinimize_Click()
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0
End Sub

Private Sub cmdMaximize_Click()
If WDMax = True Then
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_RESTORE, 0
WDMax = False
Else
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0
WDMax = True
End If
End Sub


Private Sub CmdClose_Click()
End
End Sub

Private Sub cmdMove_Click()
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Sub


Private Sub cmdSize_Click()
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_SIZE, 0
End Sub

Private Sub cmdStandby_Click()
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, 20
End Sub

Private Sub CmdStart_Click()
' Start menu
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_TASKLIST, 0
End Sub

o=========)================ END ===============================>

Với chương trình này bạn có thể làm được nhiều việc khá thú vị, nhưng tiếc là tôi không tìm ra cách để tắt màn hình và gọi trình bảo vệ màn hình (Screen Saver) bằng VB, do đó tôi sử dụng Borland Delphi 6.0 để thực hiện. Dưới đây là đoạn code bằng Delphi có thể tắt màn hình và chạy Screen Saver.

Nếu có thể bạn nên viết chương trình có chức năng đặt biểu tượng vào Systray, sau đó bật một Popup menu để chọn các chức năng như Đóng mở CD-ROM, Tắt màn hình, Chạy Screen Saver.... đó quả là một chương trình có ích.

Delphi

Bạn tự thiết kế giao diện, và trên đó bạn đặt 2 Button với Name là Button1 và Button2, Caption tuỳ ý, sau đó click đúp vào một Button để hiện ra cửa sổ soạn thảo và gõ đoạn lệnh sau vào.

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(application.Handle,WM_syscommand,SC_MonitorPower,1);

{bạn có thấy số 1 ở gần cuối dòng lệnh trên không ? nó có nghĩa là Tắt màn hình, bạn thay bằng số 0 (không) thì sẽ chuyển về chế độ Text }
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
{Tương tự như trên}

{1: Standby}
{0: Screen Save (chỉ có hiệu lực khi bạn đang sử dụng 1 trình Screen Saver)}
SendMessage(application.Handle,WM_syscommand,SC_ScreenSave,0);
end;

Sau khi tắt màn hình bạn chỉ cần bấm một phím bất kỳ là màn hình lại tự bật lên.

Tuesday, October 27, 2009

Đưa biểu tượng chương trình vào Systray Bằng Delphi

Bài viết này sẽ hướng dẫn bạn cách dùng hàm API để đưa biểu tượng chương trình vào systray (khay hệ thống nơi chứa chiếc đồng hồ trên thanh Taskbar). Chương trình viết bằng Delphi 6.0, có mã nguồn đi kèm

1. Tạo giao diện

- Bạn mở 1 Project mới, và thiết kế 1 Form như hình dưới đây

- Bạn thiết kế PopupMenu1 như hình dưới đây

2. Viết Code

- Bạn mở cửa sổ Code ra (bấm F12) trong phần Uses của Unit1 bạn khai báo thêm 2 Units sau:

uses Registry, ShellAPI.

- Trong phần Type bạn khai báo thêm 1 kiểu dữ liệu kiểu bản ghi như sau:

type
//Cấu trúc NOTIFYICONDATA
NOTIFYICONDATA = record
cbSize:WORD;
hWnd:HWND;
uID,uFlags,uCallbackMessage: UINT;
hIcon:HICON;
szTip:array[0..63]of char;
end;

- Trong phần Var khai báo thêm 2 biến như sau:

var
//Biến toàn cục kiểu NOTIFYICONDATA
pnid: NOTIFYICONDATA;
//Biến dùng để chứa vị trí Mouse
MousePos: TPoint;

- Trong phần Implementation khai báo hàm API như sau

implementation

{$R *.dfm}

//Hàm API phục vụ việc đưa biểu tượng chương trình vào systray
Function Shell_NotifyIconA (dwMessage:Longint;var pnid: NOTIFYICONDATA): Boolean;stdcall;External 'shell32';

- Bạn mở giao diện ra (bấm F12), click đúp vào khoảng trống của Form1, khi đó cửa sổ Code sẽ hiện ra và cho ta 1 thủ tục mẫu có dạng

procedure TForm1.FormCreate(Sender: TObject);

begin

end;

thủ tục này sẽ được thực thi khi Form được tạo ra (ngay khi chạy chương trình)

Bạn thay thế nó bằng đoạn Code dưới đây, để có được một thủ tục hoàn chỉnh như sau

procedure TForm1.FormCreate(Sender: TObject);
begin
//Khởi tạo các thông số cho cấu trúc NOTIFYICONDATA
//Kích thước cấu trúc NOTIFYICONDATA
pnid.cbSize :=sizeof(pnid);
pnid.uID := 1;
//Handle của icon cần hiển thị trên systray
pnid.hIcon := image1.Picture.Icon.Handle;
//Handle của cửa sổ mà hệ thống sẽ gửi các thông báo hệ thống (Message)
//thông qua icon trên systray
pnid.hWnd := form1.Handle;
//Thông báo (Mesage) mà hệ thống sẽ gửi cho cửa sổ chính
//thong qua icon trong systray, (sự kiện Mouse)
pnid.uCallbackMessage := WM_MOUSEMOVE;
pnid.uFlags :=NIF_ICON Or NIF_TIP Or NIF_MESSAGE;
//Dòng chữ hiện ra khi bạn di chuột vào icon trên systray
pnid.szTip := 'Friends2002';
end;

- Bạn lần lượt Click đúp vào các Button và nhập mã như sau

procedure TForm1.Button1Click(Sender: TObject);
begin
//Thực hiện đưa biểu tượng vào systray
Shell_NotifyIconA(NIM_ADD, pnid);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//Xoá biểu tượng khỏi systray
Shell_NotifyIconA(NIM_DELETE, pnid);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//Thay đổi nội dung cấu trúc NOTIFYICONDATA
pnid.cbSize :=sizeof(pnid);
pnid.uID := 1;
//Thay đổi icon khác
pnid.hIcon := image2.Picture.Icon.Handle;
pnid.hWnd := form1.Handle;
pnid.uCallbackMessage := WM_MOUSEMOVE;
pnid.uFlags :=NIF_ICON Or NIF_TIP Or NIF_MESSAGE;
//Thay đổi Tip khác
pnid.szTip := 'Friends2002 (c) 2002 by Tran Trung';

//Thực hiện thay đổi biểu tượng trong systray và Tip
Shell_NotifyIconA(NIM_MODIFY, pnid);
end;

- Bạn chọn Form1 trong Commobox phía trên của cửa sổ ObjectInspector, sau đó chọn Tab Events, rồi click đúp vào cột bên phải của dòng OnClose, khi đó thủ tục sau sẽ tự động được tạo ra

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin

end;

Bạn nhập đoạn mã vào giữa cặp Begin .. end; để thủ tục đó như sau

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Xoá biểu tượng khỏi systray
Shell_NotifyIconA(NIM_DELETE, pnid);
end;

- Tiếp theo là thủ tục rất quan trọng, nó cho phép bạn gọi đến một thủ tục khác hoặc thi hành lệnh khi bạn click lên biểu tượng trên Systray

Bạn lại chọn Form1 trong Commobox phía trên của cửa sổ ObjectInspector, sau đó chọn Tab Events, rồi click đúp vào cột bên phải của dòng OnMouseMove, khi đó thủ tục đáp ứng sự kiện chuột di chuyển trên Form tự động được tạo ra, bạn nhập thêm mã vào giữa cặp Begin .. end; để nó có dạng như sau.

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var Msg:Longint;
begin
msg:=X;
case Msg of
WM_RBUTTONUP: //Khi nút chuột phải nhả ra
begin
GetCursorPos(MousePos); //Lấy vị trí hiện tại của Mouse
popupmenu1.Popup(MousePos.X,MousePos.Y); //Mở menu popup
end;
WM_LBUTTONUP: //Khi nút chuột trái nhả ra
begin
if form1.Visible = false then form1.Show else form1.Hide ;
end;
end;

end;

- Bạn click đúp vào PopupMenu1 nằm trên cửa sổ giao diện, khi đó cửa sổ sau sẽ hiện ra

Bạn click đúp vào About, thủ tục đáp ứng sự kiện khi bạn chọn menu này sẽ hiện ra, bạn nhập mã như sau

procedure TForm1.About1Click(Sender: TObject);
begin
showmessage('Chuong trinh dua bieu tuong vao systray'+chr(13)+'(c)2002 by Tran Trung'+chr(13)+'E-mail: trantrung22@yahoo.com');
end;

Tương tự click đúp vào Exit và nhập mã như sau

procedure TForm1.Exit1Click(Sender: TObject);
begin
close;
end;