Về lỗi
Đó thông báo lỗi được huy động từ các đơn vị Controls.pas, từ phương pháp TWinControl.CreateWnd
. Về cơ bản mã được sử dụng để tạo ra cửa sổ xử lý cho hậu duệ TWinControl của bạn (TFrame, TButton, TEdit ... nếu nó có thể có tiêu điểm bàn phím nó là một hậu duệ TWinControl), và nó thực sự là một thông báo lỗi rất hợp lý: Bạn không thể có một Cửa sổ mà không có WindowParent, và vì chúng ta đang nói về VCL ở đây, nó làm cho rất nhiều ý nghĩa để thử và có được cửa sổ cha mẹ xử lý từ TWinControl.Parent; Và đó không được chỉ định.
Đó không phải là tại sao thông báo lỗi xuất hiện. Bạn sẽ thấy thông báo lỗi đó vì một số mã bạn đang sử dụng để thiết lập khung yêu cầu một cửa sổ xử lý cho một số hoạt động. Nó có thể là bất cứ điều gì, như thiết lập các chú thích của một số thành phần (mà nội bộ yêu cầu một cửa sổ xử lý làm một số tính toán). Cá nhân tôi thực sự ghét nó khi điều đó xảy ra.Khi tôi tạo GUI từ mã, tôi cố gắng trì hoãn việc gán cho Cha mẹ càng nhiều càng tốt, trong một nỗ lực để trì hoãn việc tạo cửa sổ, vì vậy tôi bị cắn nhiều lần.
cụ thể để sử dụng DLL của bạn, có thể sửa chữa
Tôi sẽ đưa tâm lý đọc được ý nghĩ của tôi trên mũ. Vì bạn cần trả về FRAME từ DLL của bạn, và bạn không thể trả về Frame thực bởi vì đó là một đối tượng Delphi cụ thể và bạn không được phép trả về các đối tượng Delphi cụ thể qua các ranh giới DLL, tôi đoán bạn đang quay trở lại một Xử lý cửa sổ, như việc phải làm tất cả các API đẹp đó, sử dụng định nghĩa hàm như thế này:
function GiveMeTheNiceFrame:HWND;
vấn đề là, thường xuyên đòi hỏi sự sáng tạo của Xử lý Window thực tế, thông qua việc gọi TWinControl.CreateWnd
, và lần lượt mà cuộc gọi yêu cầu một cửa sổ cha mẹ xử lý để thiết lập các cuộc gọi đến Windows.CreateWindowEx
, và thói quen không thể có được một cửa sổ cha mẹ xử lý, do đó, nó lỗi ra ngoài.
Hãy thử thay thế chức năng của bạn với một cái gì đó allong theo dòng:
function GiveMeTheNiceFrame(OwnerWindow:HWND):HWND;
begin
Result := TMyNiceFrame.CreateParanted(OwnerWindow).Handle;
end;
... ví dụ: sử dụng CreateParented(AParentWindow:HWND)
constructor, không phải là bình thường Create(AOwner:TComponent)
và vượt qua một HWND chủ sở hữu để DLL của bạn.
Tại sao bạn sử dụng DLL và không phải gói? DLL là một cơn ác mộng để có được quyền. –