2013-08-22 18 views
7

Trong nhiều hộp thoại xác nhận, rất hữu ích khi có tùy chọn như vậy (xác nhận tắt tiếng nhanh để tắt xác nhận). Nhưng tôi không thể tìm ra cách để làm điều đó. Tôi không muốn thiết kế nó bản thân mình bởi vì tôi cần hộp thoại này là tiêu chuẩn giống như và không wont để thiết kế lại với mỗi bản cập nhật của Delphi. Có cách đơn giản để sử dụng Delphi hộp thoại xác nhận tiêu chuẩn với hộp kiểm như vậy?Cách sử dụng hộp thoại xác nhận chuẩn Delphi nhưng với hộp kiểm "Không hỏi lại tôi"?

UPDATE2. Thư viện SynTaskDialog được đề xuất từ ​​dự án Synopse thực hiện công việc tuyệt vời (tất cả những gì tôi cần và thậm chí nhiều hơn), tôi sẽ sử dụng nó trong các dự án của mình. Cảm ơn!

CẬP NHẬT. Vì vậy, cảm ơn các bạn vì những ý tưởng. Chức năng hệ thống MessageBoxCheck là giải pháp tốt nhưng có vẻ không ổn định như trước. Nói chung, tôi đồng ý rằng bạn nên sử dụng các chức năng API mới nhất để cung cấp cho người dùng trải nghiệm giao diện người dùng tốt nhất của hệ điều hành hiện đại và sử dụng thiết kế kiểu cũ cho các hệ thống cũ hơn. Tại thời điểm tôi ở lại trên giải pháp đơn giản (mã là sau), nhưng nếu ai đó chia sẻ mã với sự hỗ trợ của giao diện người dùng cho hệ điều hành hiện đại, nó sẽ được tốt đẹp.

function MsgDlgWithCB(const Msg,Title,CBMsg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn; 
    var cbDontAskAnymore: TCheckBox): TForm; 
var 
    i: integer; 
    b: TButton; 
    y: integer; 
begin 
    Result := CreateMessageDialog(Msg, DlgType, Buttons, DefaultButton) ; 
    Result.Position := poScreenCenter; 
    cbDontAskAnymore := TCheckBox.Create(Result); 
    cbDontAskAnymore.Caption := CBMsg; 
    cbDontAskAnymore.Width := 130; 
    y := -1; 
    for i := 0 to result.ComponentCount-1 do 
    if result.Components[i] is TButton then 
    begin 
     b := TButton(result.Components[i]); 
     b.Left := b.Left + cbDontAskAnymore.Width + 16; 
     Result.ClientWidth := Max(Result.ClientWidth, b.Left+b.Width+16); 
     y := b.Top+b.Height-cbDontAskAnymore.Height; 
    end; 
    if y<0 then 
    y := Result.ClientHeight - cbDontAskAnymore.height - 16; 
    Result.Caption := Title; 
    cbDontAskAnymore.Parent := Result; 
    cbDontAskAnymore.Top := y; 
    cbDontAskAnymore.Left := 8; 
end; 

function MessageDlgCheckbox(const Msg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn; 
    var cbDontAskAnymore: Boolean; 
    const Title: string ='Confirmation'; 
    const CBMsg: string = 'Don''t ask anymore'): integer; 
var 
    f: TForm; 
    c: TCheckbox; 
begin 
    f := MsgDlgWithCB(Msg,Title,CBMsg,DlgType,Buttons,DefaultButton,c); 
    try 
    result := f.ShowModal; 
    cbDontAskAnymore := c.Checked; 
    finally 
    f.free; 
    end; 
end; 
+3

Chức năng 'SHMessageBoxCheck' là cách tự nhiên nhất trong Windows. – TLama

+0

SHMessageBoxCheck dường như không được hỗ trợ ngoài XP –

+0

@David, chỉ cần kiểm tra nó ngay bây giờ. Uhm, có lẽ chỉ có thiếu xuất khẩu của nó ... (do đó cách được sử dụng trong bài của RBA) – TLama

Trả lời

12

Bạn có thể sử dụng our Open Source SynTaskDialog unit.

Windows cung cấp hộp thoại tác vụ chung sẵn có kể từ Vista/Bảy. Nhưng không có phiên bản nào có sẵn với các phiên bản trước của Windows, tức là Windows XP hoặc 2K.

Đơn vị này (được cấp phép theo giấy phép MPL/GPL/LGPL) sẽ sử dụng API TaskDialog mới trong Vista/Seven và mô phỏng mã Delphi tinh khiết và các thành phần VCL theo tiêu chuẩn dưới XP hoặc 2K. Nó hỗ trợ Delphi 6 lên đến XE4, và Win32/Win64 Unicode đã sẵn sàng.

Đây là kết quả dưới Windows Seven máy tính 64 bit:

enter image description here

Và đây là hộp thoại tương tự được tạo ra từ mã Delphi tinh khiết mô phỏng của chúng tôi:

enter image description here

Vì đây Ảnh chụp màn hình đã được thực hiện trên một máy Win 7, kiểu dáng là bản địa cho hệ điều hành đó. Khi phiên bản mô phỏng của hộp thoại chạy trên XP nó sẽ hiển thị theo kiểu gốc của hệ điều hành đó.

Bạn có hộp kiểm "Không yêu cầu cài đặt này vào lần tiếp theo" ...và có khả năng nhiều hơn nữa!

+0

Rất đẹp! Điều này có vẻ giống như một cách tốt để tránh những hạn chế nền tảng. Tất nhiên sớm, chúng ta có thể quên đi khả năng tương thích với XP. –

+0

@Arnaud Sẽ tốt hơn nếu sử dụng hộp thoại kiểu XP trên XP. Đặt kiểu dáng Vista trên XP sẽ trông rất kỳ quặc trong quan điểm của tôi. Tuy nhiên, tôi khen bạn về việc cung cấp một phần mềm hữu ích như vậy. –

+3

@DavidHeffernan Đơn vị này sử dụng kiểu XP trên XP. Trong thực tế, ảnh chụp màn hình trên đã được chụp dưới Seven, nhưng bắt buộc thi đua. Nó chỉ sử dụng các thành phần VCL bản địa (như TBitBtn hoặc như vậy), do đó, nó sẽ trông chỉ xuất hiện trên mọi hệ thống. –

5

Chức năng gốc của hệ thống cung cấp các tiện ích như vậy là API task dialog được giới thiệu trong Vista. Điều này cung cấp phương tiện để bạn hiển thị nhiều hộp thoại có khả năng hơn API MessageBox cũ hơn.

Nếu bạn cần hỗ trợ XP thì bạn sẽ phải tạo hộp thoại của riêng mình. Ví dụ bằng cách lấy từ TForm và gọi ShowModal. Nếu bạn làm điều này, hãy tạo biểu mẫu có khả năng tự xây dựng. Không tạo một biểu mẫu cho mỗi thư mà bạn hiển thị!

Trong codebase của tôi, tôi có trình bao bọc API nhiệm vụ của riêng mình. Điều này phát hiện tại các phiên bản thời gian chạy của Windows mà không hỗ trợ hộp thoại nhiệm vụ và rơi trở lại trên một hộp thoại Delphi được xây dựng tùy chỉnh.

Liên quan đến SHMessageBoxCheck Tôi sẽ cảnh giác với việc phụ thuộc vào điều đó. Theo tài liệu của nó, nó không được hỗ trợ ngoài XP, và bạn phải nhập nó theo thứ tự. Cá nhân tôi đã lo lắng rằng nó có thể bị loại bỏ khỏi một phiên bản tương lai của Windows. Điều đó nói rằng, MS có một hồ sơ theo dõi mạnh mẽ của làm bất cứ điều gì nó cần để giữ cho các ứng dụng cũ làm việc với các phiên bản hệ điều hành mới.

+0

Tôi yêu thích -1 của tôi ở đây. Có lời giải thích nào không? –

+0

Ai đó không hiểu câu trả lời ... hoặc đã chán ... hoặc .... – RBA

+0

@David Bạn có thể chia sẻ mã của trình bao bọc mà bạn sử dụng không? –

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