2012-04-02 37 views
6

Tôi đang làm việc để nhận được thiết lập helpfile bằng phần mềm của chúng tôi. Tôi đã thêm số HelpContext cho nhiều biểu mẫu/khung/điều khiển cụ thể và tất cả đều hoạt động tốt. Vấn đề là hình thức chính không mang lại bất kỳ sự trợ giúp nào cả. Đối với tất cả điều này tôi chỉ sử dụng F1 để cố gắng kích hoạt sự trợ giúp.Liên kết helpfile với một ứng dụng Delphi XE2 - mọi thứ hoạt động ngoại trừ hình thức chính

Tôi không phải là chuyên gia về Delphi hoặc helpfiles, nhưng tôi sẽ đăng những gì tôi đã làm và nơi tôi đã xem.

Chỉnh sửa: Nhờ trợ giúp của tôi, giờ đây vấn đề là do biểu mẫu chính là phụ huynh MDI. Điều này vẫn không giải quyết vấn đề .. nó gần như có vẻ như một lỗi với tôi nhưng tôi cho rằng nó có thể là cố ý vì một lý do nào đó. EndEdit

Tôi bao gồm đơn vị này: HtmlHelpViewer cho trình xem. Trong các hình thức chính Tạo constructor Tôi đã thêm Application.Helpfile: = 'asdf.chm'. Đối với tất cả các hình thức khác tôi vừa thêm vào các số bối cảnh và nó đã hoạt động ngay lập tức. Tôi đã thử nó ở dạng chính và không có gì xảy ra cả. Vì vậy, tôi đã thử thêm một sự kiện Application.OnHelp nhưng điều này không nhận được gọi trên biểu mẫu chính (và nó cho tất cả các hình thức khác, nơi trợ giúp đang hoạt động).

Kỳ nghỉ cuối cùng mà tôi có thể nghĩ đến là theo dõi sâu vào mã và xem điều gì đang xảy ra. Tôi đã truy cập vào TCustomForm.WMHelp trong Vcl.Forms là nơi chia tách đã xảy ra. Hàm trả lời có vòng lặp này:

if iContextType = HELPINFO_WINDOW then 
begin 
    Control := FindControl(hItemHandle); 
    while (Control <> nil) and (not ControlHasHelp(Control)) do 
    Control := Control.Parent; 
    if Control = nil then Exit; 
    GetHelpInfo(Control, HType, ContextID, Keyword); 
    Pt := Control.ClientToScreen(Point(0, 0)); 
end 

Khi biểu mẫu chính được gọi là Điều khiển trợ giúp sẽ là 0 và sau đó nó sẽ thoát. Mọi thứ khác sẽ ổn.

Tôi rõ ràng không biết tại sao điều này xảy ra. Câu trả lời có thể là một cái gì đó rất cơ bản. Có những câu chuyện mới trên trang chủ!

+0

Bạn đã đặt 'HelpContext' cho chính biểu mẫu? –

+0

@DavidHeffernan: Vâng tôi đã làm. Tôi nên đề cập đến điều này, nhưng nó chỉ là hình thức chính, không phải là con cái của nó. Tôi đặt một nút trên biểu mẫu (không có trợ giúp ngữ cảnh) và khi nó có tiêu điểm và tôi đẩy F1 phần trợ giúp cho tải biểu mẫu chính. Nếu không có tiêu điểm hiển thị thì không có sự trợ giúp nào tải. – Sentient

+0

Tôi sẽ xem xét trình xử lý WMHelp trong trình gỡ lỗi và xem những gì được trả về từ FindControl. –

Trả lời

6

Theo nhận xét của bạn, thông báo WM_HELP đang được nhắm mục tiêu tại cửa sổ ứng dụng MDI của bạn. Và vì đó không phải là điều khiển VCL, nó không phản hồi thông báo WM_HELP. Bạn có thể đối phó với vấn đề này bằng cách chặn tin nhắn và yêu cầu hình thức chính để xử lý nó:

type 
    TMainForm = class(TForm) 
    protected 
    procedure WMHelp(var Message: TWMHelp); message WM_HELP; 
    end; 
.... 
procedure TMainForm.WMHelp(var Message: TWMHelp); 
begin 
    if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (Message.HelpInfo.hItemHandle=ClientHandle) then 
    Message.HelpInfo.hItemHandle := Handle; 
    inherited; 
end; 

Nếu bạn muốn trở thành thậm chí phòng thủ nhiều hơn bạn có thể viết nó như thế này:

if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (FindControl(Message.HelpInfo.hItemHandle)=nil) then 
    Message.HelpInfo.hItemHandle := Handle; 

tôi đã có một cái nhìn tại ứng dụng MDI của riêng tôi và tôi có thể thấy rằng tôi có mã tương tự để đối phó với vấn đề chính xác này. Nếu nó không được viết hơn 10 năm trước, tôi có thể đã nhớ sớm hơn!

+0

Tuyệt vời, cảm ơn rất nhiều vì sự giúp đỡ của bạn! Tôi phải thực hiện một thay đổi nhỏ cho mã của bạn, tôi đã thêm: 'với Message.HelpInfo {$ IFNDEF CLR}^{$ ENDIF} do' vì trình biên dịch không thích iContextType, tôi nhận được từ VCL .Forms có trong WMHelp của nó. (Và sau đó đưa ra Message.HelpInfo từ phần thứ hai của và.) – Sentient

+0

Tốt. Rất vui được giúp đỡ. –