2013-08-22 20 views
7

In molte finestre di dialogo di conferma è utile avere tale opzione (modo rapido per disabilitare la conferma). Ma non riesco a trovare come farlo. Non voglio progettarlo da solo perché ho bisogno che questa finestra di dialogo sia di tipo standard e non si voglia riprogettare con ogni aggiornamento di Delphi. C'è un modo semplice per usare la finestra di conferma standard di Delphi con tale checkbox?Come utilizzare la finestra di dialogo di conferma standard di Delphi ma con la casella di controllo "Non chiedermelo più"?

UPDATE2. La libreria SynTaskDialog suggerita dal progetto Synopse fa un ottimo lavoro (tutto ciò di cui ho bisogno e anche di più), lo userò nei miei progetti. Grazie!

AGGIORNAMENTO. Quindi, grazie ragazzi per le idee. Funzione di sistema MessageBoxCheck è una soluzione piacevole ma sembra non essere così stabile come dovrebbe essere. In generale, sono d'accordo che è una buona idea usare le ultime funzioni API per fornire agli utenti la migliore esperienza di interfaccia utente dei sistemi operativi moderni e utilizzare un design vecchio stile per i sistemi più vecchi. Al momento rimango in una soluzione semplice (il codice segue), ma se qualcuno condivide il codice con il supporto dell'interfaccia utente per il sistema operativo moderno, sarà bello.

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

La funzione 'SHMessageBoxCheck' è la via più naturale per Windows. – TLama

+0

SHMessageBoxCheck non sembra essere supportato oltre XP –

+0

@David, basta testarlo proprio ora. Uhm, forse manca solo l'esportazione di esso ... (da qui il modo usato nel post di RBA) – TLama

risposta

12

È possibile utilizzare our Open Source SynTaskDialog unit.

Windows fornisce una finestra di dialogo di attività generica disponibile da Vista/Seven. Ma non ce n'è nessuna disponibile con le versioni precedenti di Windows, ad esempio Windows XP o 2K.

Questa unità (concessa in licenza con licenza tripla MPL/GPL/LGPL) utilizzerà la nuova API TaskDialog in Vista/Seven e la emulerà con codice Delphi puro e componenti VCL standard in XP o 2K. Supporta Delphi 6 fino a XE4 ed è pronto per Unicode Win32/Win64.

Ecco il risultato sotto un Windows Seven computer a 64 bit:

enter image description here

E qui è la stessa finestra di dialogo creata dal nostro codice Delphi puro emulato:

enter image description here

Dal momento che questo lo screenshot è stato realizzato su una macchina Win 7, lo stile è nativo per quel sistema operativo. Quando la versione emulata della finestra di dialogo viene eseguita su XP, viene visualizzata in uno stile nativo per quel SO.

Hai la tua casella di controllo "Non chiedere questa impostazione la prossima volta" ...e potenzialmente molto di più!

+0

Molto bello! Questo sembra un buon modo per evitare i limiti della piattaforma. Ovviamente presto potremo probabilmente dimenticare la compatibilità XP. –

+0

@Arnaud Non sarebbe meglio usare una finestra di dialogo in stile XP su XP. Mettere lo stile di Vista su XP sarà molto strano secondo me. Tuttavia, ti lascio a rendere disponibile un software così utile. –

+3

@DavidHeffernan Questa unità utilizza lo stile XP su XP. In effetti, la schermata precedente è stata scattata sotto Seven, ma forzando l'emulazione. Utilizza solo componenti VCL nativi (come TBitBtn o simili), quindi apparirà solo nativo su ogni sistema. –

5

La funzionalità native sistema che offre tali servizi è il task dialog API introdotte in Vista. In questo modo è possibile mostrare finestre di dialogo molto più efficaci rispetto all'API MessageBox precedente.

Se è necessario supportare XP, sarà necessario creare una finestra di dialogo personalizzata. Ad esempio derivando da TForm e chiamando ShowModal. Se lo fai, rendi il modulo capace di costruirsi dinamicamente. Non creare un modulo per messaggio che mostri!

Nella mia base di codice, ho il mio wrapper dell'API della finestra di dialogo delle attività. Questo rileva le versioni di runtime di Windows che non supportano la finestra di dialogo delle attività e ricade su una finestra di dialogo Delphi personalizzata.

Per quanto riguarda SHMessageBoxCheck sarei un po 'cauto di prendere una dipendenza da questo. Secondo la sua documentazione non è supportato oltre XP, e devi importarlo per ordinale. Personalmente temo che possa essere rilasciato da una versione futura di Windows. Detto questo, MS ha una solida esperienza nel fare tutto il possibile per mantenere le app legacy in funzione con le nuove versioni del sistema operativo.

+0

Sto amando il mio -1 qui. Alcuna spiegazione? –

+0

Qualcuno non ha capito la risposta ... o si è annoiato ... o .... – RBA

+0

@David Potresti condividere il codice del wrapper che usi? –