2013-02-21 30 views
7

Sử dụng Delphi XE2, Win64.Helpfile được mở từ cửa sổ phương thức không phản hồi

Vì vậy, tôi có một ứng dụng lớn với nhiều biểu mẫu và nếu tôi mở tệp trợ giúp từ biểu mẫu chính và mở cửa sổ phương thức và sau đó nhấn F1 để tắt trợ giúp theo ngữ cảnh trên cửa sổ phương thức cửa sổ tệp trợ giúp hiển thị thông tin chính xác nhưng không thể đóng tệp trợ giúp cho đến khi tôi đóng cửa sổ phương thức. Tôi thậm chí không thể lấy tập tin trợ giúp để tập trung lại nếu tôi quay lại ứng dụng cho đến khi cửa sổ phương thức đóng lại.

Calling này chính xác tập tin trợ giúp tương tự từ các phiên bản cũ của ứng dụng của chúng tôi (được xây dựng với Delphi 6) ngồi trong thư mục tương tự như các phiên bản mới (được xây dựng với Delphi XE2) các tập tin hiển thị giúp đỡ khi phím F1 là hit từ cửa sổ phương thức và đáp ứng và có thể đóng như tôi mong đợi.

Tệp trợ giúp là tệp loại .chm.

Để tóm tắt.

Launch ứng dụng mở tập tin trợ giúp bởi F1 Chuyển đến ứng dụng và cửa sổ modal mở trong ứng dụng Launch sự giúp đỡ từ cửa sổ modal bằng cách nhấn F1 Giúp cửa sổ tập tin không thể bị đóng cửa cho đến khi tôi nhảy trở lại ứng dụng của tôi và đóng cửa sổ modal .

Có ai có ý tưởng nào về lý do này không?

Tôi đã tìm kiếm trên Internet và không tìm thấy bất kỳ vấn đề tương tự nào.

Chúng tôi đang bối rối.

Cheers TJ

---- EDIT ----

Dưới đây là một số mã cho một ứng dụng mẫu hai mà cũng thể hiện hành vi này.

program Project1; 

uses 
    Vcl.Forms, 
    HTMLHelpViewer, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.HelpFile := 'C:\helpfile.chm'; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

Đây là mã Form1:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses Unit2; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Form2 := TForm2.Create(Application); 
    try 
    Form2.ShowModal; 
    finally 
    Form2.Free; 
    end; 
end; 

end. 

tôi thiết lập thuộc tính helpcontext trên hai hình thức để hai bối cảnh hợp lệ trong tập tin giúp đỡ của tôi.

Chạy ứng dụng - F1 để mở tệp trợ giúp Nút lần truy cập để Form2 được tạo và hiển thị F1 để gọi tệp trợ giúp Không thể đóng tệp trợ giúp cho đến khi tôi đóng Form2.

Hy vọng điều này sẽ hữu ích. - TJ

+0

Ứng dụng có kích hoạt phiên bản 32 bit không? –

+0

@Tony Không. Đó là một .chm. Nó sẽ được trong quá trình với các thành phần ocx chm. –

+0

@DavidHeffernan - Đặt popupparent một cách rõ ràng hoặc không có tác dụng rõ ràng. Bạn cần giúp gì? Điều này thậm chí xảy ra với một ứng dụng thử nghiệm hai mẫu đơn giản. –

Trả lời

9

Đây là lỗi thiết kế nghiêm trọng trong HtmlHelpViewer. Và thật dễ dàng để tái tạo hành vi mà bạn mô tả. Làm tốt để xác định rõ vấn đề. Vấn đề gây ra cả hai chương trình 32 và 64 bit bằng nhau.

Cá nhân tôi không sử dụng HtmlHelpViewer vì nó không hoạt động. Tôi thực hiện một trình xử lý cho TApplication.OnHelp.Nó trông giống như thế này:

class function THelpWindowManager.ApplicationHelp(Command: Word; 
    Data: THelpEventData; var CallHelp: Boolean): Boolean; 
begin 
    CallHelp := False; 
    Result := True; 
    //argh, WinHelp commands 
    case Command of 
    HELP_CONTEXT,HELP_CONTEXTPOPUP: 
    HtmlHelp(GetDesktopWindow, Application.HelpFile, HH_HELP_CONTEXT, Data); 
    end; 
end; 

Đặt rằng trong trong một lớp và gán nó vào Application.OnHelp khi khởi động:

Application.OnHelp := THelpWindowManager.ApplicationHelp; 

Tôi vừa mới kiểm tra mà ra trên tầm thường áp dụng hình thức hai và nó hoạt động tốt . Trong mã thực sự bạn có thể muốn tôn tạo điều này. Ví dụ, mã thực sự của tôi phức tạp hơn. Nó lưu trữ trong cài đặt người dùng trạng thái vị trí và cửa sổ của cửa sổ trợ giúp khi nó được đóng lại. Và sau đó khi được hiển thị lại, trạng thái vị trí và cửa sổ đó được khôi phục. Vì vậy, cửa sổ trợ giúp xuất hiện để nhớ vị trí cuối cùng trên màn hình.


Nhờ @Sertac vì đã giải thích chi tiết trong các nhận xét bên dưới. Tóm lại, ở đây mã số HtmlHelpViewer bị lỗi:

  1. Lệnh gửi HH_INITIALIZE lệnh lúc khởi động hệ thống trợ giúp.
  2. Như được mô tả trong các documentation này định cấu hình Trợ giúp HTML để chạy trên cùng một chuỗi với ứng dụng gọi thay vì một chuỗi phụ.
  3. Khi bạn gọi ShowModal, hãy gọi DisableTaskWindows để vô hiệu hóa các cửa sổ trong chuỗi cuộc gọi.
  4. Vì cửa sổ trình xem trợ giúp đã được tạo bởi chuỗi chính của ứng dụng của bạn (vì lệnh HH_INITIALIZE), nó sẽ bị tắt.

Và đó là lý do tại sao bạn không thể tương tác với cửa sổ trợ giúp từ trước khi biểu mẫu Delphi hoạt động.

+0

Làm cách nào để xử lý nếu bạn vượt qua tay cầm của biểu mẫu chính thay vì cửa sổ máy tính để bàn? –

+1

@Sertac Vâng, tôi hy vọng rằng có vấn đề về quyền sở hữu cửa sổ khi cửa sổ phương thức vô hiệu hóa chủ sở hữu cửa sổ. Nhưng không, điều đó cũng tốt. 'HtmlHelpViewer' thổi khối. –

+0

Đó là +1 sau đó, vì nó sẽ không bị cản trở nếu bạn cần vượt qua xử lý của biểu mẫu. BTW, tôi nghĩ rằng đó là ShowModal vô hiệu hóa các cửa sổ thread bằng cách DisableTaskWindows. –

Các vấn đề liên quan