Newsgroup: it.comp.lang.delphi
Titolo: MessageDlg e bottone selezionato di default

Nei miei programmi faccio largo uso della funzione MessageDlg, favorito dal
wizard apposito delle gexperts (
http://www.gexperts.org/
) che mi permette di
avere messaggi personalizzati in tempo zero.
Purtroppo c'e' un punto assai critico di un mio programma dove faccio una
domanda all'utente (risposte: si,no) e vorrei evitare che una veloce doppia
pressione del tasto invio fosse bypassante.
Mi chiedo se qualcuno sa come modificare l'ordine con cui vengono presentati i
bottoni nel message dialog, oppure come porre il focus su un determinato
pulsante.
Devo forse abbandonare la funzione in oggetto e scendere al livello API della
MessageBox?
-- 
Morde. 
(
mo...@despammed.com
)

 un determinato pulsante.
credo proprio che con la MessageDlg non ci sia nulla da fare perchè fa uso 
di una funzione helper interna
function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons): TForm;
///////////////......
    if mbOk in Buttons then DefaultButton := mbOk else
      if mbYes in Buttons then DefaultButton := mbYes else
        DefaultButton := mbRetry;
    if mbCancel in Buttons then CancelButton := mbCancel else
      if mbNo in Buttons then CancelButton := mbNo else
        CancelButton := mbOk;
Io per comodità mi sono scritto queste semplicissime funzioni:
function InterrogativeMessageBox(const Msg: string;
  const Button2Default: Boolean = False): Boolean;
var
  o: Word;
begin
  if Button2Default then
    o:= MB_DEFBUTTON2
  else
    o:= MB_DEFBUTTON1;
  Result:=
    (Application.MessageBox(
    PChar(Msg),
    PChar(Application.Title),
    MB_YESNO + MB_ICONQUESTION + o) = IDYES);
end;
procedure WarningMessageBox(const Msg: string);
begin
  Application.MessageBox(PChar(Msg),
    PChar(Application.Title),
    MB_OK + MB_ICONWARNING);
end;
procedure ExclamationMessageBox(const Msg: string);
begin
  WarningMessageBox(Msg);
end;
procedure InformationMessageBox(const Msg: string);
begin
  Application.MessageBox(PChar(Msg),
    PChar(Application.Title),
    MB_OK + MB_ICONINFORMATION);
end;
procedure CriticalErrorMessageBox(const Msg: string);
begin
  Application.MessageBox(PChar(Msg),
    PChar(Application.Title),
    MB_OK + MB_ICONERROR);
end;
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 MessageBox?
Con la MessageDlg purtroppo non è possibile avere un tale livello di
personalizzazione del messaggio visualizzato.
Io uso una piccola utility Delphi Speed Tools che mi fornisce vari expert
tra cui appunto quelli relativi alla MessageBox con possibilità di gestire
praticamente al 100% le varie opzioni.
Dovresti trovarla un pò ovunque, al massimo te la mando.
Ciao,
Gianluca.


Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

> Mi chiedo se qualcuno sa come modificare l'ordine con cui vengono
presentati i bottoni nel message dialog, oppure come porre il focus su
un determinatopulsante.
La funzione MessageDlg di Delphi si limita ad utilizzare delle normali
form, costruite ad hoc, quindi puoi rilevare l'handle della finestra,
individuare il controllo figlio specifico (nel tuo caso un bottone) e
cambiarne le proprietà.
Devi farlo ricorrendo a CreateMessageDlg.
Non so se ci sono soluzioni più pratiche, personalmente ho abbandonato
la MessageDlg per la MessageBox di TApplication.

MessageBox?
Aggiungo a tutto quello che è stato detto che, a partire da D7, è
stata aggiunta la unit QDialogs che introduce alcuni overload alla
funzione MessageDlg. Il tutto, strettamente IMHO, in modo molto
confusionario, tant'e' che io l'ho lasciata perdere ;-)
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

MessageBox?
Grazie a tutti i partecipanti del thread: ho ravanato in gg e sono spuntate un
po' di sorpresine man mano che elaboravo il codice.
La soluzione che ho trovato sta in una sola riga (trash):
if Application.MessageBox( 
   'Hai davvero tutti i denti marci ??',
   'Conferma',
   MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION) = mrYes then ...
La somma di quelle tre costanti di sistema mi ha agevolato anche nel far
apparire l'icona col punto di domanda.
Grazie a tutti per gli spunti, mi avete portato ad un'affascinante excursus
nella Dialogs.pas e nella Windows.pas ! 
:-)
-- 
Morde. 
(
mo...@despammed.com
)