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

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
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 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
Web KT
Back
Top Bottom