AI muốn lập trình DLL cho Excel và các loại bằng Delphi thì xem video này nhé! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,842
Được thích
10,337
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Tôi không dùng các phiên bản mới nên không biết.

Còn khi tôi cài Delphi 5 thì có 2 thư viện sách đồ sộ: Delphi và Windows API. Ngoài ra khi mở Delphi thì icon và menu Help cũng có ngay.

Thôi thì biết tên các hàm rồi thì gõ của bác google thôi.

Thử xem nhé

http://www.mediafire.com/file/9awswaw3zcwhx4u/Help.rar/file

View attachment 205126
View attachment 205127
View attachment 205128
Ủa cái Win của anh ngồ ngộ Win tiếng gì vậy anh
 
Upvote 0
phải nói thật là em cũng chưa biết xài help trong Delphi sao nữa ... bấm cái gì nó ra help ... Em xài bản XE6
tiện đây Anh chỉ Em luôn với
Cảm ơn Anh
View attachment 205123
Em mới thử F1 nó báo lỗi
View attachment 205125
Anh úp cho Em xin cái File help trên máy Anh với

Mình có tìm được 1 file tài liệu về Delphi https://drive.google.com/file/d/15_kuVNP3wnj3SYcyJN7ReGPwXsHGhb9L/view?usp=sharing
 
Upvote 0
Cái File help Anh @batman1 cho trong đó coi nhiều cái cơ bản rất hay
từ nay khi nào rảnh lại mở help ra coi code cơ bản 1 thời gian dài là tạm ok
Help.PNG
Bài đã được tự động gộp:

hay đó là sách của trang sau
http://www.delphibasics.co.uk/index.html
trong đó rất cơ bản có hết và list Function .... mình coi trang đó thấy bài nào hay toàn lưu lại nay có hết trong 1 Ebook rồi cảm ơn bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Chuột phải chọn save as ....eeeeeeeeee.PNG
 
Upvote 0
Ban kiểm tra Type của OleVariant được mà
if String then....
if Date then ....
if number then....
Cho mình hỏi chút trên VBA mình có thể kiểm tra Type của 1 biến bằng cách sau ...

Còn trong Delphi mình kiểm tra sao Bạn nhỉ ...?!
Tại vì biết 1 chút code két nên khai báo chứ trong Delphi ko biết chi luôn
Mã:
Sub CheckTypeName()
    Dim i&, str$, j#, k!, n@, b%
    MsgBox TypeName(i): Rem Dim i&        <===>    Dim i As long
    MsgBox TypeName(str): Rem Dim str$    <===>    Dim str As String
    MsgBox TypeName(j): Rem Dim j#        <===>    Dim j As Double_'La mot kieu bien la so(co nhieu kieu bien so)
    MsgBox TypeName(k): Rem Dim k!        <===>    Dim k As Single
    MsgBox TypeName(n): Rem Dim n@        <===>    Dim n As Currency
    MsgBox TypeName(b): Rem Dim b%        <===>    Dim b As Integer
End Sub
 
Upvote 0
Cho mình hỏi chút trên VBA mình có thể kiểm tra Type của 1 biến bằng cách sau ...

Còn trong Delphi mình kiểm tra sao Bạn nhỉ ...?!
Tại vì biết 1 chút code két nên khai báo chứ trong Delphi ko biết chi luôn
Mã:
Sub CheckTypeName()
    Dim i&, str$, j#, k!, n@, b%
    MsgBox TypeName(i): Rem Dim i&        <===>    Dim i As long
    MsgBox TypeName(str): Rem Dim str$    <===>    Dim str As String
    MsgBox TypeName(j): Rem Dim j#        <===>    Dim j As Double_'La mot kieu bien la so(co nhieu kieu bien so)
    MsgBox TypeName(k): Rem Dim k!        <===>    Dim k As Single
    MsgBox TypeName(n): Rem Dim n@        <===>    Dim n As Currency
    MsgBox TypeName(b): Rem Dim b%        <===>    Dim b As Integer
End Sub
mình cũng đang đau đầu vì nó đây
var
TypeName : string;
CheckType : Integer;

CheckType := VarType(varVar) and VarTypeMask;
case CheckType of
varEmpty : TypeName:= 'varEmpty';
varNull : TypeName := 'varNull';
End;
Bài đã được tự động gộp:

mình cũng đang đau đầu vì nó đây
var
TypeName : string;
CheckType : Integer;

CheckType := VarType(varVar) and VarTypeMask;
case CheckType of
varEmpty : TypeName:= 'varEmpty';
varNull : TypeName := 'varNull';
End;
Gán từng dòng vào Cell thì ok, mà gán nguyên Arr vào Rang đang bí, tự nó nhiều định dạng quá
 
Upvote 0
mình cũng đang đau đầu vì nó đây
var
TypeName : string;
CheckType : Integer;

CheckType := VarType(varVar) and VarTypeMask;
case CheckType of
varEmpty : TypeName:= 'varEmpty';
varNull : TypeName := 'varNull';
End;
Bài đã được tự động gộp:


Gán từng dòng vào Cell thì ok, mà gán nguyên Arr vào Rang đang bí, tự nó nhiều định dạng quá
khó là ta không khai báo type là nó báo lỗi làm sao mà viết code checkType được đây
 
Upvote 0
khó là ta không khai báo type là nó báo lỗi làm sao mà viết code checkType được đây
ua minh goi roi mà

Mã:
function IscheckType(varVar: Variant):String;
var
TypeName : string;
CheckType : Integer;
Begin
CheckType := VarType(varVar) and VarTypeMask;
case CheckType of
    varEmpty : TypeName:= 'varEmpty';
    varNull : TypeName := 'varNull';
    varSmallInt  : TypeName := 'varSmallInt';
    varInteger   : TypeName := 'varInteger';
    varSingle    : TypeName := 'varSingle';
    varDouble    : TypeName := 'varDouble';
    varCurrency  : TypeName := 'varCurrency';
    varDate      : TypeName := 'varDate';
    varOleStr    : TypeName := 'varOleStr';
    varDispatch  : TypeName := 'varDispatch';
    varError     : TypeName := 'varError';
    varByte      : TypeName := 'varByte';
    varWord      : TypeName := 'varWord';
    varLongWord  : TypeName := 'varLongWord';
    varInt64     : TypeName := 'varInt64';
    varStrArg    : TypeName := 'varStrArg';
    varString    : TypeName := 'varString';
    varAny       : TypeName := 'varAny';
    varBoolean   : TypeName := 'varBoolean';
    varVariant   : TypeName := 'varVariant';
    varUnknown   : TypeName := 'varUnknown';
    varTypeMask  : TypeName := 'varTypeMask';
End;
  Result:=TypeName;
end;

//Code Run
ShowMessage(checkType(Src[i, n]));
 
Upvote 0
To @thuyyeu99
Bạn có thể khai báo như sau là có thể xài Dic như @Nguyễn Duy Tuân chỉ dẫn ok rồi đó
Ta làm đơn giản đi một chút ??!!
Mã:
Var
dict: TDictionary<string, Integer>;
begin
dict := TDictionary<string, Integer>.create;
try
..... code
finally
dict.free;
end;
Cách khởi tạo này @Nguyễn Duy Tuân chỉ hay đó hãy thử 1 triệu dòng xem ha
tham khảo thêm về Dic cho Delphi
https://spring4d.4delphi.com/docs/m...ring.Collections.IDictionary(TKey,TValue).htm
 
Lần chỉnh sửa cuối:
Upvote 0
To @thuyyeu99
Bạn có thể khai báo như sau là có thể xài Dic như @Nguyễn Duy Tuân chỉ dẫn ok rồi đó
Ta làm đơn giản đi một chút ??!!
Mã:
Var
dict: TDictionary<string, Integer>;
begin
try
dict := TDictionary<string, Integer>.create;
..... code
finally
dict.free;
end;
Cách khởi tạo này @Nguyễn Duy Tuân chỉ hay đó hãy thử 1 triệu dòng xem ha
tham khảo thêm về Dic cho Delphi
https://spring4d.4delphi.com/docs/m...ring.Collections.IDictionary(TKey,TValue).htm
Niếu cột mình chưa biết trước và định dạng chưa biết trước thì có dùng được không, nếu được bạn cho mình 1 cái ví dụ với.
Ví dụ Range chạy lần đầu minh có 3 cột
Cột 1 integer
cột 2 String
Cột 3 Date

Range chạy lần thứ minh có 8 cột
Cột 1 String
cột 2 Date
Cột 3 String
Cột 4 integer
Cột 5 String
Cột 6 integer
Cột 7 integer
Cột 8 Double

thì có làm được không ?
 
Upvote 0
1048576 dòng
loc.jpg

Lọc trên List
loc list.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Úp cho Mình cái File dữ liệu đủ thứ đó mình thử xem cái đã (ít dữ liệu thôi )
tại mới biết cách viết ngày hôm qua lang thang kiến tài liệu tìm cái này nó lại ra cái khác ... tiện thấy thử luôn nó chạy ... mừng thấy bà hihihihi
Code tây nó viết như sau Bạn có thể tham khảo thêm ... sau khi có file bạn úp mình test xong úp code luôn cho ... nó đơn giản thay mấy từ à
Mã:
var
  Dic : TDictionary<Integer,TPerson>;
  p : TPerson;
  i : integer;
begin
  //Create dictionary
  Dic := TDictionary<Integer,TPerson>.Create;
  Dic.Add(1, TPerson.Create('Delphi', 'Mr'));
  Dic.Add(2, TPerson.Create('Generic', 'Bill'));
  Dic.Add(3, TPerson.Create('nonymous', 'An'));
  try

  //Travel the strings
  for p in Dic.Values  do begin
    ShowMessage(p.FullName);
  end;

  //Travel the keys
  for i in Dic.Keys do begin
    ShowMessage(IntToStr(i) + ': ' +
                             Dic.Items[i].FullName);
  end;

  //Find some key
  if Dic.TryGetValue(3, p) then begin
    ShowMessage('Found it!: ' + p.FullName);
  end;

  finally
    for p in Dic.Values do
      p.Free;

    //Also free Values and KeyCollection
    //other wise you have a memoryleak
    //Is this a bug?
    Dic.Values.Free;
    Dic.Keys.Free;

    //Free the dictionary
    Dic.Free;
  end;
Bạn tham khảo code trên cách duyệt dic của nó trước nha
 
Lần chỉnh sửa cuối:
Upvote 0
Úp cho Mình cái File dữ liệu đủ thứ đó mình thử xem cái đã (ít dữ liệu thôi )
tại mới biết cách viết ngày hôm qua lang thang kiến tài liệu tìm cái này nó lại ra cái khác ... tiện thấy thử luôn nó chạy ... mừng thấy bà hihihihi
Code tây nó viết như sau Bạn có thể tham khảo thêm ... sau khi có file bạn úp mình test xong úp code luôn cho ... nó đơn giản thay mấy từ à
Mã:
var
  Dic : TDictionary<Integer,TPerson>;
  p : TPerson;
  i : integer;
begin
  //Create dictionary
  Dic := TDictionary<Integer,TPerson>.Create;
  Dic.Add(1, TPerson.Create('Delphi', 'Mr'));
  Dic.Add(2, TPerson.Create('Generic', 'Bill'));
  Dic.Add(3, TPerson.Create('nonymous', 'An'));
  try

  //Travel the strings
  for p in Dic.Values  do begin
    ShowMessage(p.FullName);
  end;

  //Travel the keys
  for i in Dic.Keys do begin
    ShowMessage(IntToStr(i) + ': ' +
                             Dic.Items[i].FullName);
  end;

  //Find some key
  if Dic.TryGetValue(3, p) then begin
    ShowMessage('Found it!: ' + p.FullName);
  end;

  finally
    for p in Dic.Values do
      p.Free;

    //Also free Values and KeyCollection
    //other wise you have a memoryleak
    //Is this a bug?
    Dic.Values.Free;
    Dic.Keys.Free;

    //Free the dictionary
    Dic.Free;
  end;
Bạn tham khảo code trên cách duyệt dic của nó trước nha
Mình đang bí cái chỗ này chưa nghĩ ra cách làm bằng dictionary :oops:
Theo mình nghĩ cái dictionary ban khai báo cái
TPerson
trong đó
Delphi: String;
Generic: String;
nonymous: String;

Tự vì Code này dùng cho nhiều trường hợp. ví dụ mình chạy Code với trường hợp có 5 cột có cách nào không viết lại code mà vẫn dùng Code đó để chạy rồi Add vào Range
TPerson
trong đó
Day: Tdate;
SL: Doubler;
Dongia: Integer;
ThanhTien: Doubler;
Note: String;

Được Mạnh hướng dẫn giúp nhé. Thank You
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình đang bí cái chỗ này chưa nghĩ ra cách làm bằng dictionary :oops:
Theo mình nghĩ cái dictionary ban khai báo cái
TPerson
trong đó
Delphi: String;
Generic: String;
nonymous: String;

Tự vì Code này dùng cho nhiều trường hợp. ví dụ mình chạy Code với trường hợp có 5 cột có cách nào không viết lại code mà vẫn dùng Code đó để chạy rồi Add vào Range
TPerson
trong đó
Day: Tdate;
SL: Doubler;
Dongia: Integer;
ThanhTien: Doubler;
Note: String;

Được Mạnh hướng dẫn giúp nhé. Cảm ơn
Bạn thử code dùm Mình

1/ Tại [B1] bạn gõ 1 xong chạy code ... 2,3,4,+n xong chạy code
2/ có 1 sai sót là khi Cols loc duy nhất có 1 dòng mà nó cứ lấy thêm 1 dòng là 2 .... chưa xủ lý được
Bạn gõ 9 = cột Ghi Chú là thấy
3/ xong bài này ta làm 1 cái Dic thật phúc tạp hơn nữa xem sao ha
Mã:
function GetDictionaryKeys(sArr: OleVariant; const ColDic : longint):OleVariant; stdcall;
var
   Tmp,Arr    : OleVariant;
   i, j,k    : Longint;
   lcols,lRows    : Longint;
   dic: TDictionary<string, Integer>;
begin
   dic := TDictionary<string, Integer>.create;
   try
     k := 0;
     lRows := VarArrayHighBound(sArr, 1);
     lCols := VarArrayHighBound(sArr, 2);
     Arr := VarArrayCreate([1, lRows , 1, lcols],varVariant);
     if ColDic <= lCols then  begin
         for i := 1 to lRows do begin
           Tmp := trim(sArr[i, ColDic]);
          if not dic.ContainsKey(Tmp) then begin
              k := k + 1;
              Dic.Add(Tmp, k);
              For j := 1 To lcols do begin
                Arr[k, j] := sArr[i, j];
              End;
          end;
         end;
         Result := Arr;
     end;
   finally
     dic.free;
   end;
end;
Sử dụng code
Mã:
Sub Test_GetDictionaryKeys()
    On Error Resume Next ''xu ly loi khi gan ket qua Mang Arr = Empty
    Dim Arr As Variant
    Arr = Sheet4.Range("A2:I1000").Value
    Range("G4:P1000").ClearContents
    Rem Range("B1") la Tham so cot can loc duy nhat(Go 1,2,3,...Run Code)
    Arr = GetDictionaryKeys(Arr, Range("B1"))
    Range("G4").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
End Sub
Bạn xem cần chỉnh sửa gì bổ sung gì thêm xong chỉ dùm mình nhé ... Học tập tương tác qua lại mà he
 
Upvote 0
Thấy trang Dic cho Delphi nó nói vầy
Loại tham số

1/ TKey
Loại khóa trong từ điển.

2/ TValue
Loại giá trị trong từ điển.

3/ Loại IDictionary <TKey, TValue> hiển thị các thành viên sau.
 
Upvote 0
To @thuyyeu99 test code sao rồi mà thấy im re vậy ... hay ko chạy được
 
Upvote 0
Upvote 0
Mạnh có bài gì hay up lên cho mọi người học hỏi với :D:D:D:D:D:D:D:D:D:D:D:D:D:D
 
Upvote 0
Mạnh có bài gì hay up lên cho mọi người học hỏi với :D:D:D:D:D:D:D:D:D:D:D:D:D:D
bạn chỉ cho Mình cách tạo 1 cái Form cho File DLL đi có nghĩa như sau:
1/ tao 1 Form ko phải là Form.exe đâu nha
2/ cách khai báo gọi form Show từ DLL
3/ cách sử dụng hàm trong DLL khai báo trên Form
4/ xong Mình làm thủ tục gọi Form từ Excel ... to DLL cái Form đó nó Show

Xong bài này vài ngày nữa ta chuyển qua ADO cho Access he ... Mạnh viết cho vài hàm Mẫu ... đơn giản thôi mà ... Mạnh nhìn code họ viết vọc một hồi là ok à

chịu khó giúp Mạnh bước qua cái ngưỡng khai báo và sử dụng thì coi như là ok ròi đó

Cảm ơn nhiều
 
Upvote 0
bạn chỉ cho Mình cách tạo 1 cái Form cho File DLL đi có nghĩa như sau:
1/ tao 1 Form ko phải là Form.exe đâu nha
2/ cách khai báo gọi form Show từ DLL
3/ cách sử dụng hàm trong DLL khai báo trên Form
4/ xong Mình làm thủ tục gọi Form từ Excel ... to DLL cái Form đó nó Show

Xong bài này vài ngày nữa ta chuyển qua ADO cho Access he ... Mạnh viết cho vài hàm Mẫu ... đơn giản thôi mà ... Mạnh nhìn code họ viết vọc một hồi là ok à

chịu khó giúp Mạnh bước qua cái ngưỡng khai báo và sử dụng thì coi như là ok ròi đó
Code Form
Cảm ơn nhiều
Tạo Form
Mã:
var
  Form1: TForm1;
  f: TForm1;
  implementation

{$R *.dfm}
procedure adxtShowPrintSheet;
begin
  f := TForm1.Create(nil);
  try
    f.Show; //.ShowModal;
  finally

  end;
end;
Code Dlll
Mã:
  Unit1 in 'Form\Unit1.pas' {Form1};

procedure goiform; stdcall;
begin
adxtShowPrintSheet;
end;

Excel
Mã:
Declare PtrSafe Sub goiform Lib "DllATuan.dll" ()
Private Sub Test4()
Call goiform
End Sub
 
Upvote 0
Tạo Form
Mã:
var
  Form1: TForm1;
  f: TForm1;
  implementation

{$R *.dfm}
procedure adxtShowPrintSheet;
begin
  f := TForm1.Create(nil);
  try
    f.Show; //.ShowModal;
  finally

  end;
end;
Code Dlll
Mã:
  Unit1 in 'Form\Unit1.pas' {Form1};

procedure goiform; stdcall;
begin
adxtShowPrintSheet;
end;

Excel
Mã:
Declare PtrSafe Sub goiform Lib "DllATuan.dll" ()
Private Sub Test4()
Call goiform
End Sub
Mới Thử nó báo đỏ dòng sau:
Mã:
adxtShowPrintSheet
trong Sub
Mã:
procedure goiform; stdcall;
  begin
    adxtShowPrintSheet;
  end;
bạn xem dùm mình khai báo gì nữa ko
 
Upvote 0
Mới Thử nó báo đỏ dòng sau:
Mã:
adxtShowPrintSheet
trong Sub
Mã:
procedure goiform; stdcall;
  begin
    adxtShowPrintSheet;
  end;
bạn xem dùm mình khai báo gì nữa ko
mạnh phại khai báo dong này
procedure adxtShowPrintSheet;
phía trên var nữa
Mã:
procedure adxtShowPrintSheet;
var
  Form1: TForm1;
  f: TForm1;
  implementation

{$R *.dfm}
procedure adxtShowPrintSheet;
begin
  f := TForm1.Create(nil);
  try
    f.Show; //.ShowModal;
  finally

  end;
end;
 
Upvote 0
mạnh phại khai báo dong này
procedure adxtShowPrintSheet;
phía trên var nữa
Mã:
procedure adxtShowPrintSheet;
var
  Form1: TForm1;
  f: TForm1;
  implementation

{$R *.dfm}
procedure adxtShowPrintSheet;
begin
  f := TForm1.Create(nil);
  try
    f.Show; //.ShowModal;
  finally

  end;
end;
OK đã làm xong ...hhhhhhhhhhhhh.PNG
Chỉ cho Mạnh cách khai báo sử dụng hàm trong DLL cho Form với
 
Upvote 0
OK đã làm xong ...View attachment 205351
Chỉ cho Mạnh cách khai báo sử dụng hàm trong DLL cho Form với
thì cái Unit của mạnh tên gì thì mạnh khai báo Uses "tên của Unit" trong form roi goi hàm
Ví dụ:
mạnh nhấp chuột phải vào CT tạo AddNew - Chọn Unit
Cái Unit của Mạnh tên là UDFExcel có hàm CheckTypeName

thì trong Form mạnh khai báo Uses giống như system.Varita mà mạnh gọi hàm ý
Uses UDFExcel;

rồi code Form chỉ việc đánh tên hàm
CheckTypeName;
unit.jpgUntitled2.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
thì cái Unit của mạnh tên gì thì mạnh khai báo Uses "tên của Unit" trong form roi goi hàm
Ví dụ:
mạnh nhấp chuột phải vào CT tạo AddNew - Chọn Unit
Cái Unit của Mạnh tên là UDFExcel có hàm CheckTypeName

thì trong Form mạnh khai báo Uses giống như system.Varita mà mạnh gọi hàm ý
Uses UDFExcel;

rồi code Form chỉ việc đánh tên hàm
CheckTypeName;
View attachment 205357View attachment 205358
sao đến khúc này rối ko làm được mình chụp hình bạn chỉ dùm
thao tác Add new nó ra cái Unit mới ?!
Capture.PNG
 
Upvote 0
Làm dòng thứ 2 nó ko thấy cái Form nào cả
View attachment 205362
No dau phải là form, nó giống như Modul trong vba để mạnh viết code trong đó rồi muốn gọi ở đâu thì gọi.

Viết code trong đó rồi vào Form mà gọi code
1. mạnh viết cái hàm trong đó
2. vào Form gọi hàm trong đó bằng cách khai báo
Mã:
implementation
Uses UDFExcel;// day la ten của Unit2
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
WriteFormula // day là hàm trong Unit2
end;
 
Upvote 0
bạn úp cho Mình xin Toàn bộ VD với
Bài đã được tự động gộp:

No dau phải là form, nó giống như Modul trong vba để mạnh viết code trong đó rồi muốn gọi ở đâu thì gọi.

Viết code trong đó rồi vào Form mà gọi code
1. mạnh viết cái hàm trong đó
2. vào Form gọi hàm trong đó bằng cách khai báo
Mã:
implementation
Uses UDFExcel;// day la ten của Unit2
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
WriteFormula // day là hàm trong Unit2
end;
Vậy ko gọi hàm trong DLL được sao
 
Upvote 0
ý là viết code trên Form có xài lại các Hàm trong DLL ấy
Khai báo sử dụng lại ko phải mất công viết thêm nữa ... chỉ truyền tham số vào là chạy thôi
trời cái đó mình chưa thử nên cũng không biết (Thay vì bạn viết hàm dùng chung trong Dll sao không viết ra cái Unit), mình thường viết hàm dùng chung ra 1 Unit1, rồi từ Dll hay Form gọi hàm từ Unit
 
Upvote 0
trời cái đó mình chưa thử nên cũng không biết (Thay vì bạn viết hàm dùng chung trong Dll sao không viết ra cái Unit), mình thường viết hàm dùng chung ra 1 Unit1, rồi từ Dll hay Form gọi hàm từ Unit
ồ vậy sao ... ai biết ... bạn viết cho xin 1 code mẫu đi ... xong cho mình xin cái Source ây mình mở lên coi biết à
VD: hàm sau Viết trong Unit
Mã:
Function GetSum(a, b : Integer) : Integer;
begin
  Result := a + b;
end;
Xong làm thủ tục gọi hàm trên Form và DLL
 
Upvote 0
ồ vậy sao ... ai biết ... bạn viết cho xin 1 code mẫu đi ... xong cho mình xin cái Source ây mình mở lên coi biết à
VD: hàm sau Viết trong Unit
Mã:
Function GetSum(a, b : Integer) : Integer;
begin
  Result := a + b;
end;
Xong làm thủ tục gọi hàm trên Form và DLL
Code Unit
Mã:
unit UDFExcel;

interface



implementation
Uses ComObj, Classes, Variants;

Function GetSumUnit(a, b : Integer) : Integer;
begin
  Result := a + b;
end;

end.

Code Dll
Mã:
library DllATuan;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

//uses
//  System.SysUtils,
//  System.Classes;
uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  ComObj,
  Excel2000,
  Vcl.StdCtrls,
  Math,
  Vcl.ComCtrls,
  DateUtils,
  System.StrUtils,
  ActiveX,
  Data.DB,
  Data.Win.ADODB,
  System.Generics.Collections,
  UDFExcel in 'UDFExcel.pas',
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}



Function GetSumDLL(a, b : Integer) : Integer;
begin
  Result := GetSumUnit(a,b);
end;


exports
 GetSumDLL;

begin

end.

Code trong Form

Mã:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
Uses UDFExcel; //ten cua Unit
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ketqua,a,b:integer;
begin
a:=10;
b:=5;
ketqua:=GetSumUnit(a,b);
end;


end.
 
Upvote 0
Code Unit
Mã:
unit UDFExcel;

interface



implementation
Uses ComObj, Classes, Variants;

Function GetSumUnit(a, b : Integer) : Integer;
begin
  Result := a + b;
end;

end.

Code Dll
Mã:
library DllATuan;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

//uses
//  System.SysUtils,
//  System.Classes;
uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  ComObj,
  Excel2000,
  Vcl.StdCtrls,
  Math,
  Vcl.ComCtrls,
  DateUtils,
  System.StrUtils,
  ActiveX,
  Data.DB,
  Data.Win.ADODB,
  System.Generics.Collections,
  UDFExcel in 'UDFExcel.pas',
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}



Function GetSumDLL(a, b : Integer) : Integer;
begin
  Result := GetSumUnit(a,b);
end;


exports
GetSumDLL;

begin

end.

Code trong Form

Mã:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
Uses UDFExcel; //ten cua Unit
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ketqua,a,b:integer;
begin
a:=10;
b:=5;
ketqua:=GetSumUnit(a,b);
end;


end.
Làm y trang nó báo đỏ hàm GetSumUnitppppmmm.PNG
 
Upvote 0
có khai báo cái dòng này trong form khong đó
nó gạch đỏ như vậy là nó không hiểu cái hàm đó ở đâu
implementation
Uses UDFExcel; //ten cua Unit coi chừng cái tên của mạnh khác của mình áh
đúng mà ... ma sao thấy 2 cái Uses vậyok.PNG
 
Upvote 0
PÓ TAY MẠNH LUU FILE CHƯA
CÁI LỖI ĐÓ LÀ NO KHÔNG BIẾT HÀM ĐÓ LÀ GÌ
ĐÂY CỦA MÌNH NÓ THAM CHIẾU ĐƯỢC HÀM NÀY NẰM TRONG Unit (UDFExcel.pas)
View attachment 205374
Thì làm y trang mà ... chụp cái hình vầy mình nhìn cũng tịt Luôn
Chịu khó làm úp cho Mình 1 cái Source coi biết liền à ... có khi nói bên tây lại nghe bên đông à
Mới chụp xong nó như Hình mà Khi Buil nó lại lỗi Hàm
fffff.png
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Upvote 0
Vẫn lỗi đó ... bó tay
kkkk.PNG
 
Upvote 0
Form
Mã:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,UDFExcel;

type
  TForm1 = class(TForm)
    Button1: TButton;
    //procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  UDF : TUDFExcel;
implementation
//Uses ; //ten cua Unit
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ketqua,a,b:integer;
begin
a:=10;
b:=5;
ketqua:= UDF.GetSumUnit(a,b);
ShowMessage('LowBound 2  '+IntToStr(ketqua));
end;


end.

Dlll
Mã:
library DllATuan;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

//uses
//  System.SysUtils,
//  System.Classes;
uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  ComObj,
  Excel2000,
  Vcl.StdCtrls,
  Math,
  Vcl.ComCtrls,
  DateUtils,
  System.StrUtils,
  ActiveX,
  Data.DB,
  Data.Win.ADODB,
  System.Generics.Collections,
  UDFExcel in 'UDFExcel.pas',
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
var
  UDF : TUDFExcel;


Function GetSumDLL(a, b : Integer) : Integer;
begin
  Result := UDF.GetSumUnit(a,b);
end;

Unit
Mã:
unit UDFExcel;

interface

  type TUDFExcel = class
    private
    public
      Function GetSumUnit(a, b : Integer) : Integer;

  end;

var
E:variant;
implementation
Uses ComObj, Classes, Variants;

Function TUDFExcel.GetSumUnit(a, b : Integer) : Integer;
begin
  Result := a + b;
end;

end.


Hồi nya4 chưa Buil, cái này Buil ok rồi nhé ma không biết có chạy hông hihihihi
 
Upvote 0
Form
Mã:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,UDFExcel;

type
  TForm1 = class(TForm)
    Button1: TButton;
    //procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  UDF : TUDFExcel;
implementation
//Uses ; //ten cua Unit
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ketqua,a,b:integer;
begin
a:=10;
b:=5;
ketqua:= UDF.GetSumUnit(a,b);
ShowMessage('LowBound 2  '+IntToStr(ketqua));
end;


end.

Dlll
Mã:
library DllATuan;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

//uses
//  System.SysUtils,
//  System.Classes;
uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  ComObj,
  Excel2000,
  Vcl.StdCtrls,
  Math,
  Vcl.ComCtrls,
  DateUtils,
  System.StrUtils,
  ActiveX,
  Data.DB,
  Data.Win.ADODB,
  System.Generics.Collections,
  UDFExcel in 'UDFExcel.pas',
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
var
  UDF : TUDFExcel;


Function GetSumDLL(a, b : Integer) : Integer;
begin
  Result := UDF.GetSumUnit(a,b);
end;

Unit
Mã:
unit UDFExcel;

interface

  type TUDFExcel = class
    private
    public
      Function GetSumUnit(a, b : Integer) : Integer;

  end;

var
E:variant;
implementation
Uses ComObj, Classes, Variants;

Function TUDFExcel.GetSumUnit(a, b : Integer) : Integer;
begin
  Result := a + b;
end;

end.


Hồi nya4 chưa Buil, cái này Buil ok rồi nhé ma không biết có chạy hông hihihihi
Nó vẫn sai cái chi đó
eeeeeeeeeeeee.PNG
 
Upvote 0
Chạy ok rồi đó tuy nhiên thấy khai báo dài dòng quá
Có cách nào khác khai báo sử dung hàm ngắn gọn hơn 1 chút ko ???!!!
Mạnh Nghiên cứu đi.....

Mạnh đi vô tới đây mình chuẩn bị bí rồi a1h.

Mà sao đề tài này mình thấy nhiều người quan tâm lắm sao không ai vào commen hết nhỉ ??????????????
 
Lần chỉnh sửa cuối:
Upvote 0
À sẵn tiện đây cho mình hỏi khi viết hàm kết nối ADO mình đang phân vân không biết hướng nào tốt.

Hướng thứ 1:
Khi mở Chương trình lên thì cho kết nói ADO khi nào cần truy vấn tới Table nào thì mình chỉ cần connec tới Table đó. khi thoát chương trình thì mới ngắt kết nối.

Hướng thứ 2:
Khi cần truy vấn tới Table nào thì mình connec tới Table đó xong rồi thì ngắt kết nối.

Thank you
 
Upvote 0
À sẵn tiện đây cho mình hỏi khi viết hàm kết nối ADO mình đang phân vân không biết hướng nào tốt.

Hướng thứ 1:
Khi mở Chương trình lên thì cho kết nói ADO khi nào cần truy vấn tới Table nào thì mình chỉ cần connec tới Table đó. khi thoát chương trình thì mới ngắt kết nối.

Hướng thứ 2:
Khi cần truy vấn tới Table nào thì mình connec tới Table đó xong rồi thì ngắt kết nối.

Cảm ơn
bạn vào link sau đọc lại chút mấy bài Mạnh viết đó ... và HLMT trả lời đó
https://www.giaiphapexcel.com/diendan/threads/Đố-vui-về-ado-dao.80367/page-17
Mạnh mới coi link sau nó load Hàm trong DLL cho Form.exe đơn giản lắm
http://www.onlinedelphitraining.com/newsletters/dllexample.htm
 
Upvote 0
bạn vào link sau đọc lại chút mấy bài Mạnh viết đó ... và HLMT trả lời đó
https://www.giaiphapexcel.com/diendan/threads/Đố-vui-về-ado-dao.80367/page-17
Mạnh mới coi link sau nó load Hàm trong DLL cho Form.exe đơn giản lắm
http://www.onlinedelphitraining.com/newsletters/dllexample.htm
Cái đó là tùy mọi người, mỗi cái nó có mặt mạnh riêng ;);););););)
Mà cũng nhờ Mạnh nên mình cũng nghiệm ra được một chút hihihihihihihihi
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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.
Cần nói rõ là "thông thường" là thế này thế này. Nhưng không phải thích chỗ nào cũng được. Vd. không thể có
Mã:
unit Unit1;

interface

uses
  ..., Unit2;
và
Mã:
unit Unit2;

interface

uses
  ..., Unit1;

Không thể để cả 2 unit (uses) trong phần interface (lỗi circular unit reference). Cả 2 ở phần implementation hoặc 1 ở implementation 1 ở interface thì được.

Nói rõ thế để khi bị "dính" thì hiểu vì sao.
 
Upvote 0
Cần nói rõ là "thông thường" là thế này thế này. Nhưng không phải thích chỗ nào cũng được. Vd. không thể có
Mã:
unit Unit1;

interface

uses
  ..., Unit2;

Mã:
unit Unit2;

interface

uses
  ..., Unit1;

Không thể để cả 2 unit (uses) trong phần interface (lỗi circular unit reference). Cả 2 ở phần implementation hoặc 1 ở implementation 1 ở interface thì được.

Nói rõ thế để khi bị "dính" thì hiểu vì sao.

Các bạn thêm ý của anh Batman1 vào nữa nhé. Bài trước tôi chưa nói về vấn đề lỗi tham chiếu vòng “circular unit reference”. Khai báo Unit phải có cách tổ chức code khoa học kẻo sau này khi làm nhiều unit khai bái loạn lên là dò lỗi mệt. Trước đây tôi từng bị lỗi này mặc dù đã làm khá lắm thứ trên Delphi.
 
Upvote 0
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 rao_Oo_Oo_O
 
Upvote 0
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 đã được tự động gộp:

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 rao_Oo_Oo_O
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à
 
Upvote 0
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.
 
Upvote 0
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;
 
Upvote 0
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;
MÌNH CHƯA HIỀU 1 VÀ 3 LẮM ... NGÓ QUA CHÚT MAI RẢNH TEST LUÔN MỘT LƯỢT :D
 
Upvote 0
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.
Trong trường hợp mình muốn gọi hàm trực tiếp từ DLL cho Form thì có được ko Bạn
Nếu được thì khai báo sử dụng sao mong Bạn hướng dẫn luôn cho mình với

Mới hỏi như trên .... xong thì làm vầy thấy OK
Mã:
Function GetSumDLL(a, b : Integer):Integer; stdcall; external 'VBLibrary.dll';
Tuy nhiên ngoài cách này còn cách nào khác ?
 
Lần chỉnh sửa cuối:
Upvote 0
Trong trường hợp mình muốn gọi hàm trực tiếp từ DLL cho Form thì có được ko Bạn
Nếu được thì khai báo sử dụng sao mong Bạn hướng dẫn luôn cho mình với

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.
 
Upvote 0
Có ai yêu thích ôn lại Pascal cơ bản (basic) lại... không? thì cùng bàn (rất có ích với Delphi)
 
Upvote 0
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';

end.

[/CODE]
dòng sau là khai báo sử dụng DLL bên trong và bên ngoài DLL thì phải (Mình đoán vậy)
Mã:
function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';
 
Upvote 0
dòng sau là khai báo sử dụng DLL bên trong và bên ngoài DLL thì phải (Mình đoán vậy)
Mã:
function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';

Đó là để báo cho Delphi biết là cái hàm đó phải lấy trong DLL có tên "MyDLL" chứ đừng tìm code trong dự án này :)
 
Upvote 0
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.
MÌnh cũng ko hiểu lắm tại sao mình cho lên interface thì nó báo lỗi như hình
Mong Bạn chỉ dẫn
Capture.PNG
 
Upvote 0
Upvote 0
Upvote 0
Bạn chụp phía dưới sau Implement tôi kiểm tra xem
Code Unit Hết như Sau
Mã:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils,
  System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Unit2,Unit3;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    //procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

//function GetSumDLL(a,b: Integer): Integer;// stdcall;

//procedure adxtShowPrintSheet;
var
  Form1: TForm1;
  f: TForm1;
  UDF : TUDFExcel;

//function GetSumDLL(a,b: Integer): Integer;// stdcall;

implementation

{$R *.dfm}

//Điều này khai báo Max là một hàm cần tìm // bên ngoài, trong dll
//Function GetSumDLL(a, b : Integer):Integer; stdcall; external 'VBLibrary.dll';

procedure adxtShowPrintSheet;
begin
    f := TForm1.Create(nil);
    try
      //f.Show; //.ShowModal;
      f.ShowModal;
      finally
      f.free
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  res: integer;
begin
   res := GetSum(10, 20);
   ShowMessage('CallPublic  '+IntToStr(res));
end;

procedure TForm1.Button2Click(Sender: TObject);
var //Khai bao Kieu Class
  ketqua,a,b:integer;
begin
  a:=10;
  b:=5;
  ketqua:= UDF.GetSumUnit(a,b);
  ShowMessage('CallClass  '+IntToStr(ketqua));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  res: integer;
begin
    //res := GetSumDLL(10, 20);
   ShowMessage('CallDLL  '+IntToStr(res));
end;

end.
 
Upvote 0
Code Unit Hết như Sau
Mã:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils,
  System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Unit2,Unit3;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    //procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

//function GetSumDLL(a,b: Integer): Integer;// stdcall;

//procedure adxtShowPrintSheet;
var
  Form1: TForm1;
  f: TForm1;
  UDF : TUDFExcel;

//function GetSumDLL(a,b: Integer): Integer;// stdcall;

implementation

{$R *.dfm}

//Điều này khai báo Max là một hàm cần tìm // bên ngoài, trong dll
//Function GetSumDLL(a, b : Integer):Integer; stdcall; external 'VBLibrary.dll';

procedure adxtShowPrintSheet;
begin
    f := TForm1.Create(nil);
    try
      //f.Show; //.ShowModal;
      f.ShowModal;
      finally
      f.free
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  res: integer;
begin
   res := GetSum(10, 20);
   ShowMessage('CallPublic  '+IntToStr(res));
end;

procedure TForm1.Button2Click(Sender: TObject);
var //Khai bao Kieu Class
  ketqua,a,b:integer;
begin
  a:=10;
  b:=5;
  ketqua:= UDF.GetSumUnit(a,b);
  ShowMessage('CallClass  '+IntToStr(ketqua));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  res: integer;
begin
    //res := GetSumDLL(10, 20);
   ShowMessage('CallDLL  '+IntToStr(res));
end;

end.
Bạn khai báo như thế nhưng trong phần implementation bạn có implement hàm đó đâu.
Nếu đã khai báo ở interface như thế thì trong phần implementation phải có
Mã:
function GetSumDLL(a,b: Integer): Integer;// stdcall;
begin
...
end;
 
Upvote 0
Bạn khai báo như thế nhưng trong phần implementation bạn có implement hàm đó đâu.
Nếu đã khai báo ở interface như thế thì trong phần implementation phải có
Mã:
function GetSumDLL(a,b: Integer): Integer;// stdcall;
begin
...
end;
ý Em là muốn sử dụng lại cái Hàm GetSumDLL đã viết trong DLL ấy cho Form chỉ khai báo sử dụng nó ko phải viết lại nữa
 
Upvote 0
ý Em là muốn sử dụng lại cái Hàm GetSumDLL đã viết trong DLL ấy cho Form chỉ khai báo sử dụng nó ko phải viết lại nữa
Tôi chỉ chỉ ra cái sai thôi. Với khai báo như thế thì trong phần implementation phải có
Mã:
function GetSumDLL(a,b: Integer): Integer;// stdcall;
begin
...
end;

Còn ý bạn thế nào tôi không biết.

Rất khó trả lời trong chủ đề này vì mỗi bài chỉ là một câu cụt lủn hoặc một mẩu code. Muốn trả lời thì phải đọc hàng chục bài trước đó, mà chưa chắc đã đủ để hiểu ý.

Nếu là gọi hàm trong DLL thì Tuân đã hướng dẫn rồi:
Mã:
function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';

Nếu chỉ dùng trong code ở phần implementation (vd. trong TForm1.Button3Click) thì khai báo thậm chí có thể đặt trong phần implementation sau
Mã:
implementation

{$R *.DFM}
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi chỉ chỉ ra cái sai thôi. Với khai báo như thế thì trong phần implementation phải có
Mã:
function GetSumDLL(a,b: Integer): Integer;// stdcall;
begin
...
end;

Còn ý bạn thế nào tôi không biết.

Rất khó trả lời trong chủ đề này vì mỗi bài chỉ là một câu cụt lủn hoặc một mẩu code. Muốn trả lời thì phải đọc hàng chục bài trước đó, mà chưa chắc đã đủ để hiểu ý.

Nếu là gọi hàm trong DLL thì Tuân đã hướng dẫn rồi:
Mã:
function GetSum(a,b: Double): Double; stdcall; external 'MyDLL.dll';

Nếu chỉ dùng trong code ở phần implementation (vd. trong TForm1.Button3Click) thì khai báo thậm chí có thể đặt trong phần implementation sau
Mã:
implementation

{$R *.DFM}
cảm ơn Anh ... em làm ok rồi ... tại người ta keo Tạo 1 Unit mới xong làm như vậy ... thì em lại làm chung nên nó lỗi
Vậy là ok hết .... :D
 
Upvote 0
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 rao_Oo_Oo_O
2 ngày nay kẹt quá chưa coi làm được ...

Bạn làm sao rồi ??? Mình chưa nghĩ ra cách check cái cols đó trên Delphi làm sao biết nó là String hay số mà cộng đây ...

Bạn thử làm đi úp lên đây ... nhiều người tham gia biết đâu nó lại lòi ra nhiều cái hay đó ?! ( Kinh nghiệm cho mình thấy vậy )
 
Lần chỉnh sửa cuối:
Upvote 0
Các Bạn cho mình hỏi một chút
khi ta Add thêm 1 Unit mới thì mặc đinh Delphi tạo ra code như sau:
Mã:
unit Unit2;

interface

implementation

end.
Vậy Mình muốn hỏi là ta đặt Uses để sử dụng thư viện viết code dưới mục nào là chuẩn nhất:

1/ Để Uses dưới interface

Mã:
interface
Uses
  Winapi.Windows,
  Winapi.Messages,
   Vcl.Dialogs,
  Data.DB,
  Data.Win.ADODB,
  System.SysUtils;
2/ Để Uses dưới implementation
Mã:
implementation
Uses
  Winapi.Windows,
  Winapi.Messages,
   Vcl.Dialogs,
  Data.DB,
  Data.Win.ADODB,
  System.SysUtils;
3/ Tùy thích để chỗ nào cũng được .... Tại sao Mong các bạn chỉ dùm ??!!

( Mạnh thử 1 hay 2 thấy chạy hết ... còn tại sao thì thua :D:p)
xin cảm ơn
 
Upvote 0
Các Bạn cho mình hỏi một chút
khi ta Add thêm 1 Unit mới thì mặc đinh Delphi tạo ra code như sau:
Mã:
unit Unit2;

interface

implementation

end.
Vậy Mình muốn hỏi là ta đặt Uses để sử dụng thư viện viết code dưới mục nào là chuẩn nhất:

1/ Để Uses dưới interface

Mã:
interface
Uses
  Winapi.Windows,
  Winapi.Messages,
   Vcl.Dialogs,
  Data.DB,
  Data.Win.ADODB,
  System.SysUtils;
2/ Để Uses dưới implementation
Mã:
implementation
Uses
  Winapi.Windows,
  Winapi.Messages,
   Vcl.Dialogs,
  Data.DB,
  Data.Win.ADODB,
  System.SysUtils;
3/ Tùy thích để chỗ nào cũng được .... Tại sao Mong các bạn chỉ dùm ??!!

( Mạnh thử 1 hay 2 thấy chạy hết ... còn tại sao thì thua :D:p)
xin cảm ơn

Bạn đọc lại bài trên tôi đã giải thích tất kỹ. Đồng thời xem ví dụ liền sau đó.
 
Upvote 0
Bạn đọc lại bài trên tôi đã giải thích tất kỹ. Đồng thời xem ví dụ liền sau đó.
Cảm ơn chưa đọc kỹ mà vội hỏi ... thấy có mấy dòng sau:

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).
 
Upvote 0
2 ngày nay kẹt quá chưa coi làm được ...

Bạn làm sao rồi ??? Mình chưa nghĩ ra cách check cái cols đó trên Delphi làm sao biết nó là String hay số mà cộng đây ...

Bạn thử làm đi úp lên đây ... nhiều người tham gia biết đâu nó lại lòi ra nhiều cái hay đó ?! ( Kinh nghiệm cho mình thấy vậy )
Thank mạnh mình làm xong rồi, mà làm VBA chứ không phải Delphi
 
Upvote 0
Trời thì có gì đâu mình chỉ so sánh
Arr(i,1)<>Arr(i+1,1)
thì tăng thêm 1 dòng trong sArr thôi J=J+1
ko hiểu lắm ý mình hỏi là công tổng theo cột ấy ... mà chưa xác định được cột nào là text cột nào là số mà cộng
không lẻ cộng text
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Ua cai này nói rồi mà
if VarType(varVar) = varInteger then Sum
có nói khi nào đâu
tại mới nhập môn Delphi quen vba rồi qua đó mấy cái biến khác chưa học kịp đó thui
khai báo và sử dụng cũng khác nhiều lúc thấy ngáo ngơ à :D:p ... vậy nên mới hỏi chi tiết là thế đó he
 
Upvote 0
OK bạn .... giờ tiếp theo Dic (Scripting.Dictionary) ta làm 1 cái khó hơn chút he ...xong cái này ta nâng cấp lên chút nữa he

1/ Ta cho 1 cái mãng có 10 cột hay ko xác định số cột

2/ Làm sao ta viết code trên Delphi lọc duy nhất ra 10 hay ko xác định số cột .... gán kết quả qua vùng mới

Lưu ý là 10 cột hay ko xác định số cột đó cùng lọc duy nhất ha

3/ Gọi ý chút: Nhét hết 10 cột đó vào cái dic xong lọc nó ra he ... gán kết quả qua vùng bên cạnh ( đơn giản thui mà )

Phần sau ngoài lề he ... Vui vẻ đó ....?!

Mạnh thì chưa hiểu mô tê chi hết ngay cả khai báo còn chưa biết .....

Xin 1 code mẫu mà Bạn gợi ý vậy giống như đố mình
 
Lần chỉnh sửa cuối:
Upvote 0
OK bạn .... giờ tiếp theo Dic (Scripting.Dictionary) ta làm 1 cái khó hơn chút he ...xong cái này ta nâng cấp lên chút nữa he

1/ Ta cho 1 cái mãng có 10 cột hay ko xác định số cột

2/ Làm sao ta viết code trên Delphi lọc duy nhất ra 10 hay ko xác định số cột .... gán kết quả qua vùng mới

Lưu ý là 10 cột hay ko xác định số cột đó cùng lọc duy nhất ha

3/ Gọi ý chút: Nhét hết 10 cột đó vào cái dic xong lọc nó ra he ... gán kết quả qua vùng bên cạnh ( đơn giản thui mà )

Phần sau ngoài lề he ... Vui vẻ đó ....?!

Mạnh thì chưa hiểu mô tê chi hết ngay cả khai báo còn chưa biết .....

xin 1 code mẫu mà bạn gọi ý kiểu đó giống như thách đố nhau vậy
không hiểu ý Mạnh. nếu muốn lọc 10 cột thì mạnh giải rồi mà
Mã:
function GetDictionaryKeys(sArr: OleVariant; const ColDic : longint):OleVariant; stdcall;
var
   Tmp,Arr    : OleVariant;
   i, j,k,col    : Longint;
   lcols,lRows    : Longint;
   dic: TDictionary<string, Integer>;
begin
   dic := TDictionary<string, Integer>.create;
   try
     k := 0;
     lRows := VarArrayHighBound(sArr, 1);
     lCols := VarArrayHighBound(sArr, 2);
     Arr := VarArrayCreate([1, lRows , 1, lcols],varVariant);
         for i := 1 to lRows do begin
              For col := 1 To lcols do begin
                Tmp := Tmp + trim(vartostr(sArr[i, col]));
              End;
        ShowMessage(tmp);
          if not dic.ContainsKey(Tmp) then begin
              k := k + 1;
              Dic.Add(Tmp, k);
              For j := 1 To lcols do begin
                Arr[k, j] := sArr[i, j];
              End;
          end;
         end;
         Result := Arr;
   finally
     dic.free;
   end;
end;
 
Upvote 0
Các Bạn cho mình hỏi chút
Trên VBA ta có khai báo ReDim Preserve như sau:
Mã:
ReDim Preserve Arr(1 To UBound(Arr), 1 To 8)
Vậy mình muốn hỏi trên Delphi khai báo ReDim Preserve một mảng như thế nào

Mong chỉ dẫn ... xin cảm ơn
 
Upvote 0
Các Bạn cho mình hỏi chút
Trên VBA ta có khai báo ReDim Preserve như sau:
Mã:
ReDim Preserve Arr(1 To UBound(Arr), 1 To 8)
Vậy mình muốn hỏi trên Delphi khai báo ReDim Preserve một mảng như thế nào

Mong chỉ dẫn ... xin cảm ơn
VBA có Redim và Redim Preserve. Delphi 5 chỉ có SetLength. Delphi mới nhất tôi không rõ.
vd.

Mã:
var
a: array of array of Integer;
...
SetLength(a, 3, 7);
...
SetLenth(a, 5, 7);
...
SetLength(a, 10, 13);
...
SetLength(a, 1, 3);
v...v
"Phần mở rộng thêm" luôn không xác định. Tức Delphi không chèn gì (0, "", nil, ...) vào "Phần mở rộng thêm". Nếu code không nhập giá trị nào vào "Phần mở rộng thêm" thì nó chứa các giá trị ngẫu nhiên.
 
Upvote 0
Bạn nên tập hỏi cụ thể, đừng bắt người khác phải đoán.

Bây giờ tôi xem thấy bạn cứ vọc cái VarArrayCreate. Vậy nên đọc thêm về VarArrayRedim
 
Upvote 0
Bạn nên tập hỏi cụ thể, đừng bắt người khác phải đoán.

Bây giờ tôi xem thấy bạn cứ vọc cái VarArrayCreate. Vậy nên đọc thêm về VarArrayRedim
cảm ơn anh ... em đang từng bước chuyển code trên VB6 của em qua Delphi ... khó khăn chỗ nào em nhở chỉ chỗ đó ...
Cái VarArrayCreate. cơ bản em đã biết viết
còn VarArrayRedim nay mới bắt đầu thử vọc xem sao .. Em thấy link sau nó có nói
http://docs.embarcadero.com/product...html/delphivclwin32/System_VarArrayRedim.html
http://docs.embarcadero.com/product...l/delphivclwin32/Variants_VarArrayCreate.html
Link Delphi cũng nói vậy
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/VariantArrays_(Delphi)

Em mới coi qua lúc nào rảnh áp dụng vào code xem sao . khó khăn lại nhờ chỉ tiếp :D
 
Lần chỉnh sửa cuối:
Upvote 0
Mò được cái này nó lại lòi ra cái khác .... nhờ các Bạn chỉ dùm:D

1/ Trên VBA khi mình duyệt Sheet tạo một Array như sau để chạy For next
Mã:
Sub DuyetSheet()
    Dim MySheet As Variant
    Dim i As Long, j As Long
    MySheet = Array("Data_Nhap", "Data_Ban") ''tên SheetName
   
    For j = 0 To UBound(MySheet)
        MsgBox MySheet(j)
    Next
End Sub
2/ Vậy code trên Delphi viết sao khi mình khai báo List Sheet là Array xong chạy For duyệt Nó
Xin cảm ơn
 
Upvote 0
Mò được cái này nó lại lòi ra cái khác .... nhờ các Bạn chỉ dùm:D

1/ Trên VBA khi mình duyệt Sheet tạo một Array như sau để chạy For next
Mã:
Sub DuyetSheet()
    Dim MySheet As Variant
    Dim i As Long, j As Long
    MySheet = Array("Data_Nhap", "Data_Ban") ''tên SheetName
  
    For j = 0 To UBound(MySheet)
        MsgBox MySheet(j)
    Next
End Sub
2/ Vậy code trên Delphi viết sao khi mình khai báo List Sheet là Array xong chạy For duyệt Nó
Xin cảm ơn
Duyệt mảng thì bạn biết mà.
Còn nếu nói về hàm Array của VBA thì tôi không biết trong các phiên bản Delphi mới có hàm giống hoặc gần giống thế hay không. Tôi linh cảm là có cái gì đó gần giống Array của VBA.
Còn trong Delphi 5 thì nếu tôi không lầm thì không có. Nhưng với trường hợp như bạn nêu thì dùng CONST thôi.
Mã:
procedure TForm1.Button2Click(Sender: TObject);
const
  b: array[1..2] of string = ('Data_Nhap', 'Data_Ban');
  d: array[1..2, 1..3] of string = (('hic hic', 'hi hi', 'he he'),
                                    ('bla bla', 'ble ble', 'bli blu'));
var
  r, c: Integer;
begin
  for r := low(b) to high(b) do
    showmessage(b[r]);
  for r := low(d) to high(d) do
    for c := low(d[r]) to high(d[r]) do
      showmessage(d[r, c]);
end;
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom