2013-08-22 2 views
7

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; 
+3

Die 'SHMessageBoxCheck'-Funktion ist der Windows-übliche Weg. – TLama

+0

SHMessageBoxCheck scheint nicht von XP –

+0

@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

Antwort

12

Sie können our Open Source SynTaskDialog unit verwenden.

Windows bietet einen allgemeinen Task-Dialog, der seit Vista/Seven verfügbar ist. Aber es gibt keine verfügbaren mit früheren Versionen von Windows, d. H. Windows XP oder 2K.

Dieses Gerät (lizenziert unter einer MPL/GPL/LGPL Tri-Lizenz) wird die neue TaskDialog API unter Vista/Seven verwenden und es mit reinem Delphi-Code und Standard-VCL-Komponenten unter XP oder 2K emulieren. Es unterstützt Delphi 6 bis XE4 und ist Win32/Win64 Unicode-fähig. Hier

ist das Ergebnis unter einem Windows Seven 64-Bit-Computer:

enter image description here

Und hier ist der gleiche Dialog aus unserem emuliert reinen Delphi-Code erstellt:

enter image description here

Da diese Screenshot wurde auf einem Win 7-Rechner erstellt, das Styling ist für dieses Betriebssystem nativ. Wenn die emulierte Version des Dialogfelds unter XP ausgeführt wird, wird sie in einem für dieses Betriebssystem nativen Stil angezeigt.

Sie haben Ihr Kontrollkästchen "Beim nächsten Mal nicht nach dieser Einstellung fragen" ...und möglicherweise viel mehr!

+0

Sehr schön! Dies scheint eine gute Möglichkeit zu sein, Plattformbeschränkungen zu vermeiden. Natürlich können wir bald die XP-Kompatibilität vergessen. –

+0

@Arnaud Wäre es nicht besser, einen XP-Stil Dialog auf XP zu verwenden. Vista-Styling auf XP zu bringen, wird meiner Meinung nach sehr komisch aussehen. Ich empfehle Ihnen jedoch, eine so nützliche Software zur Verfügung zu stellen. –

+3

@DavidHeffernan Dieses Gerät verwendet den XP-Stil unter XP. Tatsächlich wurde der obige Screenshot unter Seven aufgenommen, aber erzwang Emulation. Es verwendet nur native VCL-Komponenten (wie TBitBtn oder so), so dass es auf jedem System nur nativ aussieht. –

5

Das System nativen Funktionen, die solche Einrichtungen bietet, ist die task dialog API in Vista eingeführt. Auf diese Weise können Sie wesentlich leistungsfähigere Dialoge anzeigen als mit der älteren MessageBox-API.

Sollten Sie XP unterstützen müssen, müssen Sie einen eigenen Dialog erstellen. Zum Beispiel durch Ableiten von TForm und Aufrufen von ShowModal. Wenn Sie dies tun, können Sie das Formular dynamisch erstellen. Mach nicht ein Formular pro Nachricht, die du zeigst!

In meiner Codebasis habe ich meine eigene Wrapper der Task-Dialog-API. Dies erkennt zur Laufzeit Versionen von Windows, die keinen Taskdialog unterstützen und greift auf ein benutzerdefiniertes Delphi-Dialogfeld zurück.

In Bezug auf SHMessageBoxCheck würde ich vorsichtig sein, eine Abhängigkeit davon zu nehmen. Laut seiner Dokumentation wird es nicht über XP hinaus unterstützt, und Sie müssen es nach Ordnungszahl importieren. Ich persönlich wäre besorgt, dass es möglicherweise von einer zukünftigen Windows-Version gelöscht wird. Dennoch hat MS eine lange Erfolgsbilanz dabei, alles zu tun, um Legacy-Apps mit neuen OS-Versionen arbeiten zu lassen.

+0

Ich liebe meine -1 hier. Irgendeine Erklärung? –

+0

Jemand hat die Antwort nicht verstanden ... oder gelangweilt ... oder .... – RBA

+0

@David Könnten Sie bitte Code des Wrappers teilen Sie verwenden? –