2010-08-27 15 views
5

OK, to powinno być łatwe, ale nie znaleźliśmy rozwiązanie, przynajmniej nie w not so good documentation .. W TTaskDialog, masz możliwość dodania jednego check-box. Możesz kontrolować jego początkowy stan za pomocą flagi tfVerificationFlagChecked w Flags. Ale jak uzyskać stan po tym oknie dialogowym, Execute d?Jak sprawdzić, czy pole wyboru jest zaznaczone w TTaskDialog Delphi?

Oczywiście można użyć zdarzenia OnVerificationClicked i przełączać zmienną lokalną, początkowo równą początkowemu stanowi pola wyboru, przy każdym połączeniu. Ale można oczekiwać bardziej naturalnego rozwiązania.

+0

Oficjalna dokumentacja, nawiasem mówiąc, jest przerażająca. Weź to na przykład: http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL Oni nawet nie wyjaśniają * jaki * URL to jest. Nie jest oczywiste, że w każdym oknie dialogowym zadań znajduje się adres URL. I tutaj (http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.Execute) zapominają wyjaśnić, co oznacza (boolean) wynik funkcji! –

+1

Masz kod źródłowy, prawda? Sprawdź, gdzie jest używana funkcja API okna dialogowego. Powinien wywołać TaskDialogIndirect. Czwartym parametrem jest to, co ostatecznie otrzyma wartość pola wyboru, więc co robi z nim kod? –

+0

@Rob Kennedy: Tak, Windows API jest bardzo dobrze udokumentowany, więc jest to (zawsze) dobry pomysł. Szukam teraz ... –

Odpowiedz

9

O mój Boże, Embarcadero popełnił błąd.

Kilka moich testów pokazało, że jeśli pole wyboru jest początkowo odznaczone, ale jest sprawdzane przez użytkownika, zostanie ustawiona flaga tfVerificationFlagChecked. Ale jeśli flaga jest ustawiona domyślnie, a użytkownik odznacza pole, wówczas tfVerificationFlagChecked nie zostanie usunięty z zestawu . I nie jest to dziwne. Kod VCL robi

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; 

Zauważ, że flaga jest włączone, jeśli pole jest zaznaczone, gdy okno się zamyka, ale nie ma kodu, aby usunąć flagę jeśli pole jest zaznaczone przez użytkownika.

Oczywiście, można by oczekiwać, że ostatnia część kodu do Przeczytałem

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

myślę pójdę z ręcznym podejściu przełączanie OnVerificationClicked.

+2

Podczas gdy kodujesz swoje obejście, możesz również dodać raport na ten temat w systemie Quality Central (jeśli jeszcze tego nie zrobiłeś), w przeciwnym razie na pewno nigdy nie zostanie naprawiony ... –

2

Po wyświetleniu okna dialogowego nie można przeczytać Flags, aby sprawdzić, czy nadal jest dostępny tfVerificationFlagChecked?

+0

Nie. Próbowałem tego. W dokumentacji jest również napisane: "Jeśli ustawione, pole wyboru weryfikacji jest ** początkowo ** zaznaczone." –

+0

To prawda, ale skoro już ustaliliśmy, że dokumentacja nie jest zbyt dobra, nie możemy zakładać, że "początkowa" część jest dokładna. –

+0

Rob Kennedy: Zgadzam się na to! :) –

0

w Delphi XE7 (ewentualnie wcześniejsze wersje też) to wydaje się być rozwiązany.

choice := tfVerificationFlagChecked in tskbox.Flags; 

wybór, zmienna binarna, może zwrócić status sprawdzony.

Powiązane problemy