Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
Bài này nhờ mạnh xíu nữa nhé.
Cái bài lọc trùng của Mạnh rồi tính tổng đó giờ mình muốn sau khi kiếm được dòng duy nhất thì sẽ thêm 1 dòng tổng cộng dưới mỗi dòng duy nhất thì mình giải quyết làm sao . Nghĩ hòai không ra
Vấn đề sử dụng hàm tham chiếu qua UNIT tôi thấy cách bạn Thuyyeu99 làm qua Class cũng được nhưng chỉ nên dùng trong những trường hợp cần phải thế. Còn khi hàm đóng vai trò như một tài nguyên dùng chung ở mọi nơi với việc gọi thuận tiện thì không làm thế.
Delphi có một cách tổ chức code rất khoa học và "gói gọn". Khi một Project có nhiều function, procedure, Class thì Delphi cho phép tách code thành các unit, mỗi unit chứa một số tài nguyên làm một số tác vụ nào đó theo người lập trình sắp xếp. Với Form lưu mỗi form một unit đi cùng với file đính kèm một cặp là *.DFM. (sẽ thấy trong unit form ở gần từ khóa "implementation".
Nguyên tắc tách code ra unit. Bạn có thể bê một cụm các hàm và thủ tục vào một file unit riêng, ví dụ là "Unit1". Trong Unit1 này bạn chú ý 2 phần code:
INTERFACE: là nơi khai báo các Class, các biến - Var; hăng số - const; các function và procedure để các unit, project khác có thể gọi những tài nguyên này. Ví dụ bạn muốn các unit khác được phép sử dụng hàm GetSum thì trong khu vực INTERFACE cần khai báo
Mã:
function GetSum(a,b: Double): Double; //stdcall;
Khai báo trên gọi là Prototype - trong ngôn ngữ C, C++ thì nó chính là khai báo trong file *.h
Khu vực viết mã nguồn cho hàm là
IMPLEMENTATION (trong nguôn ngữ C, C++ thifcode phần này nằm trong file *.C, *.CPP)
{$ *.dfm} //khai báo này Delphi tự thêm vào nếu unit này được tạo ra khi bạn tạo Form, bản chất là đính kèm file khai báo cấu trúc hiển thị của form.
Trong khu vực này bạn vẫn có thể sử dụng khai báo USES để đưa vao các unit mà nó cung cấp các tài nguyên phục vụ cho việc viết mã nguồn phía dưới, nếu các unit đã khai báo ở mục USES trong INTERFACE chưa đáp ứng được.
Tiếp theo bạn viết mã nguồn hoặc tham chiếu tới DLL ở đây:
Mã:
function GetSum(a,b: Double): Double;
begin
Result := a + b;
end;
Bạn hãy nhớ, nếu không có khai báo prototye ở phần INTERFACE với function GetSum(a,b: Double): Double; thì hàm GetSum sẽ không gọi được ở các unit khác. Bây giờ giả sử trong một Project hoặc Unit khác muốn dùng các hàm trong "Unit1" (nói ở trên) thì cần khai báo
Mã:
USES Unit1;
Các bạn hãy chú ý có hai nơi được khai báo USES như nhau là INTERFACE và IMPLEMENTATION, thông thường khu vực INTERFACE chung ta khai báo các unit cần để sử dụng để khai báo được các prototype. Khu vực IMPLEMENTATION là phục vụ cho việc triển khai viết mã nguồn.
Sau khi bạn đã khai bảo Unit1 ở trên bạn đã có thể gọi ngay hàm GetSum một cách bình thường như nó đang nằm trong chính Unit bạn đang lập trình (mặc dù nó đang ở Unit khác).
Mã:
procedure CallSum;
var
res: Double;
begin
res := GetSum(10, 20);
end;
...
Tóm lại còn khá nhiều kiến thức mà nếu các bạn không đọc kỹ một chút tài liệu Object Pascal thì sẽ phải mò mẫm hơi lâu. Loạt bài trên các bạn đang đeo duổi phần ngọn mà gốc bị đuối.
Cảm ơn Bạn chỉ dẫn ... rất khoa học và ngắn gọn
Cho mình hỏi chút VD: Mình viết code sau cho Unit3 ... sử dụng tốt
Mã:
unit Unit3;
interface
{INTERFACE: là nơi khai báo các Class, các biến - Var; hăng số - const;
các function và procedure để các unit, project khác có thể gọi
những tài nguyên này. Ví dụ bạn muốn các unit khác được phép sử dụng
hàm GetSum thì trong khu vực INTERFACE cần khai báo}
function GetSum(a,b: Integer): Integer; stdcall;
implementation
{IMPLEMENTATION - Khu vực viết mã nguồn cho hàm là}
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
end.
Vậy mình muốn hỏi :
1/ trong Unit3 đó Thấy Mục : interface có viết Hàm GetSum rồi mà trong Mục: implementation lại viết lại chi tiết Hàm GetSum
2/ Vậy tại sao Mình ko viết thẳng Hàm GetSum vào luôn Mục interface luôn đi cho gọn .... tại sao ??!
Bài này nhờ mạnh xíu nữa nhé.
Cái bài lọc trùng của Mạnh rồi tính tổng đó giờ mình muốn sau khi kiếm được dòng duy nhất thì sẽ thêm 1 dòng tổng cộng dưới mỗi dòng duy nhất thì mình giải quyết làm sao . Nghĩ hòai không ra
Cảm ơn Bạn chỉ dẫn ... rất khoa học và ngắn gọn
Cho mình hỏi chút VD: Mình viết code sau cho Unit3 ... sử dụng tốt
Mã:
unit Unit3;
interface
{INTERFACE: là nơi khai báo các Class, các biến - Var; hăng số - const;
các function và procedure để các unit, project khác có thể gọi
những tài nguyên này. Ví dụ bạn muốn các unit khác được phép sử dụng
hàm GetSum thì trong khu vực INTERFACE cần khai báo}
function GetSum(a,b: Integer): Integer; stdcall;
implementation
{IMPLEMENTATION - Khu vực viết mã nguồn cho hàm là}
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
end.
Vậy mình muốn hỏi :
1/ trong Unit3 đó Thấy Mục : interface có viết Hàm GetSum rồi mà trong Mục: implementation lại viết lại chi tiết Hàm GetSum
2/ Vậy tại sao Mình ko viết thẳng Hàm GetSum vào luôn Mục interface luôn đi cho gọn .... tại sao ??!
Cả hai câu hỏi của bạn chung một câu trả lời: Delphi quy định như thế . Interface là nơi khai báo cấu trúc thủ tục, hàm, class , biến và hằng số. Implementation là nơi viết mã nguồn cho nó hoặc khai vào tham chiếu tới thư viện ngoài - DLL. Mình cũng chỉ biết thừa nhận như vậy.
Cảm ơn Bạn chỉ dẫn ... rất khoa học và ngắn gọn
Cho mình hỏi chút VD: Mình viết code sau cho Unit3 ... sử dụng tốt
Mã:
unit Unit3;
interface
{INTERFACE: là nơi khai báo các Class, các biến - Var; hăng số - const;
các function và procedure để các unit, project khác có thể gọi
những tài nguyên này. Ví dụ bạn muốn các unit khác được phép sử dụng
hàm GetSum thì trong khu vực INTERFACE cần khai báo}
function GetSum(a,b: Integer): Integer; stdcall;
implementation
{IMPLEMENTATION - Khu vực viết mã nguồn cho hàm là}
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
end.
Vậy mình muốn hỏi :
1/ trong Unit3 đó Thấy Mục : interface có viết Hàm GetSum rồi mà trong Mục: implementation lại viết lại chi tiết Hàm GetSum
2/ Vậy tại sao Mình ko viết thẳng Hàm GetSum vào luôn Mục interface luôn đi cho gọn .... tại sao ??!
Bài đã được tự động gộp:
Giờ lại bận chút mai viết trên VBA cho ... Delphi chưa viết nên chưa hiểu cách viết lắm ... Trên GPE có hết rồi mà
Khai báo ở interface là quy định đâu có viết hàm được
Mạnh thử nghiệm chút nhé
trường hợp 1
interface có khai báo GetSum (ok)
Mã:
procedure TForm1.Button1Click(Sender: TObject);
var
I,a,b:integer;
begin
a:=15;
b:=10;
I:=GetSum(a,b);
ShowMessage('Ket Qua ' + IntToStr(I));
end;
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
trường hợp 2
interface không khai báo GetSum (lỗi)
Mã:
procedure TForm1.Button1Click(Sender: TObject);
var
I,a,b:integer;
begin
a:=15;
b:=10;
I:=GetSum(a,b);
ShowMessage('Ket Qua ' + IntToStr(I));
end;
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
trường hợp 3
interface không khai báo GetSum (ok)
Mã:
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I,a,b:integer;
begin
a:=15;
b:=10;
I:=GetSum(a,b);
ShowMessage('Ket Qua ' + IntToStr(I));
end;
Khai báo ở interface là quy định đâu có viết hàm được
Mạnh thử nghiệm chút nhé
trường hợp 1
interface có khai báo GetSum (ok)
Mã:
procedure TForm1.Button1Click(Sender: TObject);
var
I,a,b:integer;
begin
a:=15;
b:=10;
I:=GetSum(a,b);
ShowMessage('Ket Qua ' + IntToStr(I));
end;
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
trường hợp 2
interface không khai báo GetSum (lỗi)
Mã:
procedure TForm1.Button1Click(Sender: TObject);
var
I,a,b:integer;
begin
a:=15;
b:=10;
I:=GetSum(a,b);
ShowMessage('Ket Qua ' + IntToStr(I));
end;
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
trường hợp 3
interface không khai báo GetSum (ok)
Mã:
function GetSum(a,b: Integer): Integer;
begin
Result := a + b;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I,a,b:integer;
begin
a:=15;
b:=10;
I:=GetSum(a,b);
ShowMessage('Ket Qua ' + IntToStr(I));
end;
Cả hai câu hỏi của bạn chung một câu trả lời: Delphi quy định như thế . Interface là nơi khai báo cấu trúc thủ tục, hàm, class , biến và hằng số. Implementation là nơi viết mã nguồn cho nó hoặc khai vào tham chiếu tới thư viện ngoài - DLL. Mình cũng chỉ biết thừa nhận như vậy.
Ok. Việc tạo function trong DLL vẫn như bài đầu tiên tôi hướng dẫn. Trong video đó tôi hướng dẫn khai báo DLL trong VBA. Nếu khai báo DLL trong Delphi thì làm như sau:
Tạo một Unit mới tên là UnitImportFuncInDLL (tùy ý)
Mã:
unit UnitImportFuncInDLL;
interface
function GetSum(a,b: Double): Double; stdcall;
implementation
function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';
end.
Ok. Việc tạo function trong DLL vẫn như bài đầu tiên tôi hướng dẫn. Trong video đó tôi hướng dẫn khai báo DLL trong VBA. Nếu khai báo DLL trong Delphi thì làm như sau:
Tạo một Unit mới tên là UnitImportFuncInDLL (tùy ý)
Mã:
unit UnitImportFuncInDLL;
interface
function GetSum(a,b: Double): Double; stdcall;
implementation
[CODE]function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';
Ok. Việc tạo function trong DLL vẫn như bài đầu tiên tôi hướng dẫn. Trong video đó tôi hướng dẫn khai báo DLL trong VBA. Nếu khai báo DLL trong Delphi thì làm như sau:
Tạo một Unit mới tên là UnitImportFuncInDLL (tùy ý)
Mã:
unit UnitImportFuncInDLL;
interface
function GetSum(a,b: Double): Double; stdcall;
implementation
function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';
end.