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
.
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! –
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? –
@Rob Kennedy: Tak, Windows API jest bardzo dobrze udokumentowany, więc jest to (zawsze) dobry pomysł. Szukam teraz ... –