Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
Nguồn thông tin tôi không chắc chắn lắm. Một số dự án cho NASA cũng viết băng Delphi đấy , các dự án này không được công bố hoặc không công bố rộng rãi. .
Delphi và C, C++ được các chuyên gia dùng làm công cụ để build các ứng dụng hoặc thư viện lõi của các hệ thống lớn đấy.
Nguồn thông tin tôi không chắc chắn lắm. Một số dự án cho NASA cũng viết băng Delphi đấy , các dự án này không được công bố hoặc không công bố rộng rãi. .
Delphi và C, C++ được các chuyên gia dùng làm công cụ để build các ứng dụng hoặc thư viện lõi của các hệ thống lớn đấy.
Mạnh thấy có dự án Viết cho điều kiển máy bay cất cánh hạ cánh đó
Bài đã được tự động gộp:
Mạnh Lưu tài Liệu Phím tắt Delphi lên Đây sau này có quên thì vào đây mà coi .... và các Bạn sau này nếu Đam mê Delphi thì Coi
=================
Phím tắt IDE mặc định Delphi
________________________________________
Đường tắt Sự miêu tả Phiên bản IDE
Bỏ trốn Chọn điều khiển cha mẹ trong chế độ thiết kế. Nhấp chuột trái + Thoát kéo điều khiển cha Delphi 2 trở lên
Shift + Nhấp Sau khi chọn điều khiển trong trình thiết kế biểu mẫu, bấm vào nó với Shift một lần nữa để chọn Biểu mẫu gốc nhất Delphi 5 trở lên
Chuyển hướng Trong Object Inspector kích hoạt tìm kiếm gia tăng cho các thuộc tính.Nhấn lại Tab để di chuyển tiêu điểm đến giá trị thuộc tính Delphi 5 trở lên
Ctrl + J Gọi các mẫu mã cũng được gọi là đoạn mã Delphi 5 trở lên
Ctrl + T Xóa văn bản từ vị trí con trỏ cho đến hết từ Delphi 5 trở lên
Ctrl + E Tìm kiếm gia tăng
Delphi 5 trở lên
Ctrl + Y Xóa dòng hiện tại Delphi 5 trở lên
Ctrl + B Gọi cửa sổ bộ đệm khi tập trung vào trình soạn thảo. Cửa sổ đệm hiển thị danh sách tất cả các tab khác nhau. Delphi 2007 trở lên
Ctrl + Shift + G Chèn GUID mới vào vị trí con trỏ Delphi 5 trở lên
Ctrl + Shift + I Thụt vào khối được chọn hiện tại Delphi 5 trở lên
Ctrl + Shift + U Bỏ chặn khối đã chọn hiện tại Delphi 5 trở lên
Ctrl + K + I Thụt vào khối được chọn hiện tại hoặc dòng hiện tại trong trường hợp không có lựa chọn Delphi 5 trở lên
Ctrl + K + U Hủy liên kết khối được chọn hiện tại hoặc dòng hiện tại trong trường hợp không có lựa chọn Delphi 5 trở lên
Ctrl + Shift + J Gọi SyncEdit Studio phát triển Borland 2006
Ctrl + Shift + V Tự động khai báo biến ở vị trí con trỏ Studio phát triển Borland 2006
Ctrl + Shift + Y Xóa đến cuối dòng Delphi 5 trở lên
Alt + [ Ghép cặp về phía trước Delphi 5 trở lên
Alt +] Ghép cặp ngược Delphi 5 trở lên
Alt + RightArrow Duyệt về phía trước (lịch sử hotlink) Delphi 6 trở lên
Alt + LeftArrow Duyệt ngược (lịch sử hotlink) Delphi 6 trở lên
Alt + UpArrow Duyệt đến biểu tượng dưới con trỏ trình chỉnh sửa (gọi một liên kết nóng và thêm nó vào lịch sử liên kết nóng) Delphi 7, Borland Developer Studio 2006
F4 Chạy chương trình đến vị trí con trỏ hiện tại Delphi 2 trở lên
F5 Chuyển đổi điểm ngắt Delphi 2 trở lên
F7 Trình gỡ lỗi bước vào Delphi 2 trở lên
Ca làm việc - F7 Theo dõi dòng nguồn tiếp theo Delphi 5 trở lên
F8 Trình gỡ lỗi bước qua Delphi 2 trở lên
Ca làm việc - F8 Chạy cho đến khi trở về Delphi 5 trở lên
F9 Chạy chương trình theo trình gỡ lỗi Delphi 2 trở lên
Ctrl + F2 Đặt lại chương trình Delphi 5 trở lên
Ctrl + F7 Đánh giá / sửa đổi Delphi 2005 trở lên
Ctrl + F5 Thêm đồng hồ Delphi 5 trở lên
Ctrl + F12 Xem đơn vị Delphi 2 trở lên
Alt + G Số dòng Goto trong trình chỉnh sửa Delphi 2 trở lên
Ctrl + O + G Số dòng Goto trong trình chỉnh sửa Delphi 5 trở lên
Ctrl + Shift + R Bắt đầu / dừng ghi macro chỉnh sửa Delphi 2 trở lên
Ctrl + Shift + P Chơi macro biên tập Delphi 2 trở lên
Ctrl + Phím cách Gọi hoàn thành mã Delphi 5 trở lên
Ctrl + Shift + Phím cách Gọi gợi ý tham số mã Delphi 5 trở lên
Ctrl + Enter Mở tệp tại con trỏ Delphi 2 trở lên
Ctrl + Shift + Enter Tìm tất cả các tài liệu tham khảo Delphi 2005 trở lên
Ctrl + Shift + C Gọi hoàn thành lớp cho lớp hiện đang chứa con trỏ Delphi 5 trở lên
Ctrl + Shift + UpArrow Điều hướng đến phương thức thực hiện / khai báo Delphi 5 trở lên
Ctrl + Shift + DownArrow Điều hướng đến phương thức thực hiện / khai báo Delphi 5 trở lên
Ctrl + Shift + 1 - 9 Đặt dấu trang ở hàng hiện tại trong nguồn Delphi 2006 trở lên
Ctrl + 1 - 9 Chuyển đến một hàng đánh dấu trong nguồn Delphi 2006 trở lên
Ctrl + Alt + F12 Mở trình đơn thả xuống ở góc trên bên phải của trình chỉnh sửa mã, liệt kê tất cả các tệp đang mở Studio phát triển Borland 2006
Ctrl + Alt + Bánh xe chuột Điều hướng đến việc triển khai phương thức trước hoặc tiếp theo theo thứ tự từ vựng trong đơn vị nguồn này hoặc trong lớp mà phạm vi đã bị giới hạn bằng cách sử dụng Ctrl + Q + L Studio phát triển Borland 2006
Ctrl + Alt + UpArrow Điều hướng đến việc triển khai phương thức trước theo thứ tự từ vựng trong đơn vị nguồn này hoặc trong lớp mà phạm vi đã bị giới hạn bằng Ctrl + Q + L Studio phát triển Borland 2006
Ctrl + Alt + DownArrow Điều hướng đến việc triển khai phương thức tiếp theo theo thứ tự từ vựng trong đơn vị nguồn này hoặc trong lớp mà phạm vi đã bị giới hạn bằng Ctrl + Q + L Studio phát triển Borland 2006
Ctrl + Alt + Trang chủ Điều hướng đến việc triển khai phương thức từ vựng đầu tiên trong đơn vị nguồn này hoặc trong lớp mà phạm vi bị giới hạn bằng cách sử dụng Ctrl + Q + L Studio phát triển Borland 2006
Ctrl + Alt + Kết thúc Điều hướng đến việc triển khai phương thức từ vựng cuối cùng trong đơn vị nguồn này hoặc trong lớp mà phạm vi bị giới hạn bằng Ctrl + Q + L Studio phát triển Borland 2006
Ctrl + Alt + P Kích hoạt Bảng công cụ trong chế độ lọc (bắt đầu nhập, nhấn Enter để thả thành phần) Delphi 2005 trở lên
Ctrl + Alt + A Thêm ngày hiện tại vào mã nguồn kể từ BCB 4.0
Ctrl + / Chuyển đổi nhận xét trên mỗi dòng hoặc khối được chọn và con trỏ đi xuống một dòng, Ctrl + # trên bàn phím nordic (và có lẽ quốc tế khác) Delphi 2005 trở lên
Ctrl + Shift + T Thêm mục danh sách việc cần làm Delphi 2005 trở lên
Alt + F12 Chuyển đổi giữa Form dưới dạng chế độ văn bản hoặc chế độ thiết kế Delphi 5 trở lên
Alt + F11 Gọi hộp thoại đơn vị sử dụng Delphi 5 trở lên
Ctrl + F11 Gọi hộp thoại dự án mở Delphi 2005 trở lên
Ctrl + Alt + F11 Gọi cửa sổ quản lý dự án Delphi 2005 trở lên
F11 Gọi cửa sổ Thanh tra đối tượng Delphi 5 trở lên
F12 Chuyển đổi giữa chế độ xem mã và chế độ xem thiết kế Delphi 5 trở lên
Alt + 0 Gọi danh sách cửa sổ Delphi 2005 trở lên
Shift + Alt + F11 Gọi cửa sổ cấu trúc Delphi 2005 trở lên
Ctrl + Shift + B Gọi cửa sổ Trình duyệt Delphi 5
Ctrl + Alt + B Gọi cửa sổ Breakpoint Delphi 5 trở lên
Ctrl + Alt + S Gọi cửa sổ ngăn xếp cuộc gọi Delphi 5 trở lên
Ctrl + Alt + W Gọi cửa sổ đồng hồ Delphi 5 trở lên
Ctrl + Alt + L Gọi cửa sổ Biến cục bộ Delphi 5 trở lên
Ctrl + Alt + T Gọi cửa sổ Chủ đề Delphi 7 trở lên
Ctrl + Alt + F Gọi cửa sổ FPU Delphi 2005 (xóa khỏi Delphi 2006)
Ctrl + Alt + C Gọi cửa sổ CPU Delphi 5 trở lên
Ctrl + Alt + V Gọi cửa sổ Sự kiện Delphi 5 trở lên
Ctrl + Alt + M Gọi cửa sổ Mô-đun Delphi 2005 trở lên
Thay đổi + F12 Gọi cửa sổ Forms Delphi 5 trở lên
Ctrl + Shift + A Gọi thêm vào mệnh đề Add (Sử dụng đơn vị trong Delphi 2006) (Tái cấu trúc) Delphi 2005 trở lên
Ctrl + Shift + F11 Gọi cửa sổ Tùy chọn dự án Delphi 2005 trở lên
Ctrl + F9 Dự án biên dịch Delphi 5 trở lên
Thay đổi + F9 Xây dựng dự án Delphi 2005 trở lên
Thay đổi + F11 Gọi Thêm vào cửa sổ dự án Delphi 5 trở lên
Shift + Ctrl + F9 Chạy mà không cần gỡ lỗi Delphi 2005 trở lên
Ctrl + F Tìm thấy Delphi 3 trở lên
Shift + Ctrl + F Tìm trong tập tin Delphi 3 trở lên
Alt + F7 / F8 Kết quả trước đó / tiếp theo (đối với Tìm trong tệp và Xây dựng thông báo lỗi) Delphi 7 trở lên
Ctrl + K + E Thay đổi một từ thành chữ thường và bỏ chọn Delphi 5 trở lên
Ctrl + K + F Thay đổi một từ thành chữ hoa và bỏ chọn Delphi 5 trở lên
Ctrl + K + O Thay đổi một từ thành chữ thường Delphi 5 trở lên
Ctrl + K + N Thay đổi một từ thành chữ hoa Delphi 5 trở lên
Ctrl + O + U Vỏ kính Delphi 5 trở lên
Ctrl + Shift + K + O Mã gấp gấp giữa bật và tắt Delphi 2006 trở lên
Ctrl + Shift + K + A Mã gấp: Mở rộng tất cả các khối mã Delphi 2006 trở lên
Ctrl + Shift + K + E Mã gấp: Thu gọn khối mã hiện tại Delphi 2006 trở lên
Ctrl + Shift + K + U Mã gấp: Mở rộng khối mã hiện tại Delphi 2006 trở lên
Ctrl + Shift + K + T Mã gấp: Chuyển đổi khối hiện tại (mở rộng và thu gọn)
Ctrl + Shift + K + R Gấp mã: Thu gọn tất cả các vùng {$ area 'bình luận'} .. {$ endregion} Delphi 2006 trở lên
Ctrl + Shift + K + P Mã gấp: Thu gọn thủ tục lồng nhau
Ctrl + Shift + K + M Mã gấp: Thu gọn tất cả các phương thức
Ctrl + Shift + K + C Mã gấp: Thu gọn tất cả các lớp
Ctrl + Shift + K + G Gấp mã: Thu gọn xuống các Nhóm chính [Giao diện / Thực hiện] Delphi 2006 trở lên
Ctrl + Shift + K + N Mã gấp: Thu gọn không gian tên / đơn vị Delphi 2006 trở lên
Ctrl + Tab Chuyển sang tập tin mở tiếp theo trong trình chỉnh sửa Delphi 2006 trở lên
Ctrl + Shift + Tab Chuyển sang tệp đang mở trước đó trong trình chỉnh sửa Delphi 2006 trở lên
Ctrl + K + P Gọi hộp thoại chọn in Delphi 5 trở lên
Ctrl + K + W Gọi khối Ghi vào tệp (văn bản đã chọn) Delphi 5 trở lên
Ctrl + K + R Gọi khối Đọc từ tệp (chèn văn bản vào con trỏ) Delphi 5 trở lên
Ctrl + K + C Bản sao văn bản đã chọn ở cuối phần lựa chọn Delphi 5 trở lên
Ctrl + K + T Chọn từ ở vị trí con trỏ Delphi 5 trở lên
Ctrl + O + C Bật chế độ chọn khối Delphi 5 trở lên
Ctrl + O + L Chọn dòng hiện tại (và tắt chế độ chọn khối) Delphi 5 trở lên
Ctrl + Q + L Chuyển đổi giữa việc giới hạn các phím tắt điều hướng Ctrl + Alt cho lớp hiện tại hoặc giới hạn nó trong đơn vị hiện tại Studio phát triển Borland 2006
Ctrl + Q + W Chuyển đến mục tiếp theo của cửa sổ Tin nhắn Delphi 5 trở lên
Ctrl + F6 Chuyển đổi giữa nguồn (.cpp) và tiêu đề (.h) BDS 2006 trở lên, tính cách C ++ Builder
Alt + Backspace Hủy bỏ
Alt + F10 Hiển thị menu Popup
Alt + Shift + Mũi tên xuống Di chuyển con trỏ xuống một dòng và chọn cột từ bên trái của vị trí con trỏ bắt đầu
Alt + Shift + Kết thúc Chọn cột từ vị trí con trỏ đến cuối dòng hiện tại
Alt + Shift + Trang chủ Chọn cột từ vị trí con trỏ đến đầu dòng hiện tại
Alt + Shift + Mũi tên trái Chọn cột bên trái con trỏ
Alt + Shift + Xuống trang Di chuyển con trỏ xuống một dòng và chọn cột từ bên phải của vị trí con trỏ bắt đầu
Alt + Shift + Lên trang Di chuyển con trỏ lên một màn hình và chọn cột từ bên trái của vị trí con trỏ bắt đầu
Alt + Shift + Mũi tên phải Chọn cột bên phải con trỏ
Alt + Shift + Mũi tên lên Di chuyển con trỏ lên một dòng và chọn cột từ bên trái của vị trí con trỏ bắt đầu
Alt + X Cắt từ dưới con trỏ / khối được chọn hiện tại
Ctrl + C Sao chép từ dưới Con trỏ / khối đã chọn
Ctrl + A Chọn tất cả
Ctrl + Xóa lùi Xóa từ để bắt đầu
Ctrl + D Xóa một khối hiện được chọn
Ctrl + Mũi tên xuống Cuộn xuống một dòng
Ctrl + Kết thúc Di chuyển đến cuối tập tin
Ctrl + F1 Tìm kiếm chủ đề
Ctrl + F10 Mở Menu chính
Ctrl + Trang chủ Di chuyển đến đầu tập tin
Ctrl + H Thay thế hộp thoại
Ctrl + tôi Chèn một ký tự tab
Ctrl + INS Sao chép khối đã chọn
Ctrl + L Tim lân nưa
Ctrl + Mũi tên trái Di chuyển một từ còn lại
Ctrl + M Chèn dòng mới (giống như Enter)
Ctrl + N Chèn dòng mới sau con trỏ (con trỏ vẫn ở dòng hiện tại)
Ctrl + O + A Mở tệp tại con trỏ
Ctrl + O + B Duyệt biểu tượng tại con trỏ
Ctrl + O + O Chèn tùy chọn trình biên dịch và chỉ thị
Ctrl + PGDn Di chuyển xuống dưới cùng của màn hình
Ctrl + PGUp Di chuyển lên trên cùng của màn hình
Ctrl + Q + A Tìm kiếm Thay thế hộp thoại
Ctrl + Q + B Di chuyển con trỏ đến đầu khối
Ctrl + Q + C Di chuyển con trỏ đến cuối tập tin
Ctrl + Q + D Di chuyển con trỏ đến cuối dòng
Ctrl + Q + E Di chuyển con trỏ lên trên cùng của cửa sổ
Ctrl + Q + F Tìm kiếm Tìm hộp thoại
Ctrl + Q + K Di chuyển con trỏ đến cuối khối
Ctrl + Q + P Di chuyển con trỏ đến vị trí trước đó
Ctrl + Q + R Di chuyển con trỏ đến phần đầu của tệp
Ctrl + Q + S Di chuyển con trỏ đến đầu dòng
Ctrl + Q + T Di chuyển con trỏ lên trên cùng của cửa sổ
Ctrl + Q + U Di chuyển con trỏ xuống dưới cùng của cửa sổ
Ctrl + Q + X Di chuyển con trỏ xuống dưới cùng của cửa sổ
Ctrl + Q + Y Xóa đến cuối dòng
Ctrl + R Thay thế hộp thoại
Ctrl + Mũi tên phải Di chuyển một từ đúng
Ctrl + S Tiết kiệm
Ctrl + Shift + S Lưu tất cả
Ctrl + Shift + Kết thúc Chọn từ vị trí con trỏ đến cuối tệp hiện tại
Ctrl + Shift + Trang chủ Chọn từ vị trí con trỏ đến đầu tập tin hiện tại
Ctrl + Shift + Mũi tên trái Chọn từ bên trái của con trỏ
Ctrl + Shift + PGDn Chọn từ vị trí con trỏ đến cuối màn hình
Ctrl + Shift + PGUp Chọn từ vị trí con trỏ đến trên cùng của màn hình
Ctrl + Shift + Mũi tên phải Chọn từ bên phải con trỏ
Ctrl + Shift + Z Làm lại
Ctrl + Mũi tên lên Cuộn lên một dòng
Ctrl + V Dán
Ctrl + Z Hủy bỏ
F1 Hiển thị trợ giúp
F3 Tim lân nưa
Trong Bật / tắt Chế độ
Shift + Mũi tên xuống Di chuyển con trỏ xuống một dòng và chọn từ bên phải của vị trí con trỏ bắt đầu.
Thay đổi + Kết thúc Chọn từ vị trí con trỏ đến cuối dòng hiện tại
Shift + Enter Chèn một dòng mới với lợi nhuận vận chuyển
Shift + Trang chủ Chọn từ vị trí con trỏ đến đầu dòng hiện tại
Shift + Ins Dán từ clipboard
Shift + Mũi tên trái Chọn ký tự bên trái con trỏ
Shift + PGDn Di chuyển con trỏ xuống một dòng và chọn từ bên phải của vị trí con trỏ bắt đầu
Shift + PGUp Di chuyển con trỏ lên một màn hình và chọn từ bên trái của vị trí con trỏ bắt đầu
Shift + Mũi tên phải Chọn ký tự bên phải con trỏ
Shift + Tab Di chuyển con trỏ sang vị trí một tab bên trái
Shift + Mũi tên lên Di chuyển con trỏ lên một dòng và chọn từ bên trái của vị trí con trỏ bắt đầu
Ctrl + Alt + Shift + Kết thúc Chọn cột từ vị trí con trỏ đến cuối tệp hiện tại
Ctrl + Alt + Shift + Trang chủ Chọn cột từ vị trí con trỏ đến đầu tệp hiện tại
Ctrl + Alt + Shift + Mũi tên trái Chọn cột bên trái con trỏ
Ctrl + Alt + Shift + Xuống trang Chọn cột từ vị trí con trỏ lên trên cùng của màn hình
Ctrl + Alt + Shift + Lên trang Chọn cột từ vị trí con trỏ xuống dưới cùng của màn hình
Ctrl + Alt + Shift + Mũi tên phải Chọn cột bên phải con trỏ
AltGr + F12 Chọn tab cửa sổ soạn thảo
F6 hoặc Ctrl +.(Giai đoạn) Thông tin chi tiết IDE
Ctrl + Alt + Shift + P Nguyên mẫu phương thức đồng bộ hóa
Xin lưu ý rằng các phím tắt IDE có thể hoạt động trên các phiên bản trước của Delphi. Sửa danh sách nếu bạn tìm thấy các phím tắt làm việc trong các phiên bản trước.
Bạn có thể thêm các phím tắt của riêng mình với một công cụ miễn phí có tên AutoHotKey , xem ở đó để biết một số ý tưởng.
Một số phím tắt cổ, chẳng hạn như Ctrl + K + K (đánh dấu bắt đầu của khối [liên tục]) vẫn đang hoạt động, có thể được tìm thấy ở đây
Đối với các phiên bản gần đây, Embarcadero đã ghi lại các phím tắt mặc định trong DocWiki của họ.
Em thì có được học hành trường lớp nào về lập trình đâu .... chủ yếu học từ GPE và internet .... nên câu từ và thuật ngữ chuyên ngành nhiều khi phát biểu linh tinh đó Anh .... Có gì khó khăn Em hỏi mong Anh chỉ cho Em học với
Em thì có được học hành trường lớp nào về lập trình đâu .... chủ yếu học từ GPE và internet .... nên câu từ và thuật ngữ chuyên ngành nhiều khi phát biểu linh tinh đó Anh
Cái đó mạnh biết chút ít xài tạm ok rồi .... xếp ngăn kéo ròi ko thích nữa chơi cái khác nó mới vui
Mạnh là thế chỉ thích vác quốc đi khai hoang thui ... xong xếp ngăn kéo ??!!!
Coi lại mấy bài trước Anh batman1 keo Mạnh cứ vọc cái mảng hoài sao ko nghiên cứu Redim Array đi thì Mạnh vọc có mấy ngày coi xong phim
Cái Thự Viện Delphi động kia Mạnh Viết tạm OK .... Nay Mò qua cái Mới xem sao ... Khổ thật quanh năm cứ đi mò Code View attachment 212085
Bài đã được tự động gộp:
Cái đó mạnh biết chút ít xài tạm ok rồi .... xếp ngăn kéo ròi ko thích nữa chơi cái khác nó mới vui
Mạnh là thế chỉ thích vác quốc đi khai hoang thui ... xong xếp ngăn kéo ??!!!
Coi lại mấy bài trước Anh batman1 keo Mạnh cứ vọc cái mảng hoài sao ko nghiên cứu Redim Array đi thì Mạnh vọc có mấy ngày coi xong phim
ActiveX có 2 loại. ActiveX DLL và ActiveX Control. Cả hai loại này viết đều rất khó, đặc biệt ActiveX Control (BSAC mà tôi viết để làm giao diện trên Userform là loại này).
ActiveX DLL khác với DLL bài 1 ở chỗ, nó dùng để tạo Class là chính. Bộ thư viện mà mọi người hay dùng là ADO, FSO chính là AcriveX DLL (các bạn hay dùng CreateObject("Tên Class") - Tên Class trong hàm đó chính là phải tạo trong ActiveX DLL. Loại ActiveX DLL mang sang bất kỳ máy tính nào đề phải REGSVR32 hết - Đây là nguyên tắc của Windows.
Để học và làm được ActiveX cần có hiểu biết sâu về hệ thống, cần nhiều thời gian học lắm. Nó khó hơn DLL chuẩn ở bài 1 rất nhiều.
ActiveX có 2 loại. ActiveX DLL và ActiveX Control. Cả hai loại này viết đều rất khó, đặc biệt ActiveX Control (BSAC mà tôi viết để làm giao diện trên Userform là loại này).
ActiveX DLL khác với DLL bài 1 ở chỗ, nó dùng để tạo Class là chính. Bộ thư viện mà mọi người hay dùng là ADO, FSO chính là AcriveX DLL (các bạn hay dùng CreateObject("Tên Class") - Tên Class trong hàm đó chính là phải tạo trong ActiveX DLL. Loại ActiveX DLL mang sang bất kỳ máy tính nào đề phải REGSVR32 hết - Đây là nguyên tắc của Windows.
Để học và làm được ActiveX cần có hiểu biết sâu về hệ thống, cần nhiều thời gian học lắm. Nó khó hơn DLL chuẩn ở bài 1 rất nhiều.
Cho mạnh hỏi thêm chút là tại sao người ta ko viết DLL như bài 1 đi cho tiện mà phải viết thêm ActiveX DLL chi cho nó mất công ra
Phải chăng nó có cái khác biệt với bài 1 nên bắt buột phải viết ActiveX DLL
Thì mới tốt cho mục đích của người viết
Cho mạnh hỏi thêm chút là tại sao người ta ko viết DLL như bài 1 đi cho tiện mà phải viết thêm ActiveX DLL chi cho nó mất công ra
Phải chăng nó có cái khác biệt với bài 1 nên bắt buột phải viết ActiveX DLL
Thì mới tốt cho mục đích của người viết
Hai công nghệ khác nhau. DLL như bài 1 là cách viết API, các thư viện của Windows phần lớn là loại này như User32.dll, Kernerl32.dll, gdi32.dll,... Loại DLL này dùng để xử lý tác vụ, thọc và xử lý các chức nang tạm nghĩ như là độc lập.
ActiveX DLL là làm việc theo Object, nó dùng công nghệ COM để giao tiếp. Công nghệ COM chỉ có trong Windows, anh Bill yêu cầu rất rắc rối, phải được quản lý trong Registry vì thế mới phải đăng ký bằng lệnh Regsvr32. Loại ActiveX DLL là nền tảng kiến thức và cách giao tiếp đối tượng nên mới có hai loại như vậy. Ý kiến cá nhân của tôi thì anh Bill tạo COM là hay nhưng quản lý với Registry lại là lắm phiền phức, thôi lịch sử là vậy.
thì ra là vậy đang mò cái group gống Atools ............ tự làm khổ mình thế hả
đam mê là thế .... nhiều khi Mạnh cố làm 1 cái gì đó mà khó quá là nó cứ văng ra .... xong bỏ kệ bà nó ... nhưng lâu lâu ngó một tẹo
Rồi một ngày kia .... hóa ra mày cũng thường thôi thì ra mày là vầy
Khi quá trình tích lũy về lượng đạt đến 1 điểm giới hạn thì chất sẻ thay đổi vậy ???!!! lúc đó mới nhìn ra vấn đề của nó
Rảnh lại nghiên cứu học lý thuyết Delphi từng bước một (viết code trước học lý thuyết sau ??)
Các Bạn cho Mình hỏi chút
1/ Mình thấy trong Delphi nó nói tới trình biên dịch C++ ... vậy là những ai đã từng học C++ thì có thể viết C++ trên Delphi hay sao ??
2/ Nếu mục 1 sai vậy họ nêu C++ trong Delphi có ý nghĩa gì
https://www.embarcadero.com/products/rad-studio/whats-new-in-10-3-rio
3/ Mạnh thấy nó là 1 công cụ mạnh mẻ viết 1 code duy nhất chạy đa nền tảng lớn của thế giới nên có thời giản rảnh học hỏi từng bước 1
không phải nặng đầu suy nghĩ học nhiều ngôn ngữ khác nhau khi viết cho di động code khác ... máy tính code khác , macOS, iOS, Android và Linux ............. mệt lắm ( tập chung nghiên cứu, học Delphi là ok nhất ) https://www.embarcadero.com/products/delphi
Lâu nay bận quá ko có thời gian học code Delphi ...
Nay Úp bài nhờ các bạn chuyển dùm code sau sang Delphi Mình với... đang lóng ngóng ko biết viết trên Delphi Sao !!!???
Mình muốn lưu cái chuỗi Kieu Van Manh vào file SD.dat
Code trên VBA như sau:
Mã:
Public Sub GetStr(ByVal sFile As String, ByVal St As String)
Dim TG As Integer, VT As Integer
TG = Len(St)
Open sFile For Random As #1 Len = 2
Put #1, 1, TG
For VT = 1 To TG
Put #1, VT + 1, 9911 + AscW(Mid(St, VT, 1))
Next
Close
End Sub
Rem ============
Sub Main_GetStr()
Dim sFile As String
sFile = ThisWorkbook.Path & "\SD.dat"
Call GetStr(sFile, "Kieu Van Manh")
End Sub
Lâu nay bận quá ko có thời gian học code Delphi ...
Nay Úp bài nhờ các bạn chuyển dùm code sau sang Delphi Mình với... đang lóng ngóng ko biết viết trên Delphi Sao !!!???
Mình muốn lưu cái chuỗi Kieu Van Manh vào file SD.dat
Code trên VBA như sau:
Mã:
Public Sub GetStr(ByVal sFile As String, ByVal St As String)
Dim TG As Integer, VT As Integer
TG = Len(St)
Open sFile For Random As #1 Len = 2
Put #1, 1, TG
For VT = 1 To TG
Put #1, VT + 1, 9911 + AscW(Mid(St, VT, 1))
Next
Close
End Sub
Rem ============
Sub Main_GetStr()
Dim sFile As String
sFile = ThisWorkbook.Path & "\SD.dat"
Call GetStr(sFile, "Kieu Van Manh")
End Sub
Delphi là IDE môi trường lập trình và thiết kế ứng dụng nhanh, các mã lập trình được một Compiler biên dịch ra mã máy (các nền tảng). Vậy hiểu IDE mà môi trường thiết kế và biên tập code, còn đống code đó được Compiler biên dịch ra mã máy. Compiler của Delphi được viết bằng C++ và Assempler. Người lập trình Delphi không cần biết đến ngôn ngữ C++, chỉ cần Object Pascal.
Trong bộ RAD Studio có 2 IDE là Delphi và C++ Builder, cái C++ Builder này dành cho người biết ngô ngữ C++ lập trình trên đó và cũng xây dựng các phần mềm như làm với Delphi. Delphi cho phép nhúng Assempler vào nhưng C++ thì không. Tuy nhiên có cách người ta hay làm là nếu cần thì viết mã lệnh bên C++ rồi compiler ra OBJ, bên Delphi có thể link tới các file OBJ này để khai thác các hàm và thủ tục, và biên dịch ra mã máy cuối cùng.
Nhân đây khoe các bạn năm 1997 tôi đã viết game đầu tay bằng Pascal (viết theo hướng đối tượng với Object Pascal).
Thời xa xưa chỉ bằng Pascal for DOS người ta đã có thể tạo các kiểu phần mềm mặc dù khó khăn thì bây giờ Delphi hiện đại thì làm được rất rất nhiều thứ, chỉ lo không đủ thời gian trải nghiệm. Ai biết ngôn ngữ Pascal là một lợi thế khi học Delphi. Tuy nhiên đù chưa từng biết Object Pascal thì vẫn học đc không khó lắm + nguồn tư liệu trên internet bây giờ rất phòng phú.
Lâu nay bận quá ko có thời gian học code Delphi ...
Nay Úp bài nhờ các bạn chuyển dùm code sau sang Delphi Mình với... đang lóng ngóng ko biết viết trên Delphi Sao !!!???
Mình muốn lưu cái chuỗi Kieu Van Manh vào file SD.dat
Code trên VBA như sau:
Mã:
Public Sub GetStr(ByVal sFile As String, ByVal St As String)
Dim TG As Integer, VT As Integer
TG = Len(St)
Open sFile For Random As #1 Len = 2
Put #1, 1, TG
For VT = 1 To TG
Put #1, VT + 1, 9911 + AscW(Mid(St, VT, 1))
Next
Close
End Sub
Rem ============
Sub Main_GetStr()
Dim sFile As String
sFile = ThisWorkbook.Path & "\SD.dat"
Call GetStr(sFile, "Kieu Van Manh")
End Sub
Lâu nay bận quá ko có thời gian học code Delphi ...
Nay Úp bài nhờ các bạn chuyển dùm code sau sang Delphi Mình với... đang lóng ngóng ko biết viết trên Delphi Sao !!!???
Mình muốn lưu cái chuỗi Kieu Van Manh vào file SD.dat
Bạn không nói rõ ý tưởng nên khó cho người khác.
Bạn có thể gói ảnh, chuỗi, các Form (dialog) với Combobox, ListBox, TextBox ..., dữ liệu nhị phân ... trong "ruột" tập tin EXE. Cần soạn tập tin RC (R là Resources, C hình như là Compiled). Khi lấy ra thì dùng các hàm của Delphi (thay bạn gọi các hàm API) hoặc trực tiếp gọi API.
--------
Tôi hiện có khả năng rất hạn chế. Tôi đang ở Việt Nam nên thời gian không có nhiều, và "công cụ" không có
ý Em là mã hóa chuỗi Kieu Van Manh đó vào File SD.dat đó anh
Nếu chuyển được code đó qua Delphi ... thì Em sẻ suy nghĩ từ code đó Viết thêm cái Hàm Tạm keo là Dk kiểm tra cái chuỗi đó nếu là True Hay False cũng là code Delphi
Anh coi viết dùm Em với để em học thêm cách viết nhị phân trên Delphi
VD như hàm sau:
Mã:
Public Function Dk() As Boolean
Dim St As String, TG As Integer
Dim DoDai As Integer, VT As Integer
Dim KeyFile As String: KeyFile = GetKeyFile()
Open KeyFile For Random As #10 Len = 2
Get #10, 1, DoDai
St = ""
For VT = 1 To DoDai
Get #10, VT + 1, TG
St = St & ChrW(TG - 9911)
Next
Close #10
If St = GetBoardSerial Then Dk = True Else Dk = False
End Function
ý Em là mã hóa chuỗi Kieu Van Manh đó vào File SD.dat đó anh
Nếu chuyển được code đó qua Delphi ... thì Em sẻ suy nghĩ từ code đó Viết thêm cái Hàm Tạm keo là Dk kiểm tra cái chuỗi đó nếu là True Hay False cũng là code Delphi
Anh coi viết dùm Em với để em học thêm cách viết nhị phân trên Delphi
VD như hàm sau:
Mã:
Public Function Dk() As Boolean
Dim St As String, TG As Integer
Dim DoDai As Integer, VT As Integer
Dim KeyFile As String: KeyFile = GetKeyFile()
Open KeyFile For Random As #10 Len = 2
Get #10, 1, DoDai
St = ""
For VT = 1 To DoDai
Get #10, VT + 1, TG
St = St & ChrW(TG - 9911)
Next
Close #10
If St = GetBoardSerial Then Dk = True Else Dk = False
End Function
Description
Writes one or more records from a variable to an open file.
Warning: This is an older method that is particularly dangerous to use because of the untyped parameter, leading to potential memory corruption. The record size used by BlockWrite and BlockRead is governed by the optional 2nd parameter to the Reset or Rewrite calls used to open the file being written. It is preferable to use streams in your applications. For example, a user procedure involving a stream can use both TMemoryStreamsas well as TFileStreams, instead of being limited to using files as happens with these older routines.
F is an untyped file variable, Buf is any variable, Count is an expression of type Integer, and Result is an optional variable of type Integer.
BlockWrite writes Count or fewer records to the file F from memory, starting at the first byte occupied by Buf. The actual number of complete records written (less than or equal to Count) is returned in Result.
The entire block transferred occupies at most Count*RecSize bytes. RecSize is the record size specified when the file was opened (or 128 if the record size was unspecified).
If the entire block is transferred, Result is equal to Count on return.
If Result is less than Count, the disk became full before the transfer was complete. In this case, if the file's record size is greater than 1, Result returns the number of complete records written.
BlockWrite advances the current file position by Result records.
If Result is not specified, an I/O error occurs if the number written is not equal to Count. If the {$I+} compiler directive is in effect, errors raise an EInOutError exception.
Bắt chước nổ theo.
Mình thì biết đến Delphi có lẽ trước tất cả mọi người trong diễn đàn này - bảo đảm luôn. Mình học về cái này hơn 40 năm về trước. Trong môn Thần Thoại và Triết Lý Cổ Điển Hy Lạp.
Thật mà, không nổ đâu, mình là trong số ít những người đầu tiên ở VN ta làm với Delphi từ bản đầu tiên: Delphi 1.0, 16bit, thời Windows 3.x.
Hồi đó có 1 cty ở SG, tên gì quên rồi, là nhà phân phối của Borland, nhập Delphi về.
Lúc đó Internet chỉ mới vào VN, chưa phổ biến, search tìm cái gì cũng không có. Chỉ có nguồn tham khảo là thư mục Source của Delphi.
Làm app 16bit lúc đó trên Win3.x 16bit cực lắm, mấy vấn đề về memory, resource không dồi dào, dễ dàng như 32bit, 64bit như bây giờ.
Sau lên dần tới Delphi 7, rồi từ sau đó hầu như mình không còn dùng Delphi nữa.
Tôi cũng thật mà. Sở trường của tôi là Văn (Hoá) và Triết chứ không phải khoa học tự nhiên. Tôi chuyên nghiên cứu Văn cổ Tây phương những năm cuối thập niên 70's
Lúc tôi bắt đầu làm việc với máy tính thì khỏi nói chuyện net mất công. Toàn là máy mainframe và midi thôi.
Làm app 16bit lúc đó trên Win3.x 16bit cực lắm, mấy vấn đề về memory, resource không dồi dào
Vậy mà đã than. Ứng dụng tôi chạy trên PDP11/70; 32K word (*) memory; hệ điều hành chiếm 16K; chỉ còn 16K để chương trình chạy. Kỹ thuật map memory và chạy background program là bắt buọc phải học.
(*) 1 word của máy PDP11 là 2 bytes, tức là 16 bits.
Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
em chào thầy! lời đầu chúc thầy sức khỏe.
code vba em chưa tới đâu cả! giờ lại tò mò qua delphi! chả là có làm theo "cờ líp" thầy hướng dẫn. và kết quả ra sai thầy ạ. mong thầy chỉ giúp em sai chỗ nào? em thử gửi code cho bạn dùng office 32 bit thì chạy ổn! còn em dùng 64bit lại ra kết quả sai.
lúc đóng excel nó lại hiện ra bảng này nữa
ps: File excel em để trong Win32 với Win64 luôn thầy ạ. link googledrive
Wow, làm cái gì mà tới tràn stack dữ vậy ?
Xem qua code của cậu rồi, phần code VBA cậu declare sai rồi. LoadLibrary trả về LongPtr cho VBA7, FreeLibrary nhận vào LongPtr.
Và 2 hàm LoadDLL và FreeDLL cũng phải viết lại.
Scopic Software is seeking a Remote Delphi Developer to join our team of 250+ professionals across 40 countries. The successful applicant will work with a team of talented developers, designers, and project managers to develop industry-leading applications with the latest technologies...
Mạnh mới test lại các kiểu thì thấy hàm đó viết lộn một chút Mạnh điều chỉnh lại như sau mới chạy OK khi ta sử dụng ADO lấy dữ liệu từ 1 Sheet vào Mảng sử dung Phức thức GetRows ... xong dùng hàm chuyển mảng gán lên Range
Mã:
function TransArr(ssArr: OleVariant): OleVariant; stdcall;
var
tmpArr : OleVariant;
x, y : integer;
lcol,lRows : integer;
begin
lcol := VarArrayHighBound(ssArr, 2); //Cot
lRows := VarArrayHighBound(ssArr, 1); //dong
tmpArr := VarArrayCreate([1, lcol + 1, 1, lRows + 1],varVariant);
for x:= 0 to lcol do begin
for y:= 0 to lRows do begin
tmpArr[x + 1, y + 1] := ssArr[y, x];
end; // y
end; // x
Result := tmpArr;
end;
Mô tả sơ bộ 1 chút
1/ Nếu ta ko + thêm 1 trong hàm thì khi lấy lên ta phải cộng thêm 1 khi Resize
Khổ ghê, cứ réo tui là sao trời. Đã không muốn đụng tới Delphi của cậu nữa mà cứ kêu "nà nàm thao".
1. Coding style này tui không chấp nhận. Nhìn code đã không muốn đọc rồi. Cậu search "Borland Coding Style Guide" về đọc và làm theo đi. Hay mở source của Delphi ra đọc, xem style của họ ra sao. Ai nói cậu cái begin phải để cùng dòng if, for vậy ? Tab space là bao nhiêu, 4 hay 2 ? Dùng spaces hay Tab char ?
2. Delphi IDE cậu dùng còn chưa rành, quăng cho cậu cái link để cậu chỉ download component về Browse Folders xài, chỉ install rồi dùng thôi mà cậu còn không biết làm, làm biếng làm nữa thì tui thua thiệt luôn. Học, mò cách dùng IDE đi đã.
3. Pascal và Object Pascal cậu đã nắm rõ chưa, ví dụ class, kế thừa, virtual, overwrite. Còn 1 đống sau này của các Delphi mới như interface, template... nữa, cậu nắm chưa ?.
Đọc các bài post của cậu tui thấy ngôn ngữ Pascal và các hàm, procedure của Pascal thôi, như Assign, BlockRead, BlockWrite... thôi cậu đã nắm không vững. Cậu học lại căn bản, từ từ, từ Pascal lên Object Pascal, cách dùng string, Pointer, PChar, File I/O.... Dùng Delphi, lập trình Windows mà không biết dùng Pointer, PChar thì thua luôn.
Nội cái RTL/VCL của Delphi thôi, khổng khổng lồ, cậu nắm, dùng được thôi đã là kỳ công rồi đó, không cần đi đâu xa tìm kiếm
4. Cơ chế exception handing của Delphi cậu nắm chưa: try/finally/except/raise... đó. Mấy cái code kia, vd như ssArr không phải là array thì nó sẽ quăng exception cái đùng vào mặt cậu đấy, văng liền. Học cái này đi.
5. Dùng cái gì có sẳn của Delphi hay bất kể cái nào của các ngôn ngữ khác, đều có cái giá của nó. VD code trên OleVariant, mấy hàm VarArrayxxx. Cậu build code với "Using debug dcu", debug vào các hàm này xem nó làm ra sao.
....
Còn nhiều nữa, tui là người lười viết, ít nói nữa. Nhưng tóm "nại nà thế lày": cậu xây cái nhà mà ai quăng cho cậu cái gì cậu cũng quơ đại vào xài là không ổn. Bất kể vật liệu đó xẩu dỏm, bug biếc ra sao. Thế cái nhà của cậu có bền,đẹp, có gốc không ? Cho nên tôi luôn nói cậu là học bò trước rồi mới học chạy, rồi mới tính chuyện xây nhà bán. Tôi thấy cậu không có tính mày mò, tự tìm hiểu, cứ lấy đại code người khác về ráp vô xài đại.
Tôi cá là tới bây giờ, các tính năng debug của Delphi IDE cậu nắm còn chưa hết đó, nói chi tới mức debug trên mã chay Assembly.
Cái nào VBA không làm được thì mới làm bằng Delphi, còn VBA làm được thì dùng VBA, như mấy Scripting, Files, Folders, Dictionary đó. Cậu code chưa chắc đã sinh code tốt hơn dùng trực tiếp trên VBA, rồi phải gánh thêm 1 tầng từ VBA qua Delphi DLL của cậu, rồi mới tới mấy cái Dll đó. Chi cho khổ vậy, nặng thêm, chậm thêm.
Vài lời "ngu ý", khó nghe thì bỏ qua, kkk
Nếu cậu chỉ muốn quơ quào để làm cho có, cho xong cái VBLibrary.dll "tả pín lù" của cậu thì bỏ qua còm men của tôi. Còn nếu cậu thực tâm muốn học, làm bài bản, có gốc thì tạm thời dẹp cái Dll đó đi, sau này đụng lại. Học A-Z đã.
Tui cũng từ Turbo Pascal, lên Borland Pascal, rồi Borland Pascal for Windows, rồi mới tới Delphi. Debug code build release mode trong cửa sổ CPU Assembly là thường.
Thần tượng của tui là cha đẻ Delphi đó, sau qua làm cho MS, F# đó. Chỉ cần đọc mã hex chứ chưa nói tới mã Assembly, mà tìm ra chổ sai đúng 1 byte của Delphi Compiler. Quá kinh.
KHỔ lắm nếu ko nói vậy thì làm sao học được cái khả năng của người khác và làm sao biết trong bụng ai đó có một mớ giun ta ?! khi ta ko qua trường lớp học mò học mót
Tui cũng dân tự học đó, có trường lớp đâu. Bằng ĐH đầu tiên của tui là Tự động mà, sau ra trường, nhờ tự học mà cty họ thấy khả năng, đam mê của tui họ mới tuyển đấy chứ.
Còn sau này là lãnh vực "rờ chxx em", "phò rên siết", "tìm lỗ", "sờ cu rờ ti"..., tui cũng tự học đó, hồi đó có ai biết gì về nó đâu, sách nước ngoài cũng không có. Giờ thì VN ta mấy năm gần đây mới mở, có nhu cầu về nó.
Hì hì, nói bậy vậy mấy bác không hiểu, nó thuộc lãnh vực An Ninh Mạng, An Toàn Thông Tin đó
Tự học sẽ chắc, nhớ dai, nhớ lâu. Cậu tin vậy đi.
Hỏi cậu cái này, mấy cái hàm trong VBLibrary.dll của cậu đó, cậu làm sao debug vào từng hàm, vào code Delphi của cậu được, từ Excel -> VBA -> Code của cậu ? Cậu đã làm được chưa ???
Tui cũng dân tự học đó, có trường lớp đâu. Bằng ĐH đầu tiên của tui là Tự động mà, sau ra trường, nhờ tự học mà cty họ thấy khả năng, đam mê của tui họ mới tuyển đấy chứ.
Còn sau này là lãnh vực "rờ chxx em", "phò rên siết", "tìm lỗ", "sờ cu rờ ti"..., tui cũng tự học đó, hồi đó có ai biết gì về nó đâu, sách nước ngoài cũng không có. Giờ thì VN ta mấy năm gần đây mới mở, có nhu cầu về nó.
Hì hì, nói bậy vậy mấy bác không hiểu, nó thuộc lãnh vực An Ninh Mạng, An Toàn Thông Tin đó
Tự học sẽ chắc, nhớ dai, nhớ lâu. Cậu tin vậy đi.
Hỏi cậu cái này, mấy cái hàm trong VBLibrary.dll của cậu đó, cậu làm sao debug vào từng hàm, vào code Delphi của cậu được, từ Excel -> VBA -> Code của cậu ? Cậu đã làm được chưa ???
Có cái thấy được có cái ko có cái đang làm rở ... nói chung nó như cái mớ bòng bong ấy
Nhưng kinh nghiệm tự mò cho mạnh thấy khi vượt qua cái mớ bòng bong đó là mạnh viết code tạm ok và code sẻ cải tiến theo theo thời gian
hôm nay viết vầy thấy ok rồi mừng hết lớn.... sau một năm sau nhìn lại code đó thấy ngớ ngẫn và mắc cười ... vậy là thấy mình lớn thêm một tẹo
đại khái thế .... code két với Mạnh mê như mê game vậy thôi thích cái gì mò cái đó các kiểu. ngoài ra ko mưu cầu gì khác !
Lập trình DLL chỉ trong phạm vi xử lý dữ liệu và tính toán của mình thôi thì dễ như video bài đầu tiên. Còn làm DLL để can thiệp vào Windows API là không đơn giản với bất kỳ ai. Nhiều người thành thạo code VBA (trong phạm vi Excel) nhưng đụng vào các hàm Windows API, DLL thì tắt tiện vì còn không hiểu 32, 64-bit, lập trình nhúng activex,.... khác nhau cái gì. Cũng như vậy, người rất rành về Delphi có thể lập trình kết nối SQL Server làm phần mềm bán hàng này nọ cũng chưa chắc đã tinh thông Windows API để làm chủ nó. Vì nó là một nền tảng lập trình riêng phải hiểu để tích hợp. Vậy nếu ai mà quen cách học VBA kiểu như mò mẫm, thì đừng có đụng vào mấy thứ API của Windows nếu chưa học tốt Pascal, Object Pascal. Delphi không phải công cụ dành cho dân lầm ẩu, học ẩu đâu. Nếu muốn học Delphi tốt (có thể không phải đích là chuyên gia) thì vẫn cần phải học ngôn ngữ Object Pascal trước đã. Làm tốt cái Delphi đã hỗ trợ như VCL rồi hẵng đụng tới kiến thức khác.
Thấy bạn Mạnh thường xin source, thế mạn phép tui hỏi cái này: Khi bạn cài Delphi xong, từ đó tới giờ, bạn có vào thư mục đó lục lọi từng thư mục con, từng file .exe, .pas, ví dụ, demos, help file... tất tần tật không ? Xem nó là cái gì, bên trong file là gì chưa, có compile, chạy thử các ví dụ chưa ?
Vãi thế .... bói banh ta lông hết ròi ..... nhưng cái biết cái ko túm lại là Tịt ............ xin để học ko biết thì hỏi ko có chi phải xí hổ cả ... chỉ dấu dốt ko dám hỏi ko dám xin mới thật sự xí hổ thui !!!!!!!!!!!????????????????????
OK, thư mục Demos hay Examples gì đó vào chưa ?
Thư mục Source là 1 thư mục khổng lồ rồi đó, tìm đâu cho xa.
Cậu chụp cho mình thư mục RTL thử. Mấy thư mục trên hình mà cậu nhảy vào là tẩu hỏa nhập ma đấy.
Vãi thế .... bói banh ta lông hết ròi ..... nhưng cái biết cái ko túm lại là Tịt ............ xin để học ko biết thì hỏi ko có chi phải xí hổ cả ... chỉ dấu dốt ko dám hỏi ko dám xin mới thật sự xí hổ thui !!!!!!!!!!!????????????????????
...
Nếu đến giờ này mà bạn cũng còn tịt thì nói trắng ra, bạn giống tôi.
Mình mò hoài không ra thì cứ việc làm bộ như không cần phải biết, cứ hỏi mấy người mò nhiều rồi và nhờ họ chỉ cho. Ai gáy kệ họ, mình có code là được rồi.
Châm ngôn của tôi:
If you dont know the wheel, just shrug your shoulders and say "who wants to reinvent the wheel?"
Nếu đến giờ này mà bạn cũng còn tịt thì nói trắng ra, bạn giống tôi.
Mình mò hoài không ra thì cứ việc làm bộ như không cần phải biết, cứ hỏi mấy người mò nhiều rồi và nhờ họ chỉ cho. Ai gáy kệ họ, mình có code là được rồi.
Châm ngôn của tôi:
If you dont know the wheel, just shrug your shoulders and say "who wants to reinvent the wheel?"
OK, thư mục Demos hay Examples gì đó vào chưa ?
Thư mục Source là 1 thư mục khổng lồ rồi đó, tìm đâu cho xa.
Cậu chụp cho mình thư mục RTL thử. Mấy thư mục trên hình mà cậu nhảy vào là tẩu hỏa nhập ma đấy.
OK rồi bạn, giờ bạn chỉ có việc là khi nào rãnh thì gác chân lên bàn, vô thư mục này đọc từng file 1 thôi. Chỗ nào không hiểu thì bỏ qua, sau này đọc lại. Đọc xem gồm có các hàm/procedure/class gì, nó được code ra sao, làm gì...
Ưu tiên các file sau:
1. SysInit.pas: file này khó nhai nhất, core của Delphi và C++Builder app đó.
2. System.pas: chứa các function/procedure của Pascal truyền thống và new Delphi. Nên đọc kỹ, chừng nào thuộc thôi
3. SysUtils.pas: nên đọc, nắm hết các function/procedures trong này.
Cậu rành hết 3 file này thôi thì đủ code như ý rồi, không còn hỏi kiểu QuoteStr là gì nữa
Mấy file nào mà có Exc hay Exception hay Unwind thì hơi khó nhai với bạn, nó liên quan đến cơ chế exception handling của Windows và implement của Delphi. Giờ tui đọc lại cũng còn lùng bùng đó. Bỏ qua.
Sharemem.pas, SimpleShareMem.pas cũng vậy, khó nhai và khó hiểu được, liên quan đến quản lý memory của Windows và Delphi.
StrHlpr: string helper: nên đọc. Cùng với SysConst và Types.
Cũng nên lướt qua các file .inc. Nó cũng là code Pascal thôi, được include vào.
Làm với Excel và kiểu Variant thì phải, bắt buộc phải đọc kỹ các file này: VarHlpr.pas, Variants.pas và VarUtils.pas
Mấy hàm có inline/builtin assembler thì bỏ qua việc hiểu, chỉ cần nắm cách dùng, mấy hàm về PChar đó, StrPos, StrLen...
Muốn test hàm thì chỉ nên new app console thôi, uses rồi code gọi hàm thắc mắc để test. Tập debug trong IDE đi. Hổ trợ debug trong IDE của Delphi gấp mấy chục lần VB/VBA đấy. Nắm rành nó thôi thì sau này sẽ không sợ bug nào.
Mã:
program Test;
{$APPTYPE CONSOLE}
uses
....xxx, yyy, zzz;
begin
ReadLn...
WriteLn...
end.
Xong rồi, sau này, thì hảy qua thư mục win, net, các thư mục con của các platform khác. Xong RTL rồi thì nhảy qua VCL, Data...
Nhiêu đây thôi đủ cho cậu nổ não rồi, ở đó mà còn lang thang tìm code. Học được cách code của Borland coders luôn. Guru không đó.
Hồi xưa tui cũng học trong này. Khi nào cậu hiểu sơ sơ được kiểu string trong Delphi là gì, tổ chức trong memory như thế nào, các hàm internal thao tác nó ra sao, cậu sẽ dần dần bỏ, nhảy qua PChar. Vậy là gần tới C rồi đó. string trong Delphi từa tựa như string(BSTR) của VB/VBA.
Chúc học tốt.
PS:À quên, còn 1 mớ file trong thư mục Win nữa, như Classes, TypeInfo, RTTI... cậu úp hình lên luôn đi. Mấy file nào có chữ Type trong đó thì nên đọc sau này để hiểu cách Delph/C++Builder tổ chức, quản lý các object, đối tượng, types...ra sao. Sau này có học "rờ chim em" gặp Delphi app hay mèo nào viết = Delphi thì sẽ dễ hiểu hơn.
Từ Delphi 1 tới giờ, vẫn các file đó. Nó chỉ mở rộng và bổ sung thêm. Thêm 1 mớ file về generic, template cho new Delphi Language sau này nữa.
thật ra đã lục coi hết ngõ hẻn của nó lâu rồi nhưng cái biết cái không .... xong cái đầu nó u lên mấy cục đó .... vãi lắm
và khi rảnh còn bới cả windows của Bill nữa đó + office tò mò hay thích cái chi là quậy cái đó
Đã nói đừng nhảy vào file getmem.inc mà, nhảy vào đó có hiểu gì đâu.
Thôi bỏ qua thư mục win này đi. Đa số files nó là port từ Windows SDK C/C++ header files qua thôi, cũng không có gì coi đâu. Tò mò thì coi thử.
Cậu tìm thêm file Classes.pas, coi file này thôi. Chắc nó nằm trong thư mục common.
Và nhớ xem các file trong thư mục sys trên.
Xong rồi, giờ cậu tìm và chụp cho tui xem 2 hàm sau trong unit nào,được code ra sao: VarArrayHighBound và VarArrayCreate.
Khi nào mà cậu không cần dùng Delphi IDE nữa, soạn code = Notepad hay Notepad++ cậu đang xài đó, ra ngoài command line compile = dcc32 hay dcc64 thì cậu tương đối rành Delphi rồi đó.
tìm hoài ko thấy: VarArrayHighBound và VarArrayCreate.
Ctrl +F hoài ko ra ??!!! ko biết nó nằm chỗ nào ??
Lâu lâu thấy có cái hàm rất hay ... coi diết hiểu thêm cách nó code If then ... For ... nói chung hay hay
Mã:
function IsBinary(const Input: TStream; const Signatures: array of TBinarySignature): Boolean;
var
I: Integer;
Signature: Integer;
Pos: Integer;
begin
Pos := Input.Position;
for I := Low(Signatures) to High(Signatures) do
begin
Signature := 0;
Input.Read(Signature, Min(Signatures[I].SignatureLength, SizeOf(Signature)));
Input.Position := Pos;
if Signature = Signatures[I].BinarySignature then
Exit(True);
end;
Result := False;
end;
Khổ ghê, nó nằm trong mấy file VarXXX.pas, trong thư mục sys đó.
À, nay Delphi có thêm vụ Exit(True) nữa ta, nó tương đương:
Mã:
Result := True;
Exit;
Viết vầy ngắn gọn hơn.
Mấy cái TStream, Txxx trong unit Classes, cậu từ từ ngâm cú sau, giờ tập trung vào thư mục RTL\sys đi. Chừng nào cậu nắm được Object Pascal, phần class rồi quay lại.
Biết tại sao Mạnh lại ôn lại cái mảng Delphi này ko !?:
1/ từ VBA Excel thì mảng nó đóng vai trò rất quan trọng và cho tốc độ nhanh hơn duyệt trên Cells
2/ Khi mạnh lấy dữ liệu Từ Access lên hay Server hầu hết lấy lên mảng tính toán xong làm linh tinh
3/ khi mạnh viết qua VB6 thì nó cũng thế
4/ cách đây mấy năm có vọc VB.net thì nó cũng thế
5/ giờ qua Delphi thì cái mảng nó cũng thế
.....
Vì abcxyz như thế cho nên Mạnh mong muốn học thật kỹ cái mảng Delphi các kiểu xem sao để mà vận dụng là thế ??!!!
Nói chung cái mảng theo ngu ý của Mạnh thì bất cứ tay coder nào cũng phải học thật thuần thục nó các kiểu ... xong vận dụng nó
Đao to búa lớn để sau đi, cậu vào xem 2 cái hàm đó nó viết ra sao chưa ?
1. Nó dùng API gì ?
2. Kiểu dữ liệu VARIANT trên Windows API C/C++ trong Delphi là kiểu gì ?
3. Cậu có thể viết lại 2 hàm đó bằng Delphi, thuần API không ?
Cậu quăng cái code ra, hỏi tôi có cách viết tốt hơn không, thì tới giờ, tôi đã chỉ xong cho cậu cách viết khác đấy. Pure API và sát ở dưới.
Xong....
Hì hì, à, mà còn cách khác tốt hơn nữa, sâu hơn nữa, mà cậu chưa làm được đâu. Đó là dùng kỹ thuật "rờ em" để đảo ngược hàm API, viết lại = Delphi của cậu, bỏ đi các cái râu ria, không cần thiết. Vd hàm API SafeArrayCreate nằm trong oleaut32.dll của Windows, source của nó có thể tham khảo (tham khảo thôi nhen, không chính xác 100%) ở đây:
À mà sẵn bà 8 chút luôn, tui có đọc sơ qua topic này, thấy cậu hay nói test hàm này hàm kia thì Excel nó bị đơ hay thoát đột ngột luôn. Tức là trong code của cậu bị văng exception ra, cậu không handling nó nên nó trôi tuốt ra ngoài. Nếu là Delphi application thì ở application, Delphi có sinh code để bắt các unhandled exception này, nhưng với Delphi DLL thì không.
Nên khi exception bị quăng ra từ Delphi DLL, không ai bắt nó, nó sẽ quăng ra tới Excel. Do cơ chế xử lý exception của Excel (tức của Visual C++ vì Excel được viết = Visual C++) và Delphi khác nhau, nên Excel sẽ không xử lý được và làm crash.
scrrun.dll mà chúng ta hay dùng class Dictionary, Files, Folders... được viết = VC++, thuần API, VARIANT, BSTR, SAFEARRAY và rất sâu rồi, tốc độ nó đã cực nhanh, khó có thể vượt qua nó, nên dùng TDictionary của Delphi hay các hàm/procedure/ class TxxxStream của Delphi sẽ vẫn không đua lại nổi nó. Vì vậy cứ để bà con dùng VBA trực tiếp với nó, khỏi phải phát minh lại bánh xe to mà chậm hơn.
Cơ chế xử lý lỗi của VB/VBA cũng dựa trên cơ chế exception handling của hệ điều hành Windows, tựa tựa với Visual C++, nên các exception từ các thư viện DLL như scrrun.dll quăng ra, VB/VBA xử lý và catch được.
Nôm na là vậy, cậu hiểu hay không thì tùy.
Cơ chế exception handling trên Windows nó rất phức tạp, thường chỉ dân system coder và dân "rờ em" đào sâu vào nó thôi. Coder ứng dụng thì chỉ cần biết có nó và dùng thôi.
Thật sự ra giờ tui vẫn còn lơ tơ mơ lắm, nói nắm chắc thì không dám nhận.
Coi diết trong đó thấy Hàm này nó cắn hàm kia nó chạy ... kiểu như thằn lằn cắn đuôi nhau nó chạy thế này .... mò diết mắt nó sẻ sáng ra đó !
Mã:
function VarArrayCreate(const Bounds: array of Integer;
AVarType: TVarType): Variant;
var
I, LDimCount: Integer;
LVarArrayRef: PVarArray;
LVarBounds: array[0..63] of TVarArrayBound;
begin
if (not Odd(High(Bounds)) or (High(Bounds) > 127)) or
(not VarTypeIsValidArrayType(AVarType)) then
VarArrayCreateError;
LDimCount := (High(Bounds) + 1) div 2;
for I := 0 to LDimCount - 1 do
with LVarBounds[I] do
begin
LowBound := Bounds[I * 2];
ElementCount := Bounds[I * 2 + 1] - LowBound + 1;
end;
LVarArrayRef := SafeArrayCreate(AVarType, LDimCount, PVarArrayBoundArray(@LVarBounds));
if LVarArrayRef = nil then
VarArrayCreateError;
_VarClear(TVarData(Result));
TVarData(Result).VType := AVarType or varArray;
TVarData(Result).VArray := LVarArrayRef;
end;
Mã:
function VarArrayOf(const Values: array of Variant): Variant;
var
I: Integer;
begin
Result := VarArrayCreate([0, High(Values)], varVariant);
for I := 0 to High(Values) do
Result[I] := Values[I];
end;
Mã:
function VarArrayDimCount(const A: Variant): Integer;
var
LVarType: TVarType;
LVarArray: PVarArray;
begin
if GetVarDataArrayInfo(TVarData(A), LVarType, LVarArray) then
Result := LVarArray^.DimCount
else
Result := 0;
end;
function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;
begin
VarResultCheck(SafeArrayGetLBound(VarArrayAsPSafeArray(A), Dim, Result));
end;
function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;
begin
VarResultCheck(SafeArrayGetUBound(VarArrayAsPSafeArray(A), Dim, Result));
end;
Giải thích dùm mạnh tại sao nó có 2 procedure giống nhau và nó chạy theo cơ chế nào ??!! chưa hiểu .... có đọc trang gì đó trong Delphi nó cho phép như vậy nhưng cái gì đó quên mất tiêu ròi hehehe
Mã:
procedure VarResultCheck(AResult: HRESULT); overload;
begin
if AResult <> VAR_OK then
TranslateResult(AResult);
end;
procedure VarResultCheck(AResult: HRESULT; ASourceType, ADestType: TVarType); overload;
begin
if AResult <> VAR_OK then
case AResult of
VAR_TYPEMISMATCH: VarCastError(ASourceType, ADestType);
VAR_OVERFLOW: VarOverflowError(ASourceType, ADestType);
else
TranslateResult(AResult);
end;
end;
Mạnh có coi mấy trang tây nó viết cái hàm chuyển mãng đó còn dài dòng và rắc rối hơn mạnh đã viết .... vãi kinh
Coi diết trong đó thấy Hàm này nó cắn hàm kia nó chạy ... kiểu như thằn lằn cắn đuôi nhau nó chạy thế này .... mò diết mắt nó sẻ sáng ra đó !
Mã:
function VarArrayCreate(const Bounds: array of Integer;
AVarType: TVarType): Variant;
var
I, LDimCount: Integer;
LVarArrayRef: PVarArray;
LVarBounds: array[0..63] of TVarArrayBound;
begin
if (not Odd(High(Bounds)) or (High(Bounds) > 127)) or
(not VarTypeIsValidArrayType(AVarType)) then
VarArrayCreateError;
LDimCount := (High(Bounds) + 1) div 2;
for I := 0 to LDimCount - 1 do
with LVarBounds[I] do
begin
LowBound := Bounds[I * 2];
ElementCount := Bounds[I * 2 + 1] - LowBound + 1;
end;
LVarArrayRef := SafeArrayCreate(AVarType, LDimCount, PVarArrayBoundArray(@LVarBounds));
if LVarArrayRef = nil then
VarArrayCreateError;
_VarClear(TVarData(Result));
TVarData(Result).VType := AVarType or varArray;
TVarData(Result).VArray := LVarArrayRef;
end;
Mã:
function VarArrayOf(const Values: array of Variant): Variant;
var
I: Integer;
begin
Result := VarArrayCreate([0, High(Values)], varVariant);
for I := 0 to High(Values) do
Result[I] := Values[I];
end;
Mã:
function VarArrayDimCount(const A: Variant): Integer;
var
LVarType: TVarType;
LVarArray: PVarArray;
begin
if GetVarDataArrayInfo(TVarData(A), LVarType, LVarArray) then
Result := LVarArray^.DimCount
else
Result := 0;
end;
function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;
begin
VarResultCheck(SafeArrayGetLBound(VarArrayAsPSafeArray(A), Dim, Result));
end;
function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;
begin
VarResultCheck(SafeArrayGetUBound(VarArrayAsPSafeArray(A), Dim, Result));
end;
Giải thích dùm mạnh tại sao nó có 2 procedure giống nhau và nó chạy theo cơ chế nào ??!! chưa hiểu .... có đọc trang gì đó trong Delphi nó cho phép như vậy nhưng cái gì đó quên mất tiêu ròi hehehe
Mã:
procedure VarResultCheck(AResult: HRESULT); overload;
begin
if AResult <> VAR_OK then
TranslateResult(AResult);
end;
procedure VarResultCheck(AResult: HRESULT; ASourceType, ADestType: TVarType); overload;
begin
if AResult <> VAR_OK then
case AResult of
VAR_TYPEMISMATCH: VarCastError(ASourceType, ADestType);
VAR_OVERFLOW: VarOverflowError(ASourceType, ADestType);
else
TranslateResult(AResult);
end;
end;
Mạnh có coi mấy trang tây nó viết cái hàm chuyển mãng đó còn dài dòng và rắc rối hơn mạnh đã viết .... vãi kinh
Có lẽ ý của bác ThangCuAnhmuốn bạn biết về ngôn ngữ Pascal là trước tiên, và biết được nguyên lý làm việc vơi các hàm API của Delphi để bạn hiểu cách viết code là chính? Chứ vào việc cụ thể thì đã có các hàm hỗ trợ với một hai vòng lặp là xong rôi.
Uhm, ngộ ra từ từ rồi đó. Cứ gác chân lên bàn mà nhâm nhi, nhảy tới nhảy lui trong source mà coi.
Mã:
procedure VarArrayCreateError;
begin
raise EVariantArrayCreateError.Create(SVarArrayCreate);
end;
Bạn Mạnh chú ý chổ này, nếu có lỗi trong hàm VarArrayCreate, exception EVariantArrayCreateError sẽ được raise.
Nên ở ngoài, nếu call hàm này, để chắc chắn, phải try/except on xxx để catch exception này, không thì nó throw tuốt luốt ra ngoài cùng luôn.
À, overload đó hả. Tính năng này mượn từ C++ qua, cho phép các hàm/procedure cùng tên, nhưng bắt buộc phải khác tham số. Nôm na vậy thôi. Nên cậu thấy có 2 hàm VarResultCheck đó, nhưng parameter khác nhau đó, thấy không ?
Sâu xa hơn nữa thì nó liên quan tới Delphi compiler và Borland C++ name mangling. Nói ra dài dòng. Cứ hiểu overload, overwrite vậy là được đủ dùng rồi.
Vì vậy tui mới nói cậu chịu khó học lại ngôn ngữ Pascal, Object Pascal đã. Rồi phải biết cách dùng Pointer, PChar để thao tác với API.
Uhm, ngộ ra từ từ rồi đó. Cứ gác chân lên bàn mà nhâm nhi, nhảy tới nhảy lui trong source mà coi.
Mã:
procedure VarArrayCreateError;
begin
raise EVariantArrayCreateError.Create(SVarArrayCreate);
end;
Bạn Mạnh chú ý chổ này, nếu có lỗi trong hàm VarArrayCreate, exception EVariantArrayCreateError sẽ được raise.
Nên ở ngoài, nếu call hàm này, để chắc chắn, phải try/except on xxx để catch exception này, không thì nó throw tuốt luốt ra ngoài cùng luôn.
À, overload đó hả. Tính năng này mượn từ C++ qua, cho phép các hàm/procedure cùng tên, nhưng bắt buộc phải khác tham số. Nôm na vậy thôi. Nên cậu thấy 2 hàm VarResultCheck đó, nhưng parameter khác nhau đó, thấy không ?
Sâu xa hơn nữa thì nó liên quan tới Delphi compiler và Borland C++ name mangling. Nói ra dài dòng. Cứ hiểu overload, overwrite vậy là được đủ dùng rồi.