MessageDlg - como faço para colocar o focus no botão desej.

Delphi

03/12/2003

tudo bem amigos...?

gostaria de saber como faço para colocar o o focus no botão desejado.


Ex.: if MessageDlg(´Deseja atualizar o estoque e a situação de clientes ?´,mtConfirmation,
[mbYes, mbNo],0) = mrYes then

o que acontece é que quando é mostrado a menssagem o boão Yes fica com o focus, gostaria que o botão No é que ficasse, como faço isso...


Obrigado....


Edgriffo

Edgriffo

Curtidas 0

Respostas

Deus

Deus

03/12/2003

Com a função MessageDlg, não há com você fazer isso. Entretanto, você pode criar a sua própria caixa de diálogo, e dizer qual o botão que você quer focalizado. Eu desenvolvi um exemplo, e se você realmente quiser uma caixa de diálgo com essas propriedades, não vai ser tão chato assim implementar. :)

Primeiro, um detalhe: como nós vamos mudar o foco do botão, e ele só pode acontecer após o form estar ativo, teremos que criar um procedimento e uma função no form, chamados

    procedure setaFocoBotao(Sender: TObject);
    function MinhaMessageDlg(sMensagem: String; mtTipo: TMsgDlgType; mbBotoes: TMsgDlgButtons; sBtnFocus: String): TModalResult;


Depois de escrever estas duas linhas dentro do [i:c0f63be738]Type[/i:c0f63be738] no Form, pressione [b:c0f63be738]Shift + Ctrl + C[/b:c0f63be738] para criar as duas funções dentro do Form. O corpo delas então fica:

procedure TForm1.setaFocoBotao(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to Pred((Sender as TForm).ComponentCount) do
    if  ((Sender as TForm).Components[i] is TButton) and
       (((Sender as TForm).Components[i] as TButton).Tag = 1) then
        ((Sender as TForm).Components[i] as TButton).SetFocus;
end;

function TForm1.MinhaMessageDlg(sMensagem: String; mtTipo: TMsgDlgType; mbBotoes: TMsgDlgButtons; sBtnFocus: String): TModalResult;
var
  FormDlg: TForm;
begin
  try
    FormDlg := CreateMessageDialog(sMensagem, mtTipo, mbBotoes);
    FormDlg.OnShow := setaFocoBotao;
    TButton(FormDlg.FindComponent(sBtnFocus)).Tag := 1;
    TButton(FormDlg.FindComponent(sBtnFocus)).Default := True;
    FormDlg.ShowModal;
    Result := FormDlg.ModalResult;
  finally
    FormDlg.Free;
  end;
end;


Criados o procedimento e a função, agora é só chamar como você chamaria uma MsgDlg normal, sendo que com um parâmetro a mais: o caption do botão que você gostaria focalizado. Usando o exemplo que você mesmo deu, ficaria:

if MinhaMessageDlg(´Deseja atualizar o estoque e a situação de clientes ?´, mtConfirmation, [mbYes, mbNo], ´No´) = mrYes then


Espero que não tenha sido muito difícil para você entender o que eu quis dizer. Se ainda houver quaisquer dúvidas a respeito do meu código, pode perguntar que eu respondo. ;)

Espero ter ajudado! ;D Abraços, dEUS!


GOSTEI 0
Michel

Michel

03/12/2003

Colega essa funcao da certinho pra vc !
:o

function CaixaDeDialogo(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; Captions: array of string): Integer;
var
aMsgDlg: TForm;
i: Integer;
dlgButton: TButton;
CaptionIndex: Integer;
begin
aMsgDlg := CreateMessageDialog(Msg, DlgType, Buttons);
captionIndex := 0;
for i := 0 to aMsgDlg.ComponentCount - 1 do
begin
if (aMsgDlg.Components[i] is TButton) then
begin
dlgButton := TButton(aMsgDlg.Components[i]);
if CaptionIndex > High(Captions) then Break;
dlgButton.Caption := Captions[CaptionIndex];
Inc(CaptionIndex);
end;
end;
Result := aMsgDlg.ShowModal;
end;


GOSTEI 0
POSTAR