In vielen Bestätigungsdialogen ist es nützlich, eine solche Option zu haben (schnelle Möglichkeit, die Bestätigung zu deaktivieren). Aber ich kann nicht finden, wie man das macht. Ich möchte es nicht selbst entwerfen, weil ich diesen Dialog als Standard-Standard verwenden muss und nicht mit jedem Update von Delphi neu gestalten möchte. Gibt es eine einfache Möglichkeit, den Delphi-Standard-Bestätigungsdialog mit einem solchen Kontrollkästchen zu verwenden?Wie benutzt man den Delphi-Standard-Bestätigungsdialog, aber mit der Checkbox "Frag mich nicht nochmal"?
UPDATE2. Die vorgeschlagene SynTaskDialog-Bibliothek aus dem Synopse-Projekt macht gute Arbeit (alles was ich brauche und noch mehr), ich werde es in meinen Projekten verwenden. Vielen Dank!
UPDATE. Also, vielen Dank für die Ideen. Systemfunktion MessageBoxCheck ist eine nette Lösung, aber scheint nicht so stabil zu sein, wie es sein sollte. Im Allgemeinen stimme ich zu, dass es eine gute Idee ist, die neuesten API-Funktionen zu verwenden, um Benutzern die beste Benutzeroberflächenerfahrung moderner Betriebssysteme zu bieten und für ältere Systeme altmodisches Design zu verwenden. Im Moment bleibe ich auf einfache Lösung (Code folgt), aber wenn jemand den Code mit Unterstützung der Benutzeroberfläche für moderne OS teilen, wird es nett sein.
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;
Die 'SHMessageBoxCheck'-Funktion ist der Windows-übliche Weg. – TLama
SHMessageBoxCheck scheint nicht von XP –
@David unterstützt zu werden, nur um es gerade zu testen. Uhm, vielleicht fehlt nur der Export davon ... (daher der Weg, den RBA benutzt) – TLama