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,768
Được thích
10,281
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
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
 
Upvote 0
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:
Upvote 0
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
 
Upvote 0
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
 
Upvote 0
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.
 
Upvote 0
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
 
Upvote 0
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
 
Upvote 0
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:
Upvote 0
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
 
Upvote 0
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;
 
Upvote 0
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.
 
Upvote 0
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
 
Upvote 0
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.
 
Upvote 0
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ì
 
Upvote 0
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:
Upvote 0
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?
 
Upvote 0
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
 
Upvote 0
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:
Upvote 0
Web KT

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

Back
Top Bottom