2012-05-10 26 views
7

tôi gặp phải một vấn đề lạ với XE2:Delphi XE2, làm thế nào để giữ cho hình thức ON TOP sau khi thay đổi phong cách VCL

Tôi đang sử dụng HWND_TOPMOST với SetWindowPos mẫu quy định của tôi trên đầu trang, nhưng nếu tôi chuyển sang phong cách VCL khi chạy , cửa sổ không còn ở trên cùng nữa và việc tắt/thiết lập lại nó cũng không khắc phục được.

Bất kỳ cách nào để sửa lỗi này?

+0

Nghe như lỗi. Bạn nên báo cáo điều này cho [QC] (http://qc.embarcadero.com/). –

+0

@MasonWheeler đây không phải là một lỗi, đây là cách làm thế nào các phong cách vcl hoạt động, mỗi khi bạn thay đổi một phong cách vcl xử lý các hình thức được tái tạo. – RRUZ

+0

@RRUZ: Dựa trên mô tả ban đầu của OP, việc thiết lập lại thuộc tính không hoạt động với các kiểu, điều đó chắc chắn sẽ là một lỗi nếu nó đúng. (Xem nhận xét của OP về câu trả lời của Sertac để có giải thích rõ hơn về những gì đã thực sự xảy ra.) –

Trả lời

8

Vấn đề của bạn là biểu mẫu đang được tạo lại do thay đổi kiểu và mất phong cách hàng đầu của nó vì VCL không có kiến ​​thức về điều này. Hoặc sử dụng:

FormStyle := fsStayOnTop; 

hoặc ghi đè CreateWindowHandle để SetWindowPos được gọi là mỗi lần mẫu được tái tạo:

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure CreateWindowHandle(const Params: TCreateParams); override; 
    .. 

procedure TForm1.CreateWindowHandle(const Params: TCreateParams); 
begin 
    inherited; 
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); 
end; 


BTW, tôi không thể lặp lại "unset/tái thiết lập không sửa chữa nó ". Với các thử nghiệm của tôi, hãy gọi lại số SetWindowPos.

+0

Cảm ơn. Bạn nói đúng, thiết lập lại nó thực sự hoạt động. Vấn đề là xử lý cửa sổ là khác nhau bởi vì tôi gọi RecreateWnd sau khi thay đổi phong cách VCL để khắc phục một vấn đề khác nhau, vì vậy tôi đã gọi SetWindowPos với một xử lý không hợp lệ bây giờ. – hikari

+0

@hikari - Bạn được chào đón! –

5

Đặt kiểu mới trên điều khiển làm cho cửa sổ điều khiển được tạo lại, do đó HWND_TOPMOST sẽ phải được áp dụng lại.

0

Sau một tìm kiếm dài trên internet và trong trợ giúp Delphi không có giải pháp, tôi đã thử một số mã khác nhau, một số mẹo, tất cả chúng không có hiệu lực gì, vấn đề vẫn tồn tại. Nhìn vào sự giúp đỡ, tôi đã quyết định thử nghiệm mã đơn giản dưới đây làm việc hoàn hảo cho tôi.

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Application.RestoreTopMosts; 
end; 
Các vấn đề liên quan