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?
Bạn đã thử tạo biểu mẫu gốc từ biểu mẫu con trước khi đóng? –
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
Ẩ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