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

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Cảm ơn Bạn ... Bạn hiểu sai ý Mạnh rồi ... Nhập liệu vào Form DLL của Add-ins ấy chứ ko phải Form.exe
Viết cái Form trong DLL Add-ins COM Delphi ... khi Excel load thì gọi cái Form đó lên xong nhập vào Textbox mà nó ko trả về cells ấy
cái lỗi đó... thay vì gõ trên Textbox của Form thì nó vào đó nhưng nó hạ cánh xuống Cells :D
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,273
Được thích
9,835
Điểm
860
Nơi ở
Hà Nội
Bạn @Nguyễn Duy Tuân Giúp Mạnh xử lý Nhập liệu trên Form của DLL Add-Ins Delphi như mô tả lỗi ở mấy bài trước được ko ???
Trên GPE này Nhờ tới Bạn là hy vọng cuối Cùng :D rất mong giúp Mạnh

Mạnh Cảm Ơn
Vấn đề con trỏ soạn thảo trên trên Form nhúng vào TaskPane hoặc hiển thị form bằng thủ tục Show() tạo từ Delphi là gặp rắc rối thực sự trừ việc ShowModal(). Lỗi này không phải của Delphi vì cơ chế Excel nó cản trở như vậy, gần như các ngôn ngữ khác đều sẽ bị vậy ngoại trừ VBA và .NET (.NET khi làm với TaskPane). Để khắc phục việc này có hai cách. Cách dùng thuộc tính Application.Interactive của Excel như trong code tôi đã sửa cho bạn trong bài này, cách thứ hai dùng API để nhận thông điệp bán phím từ cửa sổ cha (cách này rất khó). Trong code tôi gửi lên đây đã sửa và thêm trong Unit1 như sau:

1. Khai báo FExcelApp: ExcelApplication; Đưa ra ngoài phạm phi của class TForm1 để nó có thể dùng chung cho nhiều nơi nhiều form. Cái này tôi đã nhấn mạnh từ comment trước nhưng không biết sao bạn không thể làm theo.

2. Thêm hai thủ tục sự kiện DoDisableInteractive, DoEnableInteractive để hủy và khôi phục chế độ kiểm soát con trỏ của Excel. Các thủ tục này được gán vào các sự kiện của control edit như sau:

Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
 

File đính kèm

Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Vấn đề con trỏ soạn thảo trên trên Form nhúng vào TaskPane hoặc hiển thị form bằng thủ tục Show() tạo từ Delphi là gặp rắc rối thực sự trừ việc ShowModal(). Lỗi này không phải của Delphi vì cơ chế Excel nó cản trở như vậy, gần như các ngôn ngữ khác đều sẽ bị vậy ngoại trừ VBA và .NET (.NET khi làm với TaskPane). Để khắc phục việc này có hai cách. Cách dùng thuộc tính Application.Interactive của Excel như trong code tôi đã sửa cho bạn trong bài này, cách thứ hai dùng API để nhận thông điệp bán phím từ cửa sổ cha (cách này rất khó). Trong code tôi gửi lên đây đã sửa và thêm trong Unit1 như sau:

1. Khai báo FExcelApp: ExcelApplication; Đưa ra ngoài phạm phi của class TForm1 để nó có thể dùng chung cho nhiều nơi nhiều form. Cái này tôi đã nhấn mạnh từ comment trước nhưng không biết sao bạn không thể làm theo.

2. Thêm hai thủ tục sự kiện DoDisableInteractive, DoEnableInteractive để hủy và khôi phục chế độ kiểm soát con trỏ của Excel. Các thủ tục này được gán vào các sự kiện của control edit như sau:

Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
Cảm ơn Bạn rất nhiều ... Mai mốt mình thử các kiểu xem nếu có phát sinh lỗi gì mong Bạn trợ Giúp
vậy là Bạn đã giúp Mạnh 1 bước tiến vững chắc và dài trên con đường Phát triển Add-ins COM Delphi cho Excel đấy ...
vì viết Form mà ko xài được thấy khó chịu lắm

Cơ bản cái SQL bên thớt kia Mạnh Viết trên VB6 đã Ok ... Qua đây sang Delphi cũng đã Ok còn kẹt cái gõ trên Form nữa là xong ... vài ngày nữa rảnh làm nốt là xong

Hình sau mới thử thấy Ok

Capture.PNG

cảm ơn Bạn
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Có 2 mục mình khoanh đỏ đó Mình chưa biết tạo trên Form khác như thế nào Mình có vào Mục Events tìm mà không thấy
Mong các Bạn chỉ dùm ... Mò cơ bản cái Form + Events + Conltrol nữa mới tạm ok
Lóng ngóng trên Form Delphi quá :D

Untitled.png
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,273
Được thích
9,835
Điểm
860
Nơi ở
Hà Nội
Có 2 mục mình khoanh đỏ đó Mình chưa biết tạo trên Form khác như thế nào Mình có vào Mục Events tìm mà không thấy
Mong các Bạn chỉ dùm ... Mò cơ bản cái Form + Events + Conltrol nữa mới tạm ok
Lóng ngóng trên Form Delphi quá :D

View attachment 240257
Bạn nhinf form tôi sửa. Trên đầu unit, bên trong class hãy copy hai cái khai báo thủ tục đó sang form bên kia, phần code bôi đỏ copy sang nữa và đổi tên TForm1 thành tên TForm2 gì đo là được.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Bạn nhinf form tôi sửa. Trên đầu unit, bên trong class hãy copy hai cái khai báo thủ tục đó sang form bên kia, phần code bôi đỏ copy sang nữa và đổi tên TForm1 thành tên TForm2 gì đo là được.
VẬY là cái đó tự làm chứ trong sự kiện của Form ko có hay sao ??? hay nó nằm ở mục nào ? ... hèn chi mình tìm hoài ko thấy
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Các Bạn cho Mình hỏi chút

1/ Thường ngày Mình vẫn vẻ Control lên Form Delphi xong Build lại xong từ Menu Excel vẫn gọi Show Form lên Bình thường
Tối qua Mình vẻ thêm vài Cái Control + Edit lại nó chút xong Lưu lại Xong Build nó ko báo lỗi gì hết ... xong thử test chạy trên Excel thì cái Form trong DLL Delphi nó IM RE không thấy nó Show lên

2/ Vậy Mình muốn hỏi đó là lỗi gì và cách xử lý nó ... nếu ko xử lý được giờ ngồi làm lại từ đầu thấy hơi cực

3/ Cũng trong DLL đó mình có tạo cái mới xem sao thì thấy chạy ok

Mong các Bạn chỉ dùm cách khắc phục xử lý như mô tả ở trên
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,273
Được thích
9,835
Điểm
860
Nơi ở
Hà Nội
VẬY là cái đó tự làm chứ trong sự kiện của Form ko có hay sao ??? hay nó nằm ở mục nào ? ... hèn chi mình tìm hoài ko thấy
Tôi cố tình không gán sự kiện trong design form mà viết code để bạn nhìn thấy để vận dụng cho nhiều trường hợp khác. Sự kiện nhận chính là chỗ này:
Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
Bài đã được tự động gộp:

Các Bạn cho Mình hỏi chút

1/ Thường ngày Mình vẫn vẻ Control lên Form Delphi xong Build lại xong từ Menu Excel vẫn gọi Show Form lên Bình thường
Tối qua Mình vẻ thêm vài Cái Control + Edit lại nó chút xong Lưu lại Xong Build nó ko báo lỗi gì hết ... xong thử test chạy trên Excel thì cái Form trong DLL Delphi nó IM RE không thấy nó Show lên

2/ Vậy Mình muốn hỏi đó là lỗi gì và cách xử lý nó ... nếu ko xử lý được giờ ngồi làm lại từ đầu thấy hơi cực

3/ Cũng trong DLL đó mình có tạo cái mới xem sao thì thấy chạy ok

Mong các Bạn chỉ dùm cách khắc phục xử lý như mô tả ở trên
Khi gọi form từ lệnh (menu) thì bạn nên dùng ShowModal nhé. Show() là thủ tục hiển thị dạng Modaless mà dạng này phải chỉ ra quan hệ cha con....
Nói tóm lại là từ menu bạn luôn họi Form.ShowModal(); nếu không có vướng mắc gì khác.
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Tôi cố tình không gán sự kiện trong design form mà viết code để bạn nhìn thấy để vận dụng cho nhiều trường hợp khác. Sự kiện nhận chính là chỗ này:
Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
Bài đã được tự động gộp:



Khi gọi form từ lệnh (menu) thì bạn nên dùng ShowModal nhé. Show() là thủ tục hiển thị dạng Modaless mà dạng này phải chỉ ra quan hệ cha con....
Nói tóm lại là từ menu bạn luôn họi Form.ShowModal(); nếu không có vướng mắc gì khác.
Mới thử xong nó vẫn ko Show cái Form lên ... mà khi đó Build lại mới ko báo lỗi gì hết
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Bạn gửi code thủ tục show form xem nào?
Mạnh cũng ko biết tại sao nữa .. thường ngày vẫn chạy
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
  end;
end;
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,273
Được thích
9,835
Điểm
860
Nơi ở
Hà Nội
Mạnh cũng ko biết tại sao nữa .. thường ngày vẫn chạy
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
  end;
end;
Có hai vấn đề bạn phải giải quyết như sau:
1. Code trên chưa giải phóng biến Form1. Khi sử dụng Form1.Show() thì không free biến Form1 vì nó được tự giải phóng trong sự kiện OnQueryClose. Nhưng khi dùng ShowModal() thì không dùng OnQueryClose mà phải giải phóng nó ở khu vực Create. Vậy sửa nhưa sau
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
    Form1.Free;//RẤT QUAN TRỌNG!
  end;
end;
2. khi không hiển thị form thì có thể lỗi code trong sự kiện FormCreate(). Bạn phải debug trong khu vực này. Có thể gửi đoạn code trong thủ tục sự FormCreate lên đây tôi xem tiếp.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Có hai vấn đề bạn phải giải quyết như sau:
1. Code trên chưa giải phóng biến Form1. Khi sử dụng Form1.Show() thì không free biến Form1 vì nó được tự giải phóng trong sự kiện OnQueryClose. Nhưng khi dùng ShowModal() thì không dùng OnQueryClose mà phải giải phóng nó ở khu vực Create. Vậy sửa nhưa sau
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
    Form1.Free;//RẤT QUAN TRỌNG!
  end;
end;
2. khi không hiển thị form thì có thể lỗi code trong sự kiện FormCreate(). Bạn phải debug trong khu vực này. Có thể gửi đoạn code trong thủ tục sự FormCreate lên đây tôi xem tiếp.
Nó vẫn thế ... chỉ là tối qua vẻ thêm vài cái Control + Edit lại nó thôi hay do nhấm nhầm cái Gì trong Properties
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,273
Được thích
9,835
Điểm
860
Nơi ở
Hà Nội
Nó vẫn thế ... chỉ là tối qua vẻ thêm vài cái Control + Edit lại nó thôi hay do nhấm nhầm cái Gì trong Properties
Vậy xóa những cái thêm ấu đi rồi thêm lại. Nếu làm vậy vẫn không chạy thì mở code trong FormCreate ra đây sẽ biết ngay.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Vậy xóa những cái thêm ấu đi rồi thêm lại. Nếu làm vậy vẫn không chạy thì mở code trong FormCreate ra đây sẽ biết ngay.
Trên Form lâu nay cũng ko tạo cái đó luôn .. chỉ chèn 1 cái Form xong vẻ cái Control lên xong xài vậy thấy Ok
để tối nay Rảnh mạnh xóa hết đi xem sao ... lỗi do cái gì
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Ghét quá trên cái Form đó nó rối tinh hết bỏ luôn tạo cái Mới -0-0-0-

Vậy là SQL Từ VBA Mạnh chuyển Qua VB6 xong từ VB6 Mạnh chuyển vào Delphi thành công ... Học mà có chi sợ mất thời gian

bản test thử sẻ còn lỗi nhiều thứ ... Tạm thời gán dữ liệu lên Cells ... sau đó bổ sung sau nơi Gán dữ liệu và SQL trên Cells sau
@huuduy.duy Rảnh test thử dùm mạnh xem nó có chạy hay ko cái đã còn lỗi hay nọ kia Tính sau

Untitled.png
 

File đính kèm

Lần chỉnh sửa cuối:

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,273
Được thích
9,835
Điểm
860
Nơi ở
Hà Nội
Ghét quá trên cái Form đó nó rối tinh hết bỏ luôn tạo cái Mới -0-0-0-

Vậy là SQL Từ VBA Mạnh chuyển Qua VB6 xong từ VB6 Mạnh chuyển vào Delphi thành công ... Học mà có chi sợ mất thời gian

bản test thử sẻ còn lỗi nhiều thứ ... Tạm thời gán dữ liệu lên Cells ... sau đó bổ sung sau nơi Gán dữ liệu và SQL trên Cells sau
@huuduy.duy Rảnh test thử dùm mạnh xem nó có chạy hay ko cái đã còn lỗi hay nọ kia Tính sau

View attachment 240288
Norton kill nhé. Bạn có dung pm nào nén DLL không?
 

huuduy.duy

Thành viên tích cực
Tham gia ngày
29 Tháng mười 2010
Bài viết
821
Được thích
106
Điểm
420
Nơi ở
Cà Mau
Mình thử thì thấy như sau


1/ Khi bấm Get Files thì Form chọn File nằm dưới Form "SQL For Data Office"
1.png
2/ Khi bấm Get File, xong thoát (không chọn File nào) thì xuất hiện lỗi như hình
2.png


P/s: Bạn thêm tùy chọn Head Column
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Mình thử thì thấy như sau


1/ Khi bấm Get Files thì Form chọn File nằm dưới Form "SQL For Data Office"
View attachment 240304
2/ Khi bấm Get File, xong thoát (không chọn File nào) thì xuất hiện lỗi như hình
View attachment 240305


P/s: Bạn thêm tùy chọn Head Column
mấy cái đó mạnh sẻ thêm và Fix sau ... quan trọng có chạy ko cái đã
Files sau Mạnh mới sửa lại code 1 tẹo và cho Form hiện góc trên bên tay Phải
 

File đính kèm

Lần chỉnh sửa cuối:
Top Bottom