2011-12-16 32 views
5

Tôi hiện đang viết một hệ thống cửa sổ cho một ứng dụng Delphi hiện có.Delphi - ghi đè hành vi ẩn của TForm.showModal

Hiện tại, chương trình bao gồm một số biểu mẫu có kích thước đầy đủ được hiển thị theo cách thức theo thứ tự mà chúng được yêu cầu và không người dùng nào có thể di chuyển được. Mục đích của tôi là cho phép tất cả các biểu mẫu này có thể di chuyển được. Các hình thức trước đây được xếp chồng lên nhau nhưng không ai có thể di chuyển các hình nền không hiển thị cho người dùng. Giải pháp của tôi cho đến nay đã được giấu hình thức 'cha mẹ' khi mở một đứa trẻ mới, và reshowing nó khi đứa trẻ đó được đóng lại.

Thật không may vì mỗi đứa trẻ được gọi với showModal, cuộc gọi làm cho biểu mẫu gốc không hiển thị cho đến sau khi quá trình phương thức hoàn thành và do đó sau khi biểu mẫu con đã bị ẩn để người dùng nhìn thấy một flash thứ hai biểu mẫu hiển thị.

Có cách nào để tôi có thể ngăn tự động ẩn biểu mẫu sau khi quá trình của họ đã hoàn tất không? Điều này sẽ cho phép tôi ẩn chúng theo cách thủ công khi biểu mẫu gốc hiển thị lại. Tôi đã cố gắng sắp xếp điều này trong sự kiện FormHide của mỗi hình thức con nhưng điều này không hoạt động như một hình thức con cũng bị ẩn khi mở một trong những đứa con của chính nó.

EDIT:

Dưới đây là những gì tôi đã cho đến nay dựa trên lời khuyên của Remy dưới

procedure openModalChild(child: TForm; parent: TForm); 
var 
    WindowList: Pointer; 
    SaveFocusCount: Integer; 
    SaveCursor: TCursor; 
    SaveCount: Integer; 
    ActiveWindow: HWnd; 
    Result: integer; 
begin 
    CancelDrag; 
    with child do begin 
    Application.ModalStarted; 
    try 
    ActiveWindow := GetActiveWindow; 
    WindowList := DisableTaskWindows(0); 
    //set the window to fullscreen if required 
    setScreenMode(child); 
    try 
    Show; //show the child form 
    try 
     SendMessage(Handle, CM_ACTIVATE, 0, 0); 
     ModalResult := 0; 
     repeat 
     Application.HandleMessage; 
     //if Forms.Application.FTerminate then ModalResult := mrCancel else 
      if ModalResult <> 0 then closeModal(child as TCustomForm); 
     until ModalResult <> 0; 
     Result := ModalResult; 
     SendMessage(Handle, CM_DEACTIVATE, 0, 0); 
     if GetActiveWindow <> Handle then ActiveWindow := 0; 
    finally 
     parent.Show; 
     Hide; 
    end; 
    finally 
    EnableTaskWindows(WindowList); 
    parent.Show; //reshow the parent form 
    if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow); 
    end; 
    finally 
    Application.ModalFinished; 
    end; 
    end; 
end; 

này hoạt động tốt nhưng vấn đề chỉ là lặp lại vòng lặp hoạt động không bao giờ phá vỡ, ngay cả sau khi đứa trẻ đã được đã thoát và do đó biểu mẫu gốc không bao giờ được sửa lại. Có cách nào tôi có thể giải quyết vấn đề này không?

+0

Bạn đã thử tạo biểu mẫu gốc từ biểu mẫu con trước khi đóng? –

+0

Tôi không nhận được cách ẩn cửa sổ 'cha mẹ' sẽ dẫn đến khả năng di chuyển của một trong hai biểu mẫu. Vui lòng mô tả chính xác mục tiêu của bạn hoặc xóa phần không cần thiết khỏi câu hỏi. – NGLN

+0

Ẩn phụ huynh không thay đổi liệu một trong hai biểu mẫu có thể di chuyển hay không (chúng đã có thể). Các hình thức tôi tham khảo nên được tất cả trong một cửa sổ, nhưng do thực hiện thiết kế hiện tại thì không. Để cung cấp cho hiệu ứng một cửa sổ, mỗi đứa trẻ mới được hiển thị được định vị và có kích thước giống với cha mẹ gọi của nó và khi đóng cha mẹ được chuyển đến vị trí con và hiển thị. Hình ảnh này xuất hiện dưới dạng một cửa sổ ngoại trừ một thời điểm ngắn mà không có biểu mẫu nào hiển thị. – jmc

Trả lời

10

ShowModal() gọi một cách rõ ràng Show() ngay trước khi vào vòng lặp xử lý phương thức và gọi ngay Hide() ngay sau khi thoát khỏi vòng lặp. Bạn không thể thay đổi điều đó mà không thay đổi mã trong tệp nguồn Forms.pas của VCL.

Nếu bạn cần kiểm soát tốt hơn các cửa sổ, mà không cần chỉnh sửa mã nguồn VCL, thì không sử dụng ShowModal(). Sử dụng Show(), Hide(), DisableTaskWindows()EnableTaskWindows() chính mình nếu cần. Tôi sẽ sugest bạn nhìn vào Forms.pas để xem chúng được sử dụng như thế nào. Sao chép việc thực hiện ShowModal() vào chức năng của riêng bạn, sau đó bạn có thể tùy chỉnh nó khi cần thiết.

+0

Hi Remy - là một lập trình viên Delphi không kinh nghiệm, làm thế nào để tôi tạo ra một triển khai mới của ShowModal cho một bộ sưu tập các biểu mẫu? Tôi giả sử họ phải thực hiện từ một số superclass của Form mà kế thừa từ TForm? Nói theo thuật ngữ Java/C ở đây ... – jmc

+0

Tôi sẽ thực hiện nó như một hàm độc lập mà bạn có thể truyền một con trỏ 'TForm' làm tham số. –

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