2010-08-27 35 views
5

OK, điều này sẽ dễ dàng, nhưng tôi không tìm thấy giải pháp, ít nhất là không trong not so good documentation .. Trong một TTaskDialog, bạn có tùy chọn để thêm một hộp kiểm. Bạn có thể kiểm soát trạng thái ban đầu của nó bằng cờ tfVerificationFlagChecked trong Flags. Nhưng làm thế nào để có được trạng thái sau khi hộp thoại đã được Execute d?Làm cách nào để xác minh xem hộp kiểm có được kiểm tra trong một Delphi TTaskDialog không?

Tất nhiên, người dùng có thể sử dụng sự kiện OnVerificationClicked và chuyển đổi biến cục bộ, ban đầu bằng trạng thái ban đầu của hộp kiểm, trên mỗi cuộc gọi. Nhưng người ta sẽ mong đợi một giải pháp tự nhiên hơn.

+0

Tài liệu chính thức, bằng cách này, rất đáng sợ. Lấy ví dụ này: http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL Họ thậm chí không giải thích * những gì * URL này là. Nó không phải là hiển nhiên rằng có một URL liên quan đến mỗi hộp thoại nhiệm vụ. Và ở đây (http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.Execute) chúng quên giải thích kết quả (boolean) của hàm này có nghĩa là gì! –

+1

Bạn có mã nguồn, phải không? Tìm nơi hàm API thoại được sử dụng. Nó sẽ gọi TaskDialogIndirect. Tham số thứ tư là thứ cuối cùng sẽ nhận được giá trị của hộp kiểm, vậy mã lệnh sẽ làm gì với nó? –

+0

@Rob Kennedy: Vâng, Windows API được tài liệu rất tốt, vì vậy đây là (luôn luôn) là một ý tưởng hay. Tôi đang tìm kiếm ... –

Trả lời

9

Ôi Chúa ơi, Embarcadero đã phạm sai lầm.

Một vài thử nghiệm của tôi cho thấy rằng nếu hộp kiểm ban đầu không được chọn, nhưng được kiểm tra bởi người dùng, thì cờ tfVerificationFlagChecked sẽ được đặt. Nhưng nếu cờ được đặt trước và người dùng bỏ chọn hộp, thì tfVerificationFlagChecked sẽ không bị xóa khỏi tập hợp Flags. Và điều này không lạ. Mã VCL thực hiện

Result := TaskDialogIndirect(LTaskDialog, {$IFNDEF CLR}@{$ENDIF}LModalResult, 
    {$IFNDEF CLR}@{$ENDIF}LRadioButton, {$IFNDEF CLR}@{$ENDIF}LVerificationChecked) = S_OK; 
FModalResult := LModalResult; 
if Result then 
begin 
    FButton := TTaskDialogButtonItem(FButtons.FindButton(FModalResult)); 
    FRadioButton := TTaskDialogRadioButtonItem(FRadioButtons.FindButton(LRadioButton)); 
    if LVerificationChecked then 
    Include(FFlags, tfVerificationFlagChecked); 
end; 

Lưu ý rằng cờ được bao gồm nếu hộp kiểm được chọn khi hộp thoại đóng, nhưng không có mã để xóa cờ nếu hộp không được người dùng bỏ chọn.

Tất nhiên, người ta mong chờ phần sau của mã đã đọc

if LVerificationChecked then 
    Include(FFlags, tfVerificationFlagChecked) 
    else 
    Exclude(FFlags, tfVerificationFlagChecked) 

Tôi nghĩ rằng tôi sẽ đi với OnVerificationClicked thủ tiếp cận toggling.

+2

Trong khi bạn làm mã xung quanh công việc của bạn, bạn cũng xin vui lòng thêm một báo cáo về điều này trên chất lượng Trung ương (nếu bạn chưa làm như vậy) nếu không nó chắc chắn sẽ không bao giờ được cố định ... –

2

Bạn không thể đọc Flags sau khi hộp thoại đóng để xem liệu tfVerificationFlagChecked vẫn còn hiện diện?

+0

No. Đã thử điều đó. Và tài liệu cũng cho biết "Nếu được đặt, hộp kiểm xác minh được ** kiểm tra ban đầu **". –

+0

Đúng, nhưng vì chúng tôi đã thiết lập tài liệu không phải là rất tốt, chúng tôi không thể giả định rằng phần "ban đầu" là chính xác. –

+0

Rob Kennedy: Đồng ý về điều đó! :) –

0

Trong Delphi XE7 (có thể là phiên bản cũ hơn, quá) điều này dường như đã được giải quyết.

choice := tfVerificationFlagChecked in tskbox.Flags; 

lựa chọn, biến boolean, có thể trả lại trạng thái đã chọn.

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