Caixas de Dialogo no Android com Delphi Xe7
Boa Noite amigos,
Instalei o Delphi xe7, e abri uma aplicação que eu tinha, percebi que o messageDLG não esta funcionando nesta nova versão do Delphi, quando clico em algum botão que possui esta funcao implementada aparece o seguinte erro:
"Blocking dialogs not implemented on this platform"
Alguem teve esse tipo de problema também ?
No aguardo
Instalei o Delphi xe7, e abri uma aplicação que eu tinha, percebi que o messageDLG não esta funcionando nesta nova versão do Delphi, quando clico em algum botão que possui esta funcao implementada aparece o seguinte erro:
"Blocking dialogs not implemented on this platform"
Alguem teve esse tipo de problema também ?
No aguardo
Douglas Lucio
Curtidas 0
Melhor post
Joao Fernandes
24/07/2015
Perfeito Nortsys!
Seu código funcionou perfeitamente, só fiz uma alteração para facilitar minha chamada.
Para chamar ficou mais simples pra mim, por exemplo.
Seu código funcionou perfeitamente, só fiz uma alteração para facilitar minha chamada.
function mensagemConfirmacao(pMensagem : String):TModalResult;
var
MR : TModalResult;
begin
MessageDlg(pMensagem,
System.UITypes.TMsgDlgType.mtConfirmation,
[System.UITypes.TMsgDlgBtn.mbYes,System.UITypes.TMsgDlgBtn.mbNo],
0,
procedure(const AResult: TModalResult)
begin
MR:=AResult;
end);
while MR=mrNone do Application.ProcessMessages;
Result:=MR;
end;
Para chamar ficou mais simples pra mim, por exemplo.
procedure TfrmHome.ListBoxItemSairClick(Sender: TObject);
begin
if mensagemConfirmacao('Deseja fechar?') = mrYes then
Close;
end;
GOSTEI 2
Mais Respostas
Douglas Lucio
23/09/2014
Amigos, pesquisando na internet, achei uma nota da própria embarcadero sobre o assunto,
Consegui fazer da seguinte forma,
[code] MessageDLG (msg, system.UITypes.TMsgDlgType.mtConfirmation, [
system.UITypes.TMsgDlgBtn.mbYes,
system.UITypes.TMsgDlgBtn.mbNo],0,
procedure (const AResult : TModalResult)
begin
case AResult of
mrYes :
Application.Terminate;
end;
end)
/code]
Achei mais complicado, ha outra maneira de se fazer mais fácil?
Abraços.
Consegui fazer da seguinte forma,
[code] MessageDLG (msg, system.UITypes.TMsgDlgType.mtConfirmation, [
system.UITypes.TMsgDlgBtn.mbYes,
system.UITypes.TMsgDlgBtn.mbNo],0,
procedure (const AResult : TModalResult)
begin
case AResult of
mrYes :
Application.Terminate;
end;
end)
/code]
Achei mais complicado, ha outra maneira de se fazer mais fácil?
Abraços.
GOSTEI 0
Hallysson Pereira
23/09/2014
Vide:
http://docwiki.embarcadero.com/RADStudio/XE7/en/What%27s_New_in_Delphi_and_C%2B%2BBuilder_XE7#Dialog_Box_Methods_Support_Anonymous_Methods_to_Handle_Their_Closing
http://docwiki.embarcadero.com/RADStudio/XE7/en/What%27s_New_in_Delphi_and_C%2B%2BBuilder_XE7#Dialog_Box_Methods_Support_Anonymous_Methods_to_Handle_Their_Closing
GOSTEI 0
Nortsys Sistemas
23/09/2014
bom dia Douglas,
eu criei uma função para simplificar:
function MessageBoxSys(MSG:String ; TIPO:TMsgDlgType ; BOTOES:TMsgDlgButtons):TModalResult;
var
MR:TModalResult;
begin
MessageDlg(MSG, TIPO, BOTOES, 0,
procedure(const AResult: TModalResult)
begin
MR:=AResult;
end);
while MR=mrNone do Application.ProcessMessages;
Result:=MR;
end;
Então agora eu uso o "MessageBoxSys" ao invés de "MessageDlg", dessa forma consegui o mesmo efeito do ShowModal;
eu criei uma função para simplificar:
function MessageBoxSys(MSG:String ; TIPO:TMsgDlgType ; BOTOES:TMsgDlgButtons):TModalResult;
var
MR:TModalResult;
begin
MessageDlg(MSG, TIPO, BOTOES, 0,
procedure(const AResult: TModalResult)
begin
MR:=AResult;
end);
while MR=mrNone do Application.ProcessMessages;
Result:=MR;
end;
Então agora eu uso o "MessageBoxSys" ao invés de "MessageDlg", dessa forma consegui o mesmo efeito do ShowModal;
GOSTEI 1
Maicon Wagner
23/09/2014
up !!!
GOSTEI 0
Georges Soares
23/09/2014
Nortsys, Sua função ficou blz, deu certo, obrigado por compartilhar.
GOSTEI 0
Leonardo Alice
23/09/2014
Bom dia a todos.
Obrigado pelas respostas nesse tópico, me ajudaram bastante!
Só tenho uma dúvida... Não tem nenhuma opção para a mensagem vir com título e com aquelas imagens padrões de exclamação, warning, interrogação?
Obrigado!
Obrigado pelas respostas nesse tópico, me ajudaram bastante!
Só tenho uma dúvida... Não tem nenhuma opção para a mensagem vir com título e com aquelas imagens padrões de exclamação, warning, interrogação?
Obrigado!
GOSTEI 0
Luis Paiva
23/09/2014
Boa noite a todos, gostei muito do pots.
Quero aproveitar e tirar uma duvida:
Estou desenvolvendo App's no Delphi 10 Seattle, tem como usar o MessageDlg em português?
Quero aproveitar e tirar uma duvida:
Estou desenvolvendo App's no Delphi 10 Seattle, tem como usar o MessageDlg em português?
GOSTEI 0
Salmo Martins
23/09/2014
Ola Luis Claudio,
bom tenho uma função que possa te ajudar, nela vc pode alterar o caption dos Buttons.
tipos de Buttons: (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
function MessageDlgDefault(Msg :String; AType: TMsgDlgType; AButtons : TMsgDlgButtons;
IndiceHelp : LongInt; DefButton : TModalResult=MrNone) : Word;
Var
I:Integer;
Mensagem:TForm;
Begin
Mensagem:=CreateMessageDialog(Msg, AType, Abuttons);
Mensagem.HelpConText:=IndiceHelp;
With Mensagem Do Begin
For i :=0 To ComponentCount -1 Do Begin
If (Components[i] is TButton) Then Begin
If (TButton(Components[i]).ModalResult=DefButton) Then Begin
ActiveControl:=TWincontrol(Components[i]);
End;
End;
End;
If Atype=mtConfirmation Then Caption := 'Confirmação'
else If AType=mtWarning Then Caption := 'Atenção'
else If AType=mtError Then Caption := 'Erro'
else If AType=mtInFormation Then Caption := 'Informação';
TButton(Mensagem.FindComponent('YES')).Caption := '&Sim';
TButton(Mensagem.FindComponent('NO')).Caption := '&Não';
TButton(Mensagem.FindComponent('ABORT')).Caption := '&Abortar';
TButton(Mensagem.FindComponent('RETRY')).Caption := '&Excel';
TButton(Mensagem.FindComponent('IGNORE')).Caption := '&Ignorar';
TButton(Mensagem.FindComponent('ALL')).Caption := '&Todos';
TButton(Mensagem.FindComponent('HELP')).Caption := '&Ajuda';
TButton(Mensagem.FindComponent('CANCEL')).Caption := '&Cancelar';
TButton(Mensagem.FindComponent('CLOSE')).Caption := '&Fechar';
// Aqui vc pode adicionar mais buttons, vai depender da sua necessidade, os TMsgDlgBtn (Buttons) estão relacionados acima.
End;
Result:=Mensagem.ShowModal;
Mensagem.Free;
End;
Como chamar a Função:
1º:
if(MessageDlgDefault('Deseja gravar parametros?', mtConfirmation, [mbNo, mbYes], 0,mrNo) = mryes) then
begin
// codigo
end;
2º:
MessageDlgDefault('Erro ao gravar parametro',mtError,[mbAbort],0);
3º:
var
Tipo:integer;
begin
Tipo := MessageDlgDefault('Qual opção você deseja?', mtConfirmation, [mbCancel, mbRetry, mbAll,], 0, mrRetry);
If Tipo = mrRetry then
begin
// Codigo
end;
if Tipo = mrall then
begin
//Codigo
end;
end;
bom tenho uma função que possa te ajudar, nela vc pode alterar o caption dos Buttons.
tipos de Buttons: (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
function MessageDlgDefault(Msg :String; AType: TMsgDlgType; AButtons : TMsgDlgButtons;
IndiceHelp : LongInt; DefButton : TModalResult=MrNone) : Word;
Var
I:Integer;
Mensagem:TForm;
Begin
Mensagem:=CreateMessageDialog(Msg, AType, Abuttons);
Mensagem.HelpConText:=IndiceHelp;
With Mensagem Do Begin
For i :=0 To ComponentCount -1 Do Begin
If (Components[i] is TButton) Then Begin
If (TButton(Components[i]).ModalResult=DefButton) Then Begin
ActiveControl:=TWincontrol(Components[i]);
End;
End;
End;
If Atype=mtConfirmation Then Caption := 'Confirmação'
else If AType=mtWarning Then Caption := 'Atenção'
else If AType=mtError Then Caption := 'Erro'
else If AType=mtInFormation Then Caption := 'Informação';
TButton(Mensagem.FindComponent('YES')).Caption := '&Sim';
TButton(Mensagem.FindComponent('NO')).Caption := '&Não';
TButton(Mensagem.FindComponent('ABORT')).Caption := '&Abortar';
TButton(Mensagem.FindComponent('RETRY')).Caption := '&Excel';
TButton(Mensagem.FindComponent('IGNORE')).Caption := '&Ignorar';
TButton(Mensagem.FindComponent('ALL')).Caption := '&Todos';
TButton(Mensagem.FindComponent('HELP')).Caption := '&Ajuda';
TButton(Mensagem.FindComponent('CANCEL')).Caption := '&Cancelar';
TButton(Mensagem.FindComponent('CLOSE')).Caption := '&Fechar';
// Aqui vc pode adicionar mais buttons, vai depender da sua necessidade, os TMsgDlgBtn (Buttons) estão relacionados acima.
End;
Result:=Mensagem.ShowModal;
Mensagem.Free;
End;
Como chamar a Função:
1º:
if(MessageDlgDefault('Deseja gravar parametros?', mtConfirmation, [mbNo, mbYes], 0,mrNo) = mryes) then
begin
// codigo
end;
2º:
MessageDlgDefault('Erro ao gravar parametro',mtError,[mbAbort],0);
3º:
var
Tipo:integer;
begin
Tipo := MessageDlgDefault('Qual opção você deseja?', mtConfirmation, [mbCancel, mbRetry, mbAll,], 0, mrRetry);
If Tipo = mrRetry then
begin
// Codigo
end;
if Tipo = mrall then
begin
//Codigo
end;
end;
GOSTEI 0
Salmo Martins
23/09/2014
Tem mais uma com Timer;
function MessageDlgDefaultTime(Msg :String;tempo:integer; AType: TMsgDlgType; AButtons : TMsgDlgButtons;
IndiceHelp : LongInt; DefButton : TModalResult=MrNone) : Word;
Var
I:Integer;
Mensagem:TForm;
TimerMethod: TNotifyEvent;
procedure UpdateProgressBar(Data: Pointer; Sender: TObject);
var
Mensagem: TForm;
lButton: TButton;
begin
if Sender is TTimer then
begin
if TTimer(Sender).Owner is TForm then
begin
Mensagem := TForm(TTimer(Sender).Owner);
Tempo_Msg:=Tempo_Msg-1;
if Tempo_Msg<>-1 then
begin
Mensagem := TForm(TButton(Sender).Owner);
TButton(Mensagem.FindComponent('YES')).Caption := '&Sim '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('NO')).Caption := '&Não '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ABORT')).Caption := '&Abortar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('RETRY')).Caption := '&Excel '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('IGNORE')).Caption := '&Ignorar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ALL')).Caption := '&Texto '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('HELP')).Caption := '&Ajunda '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('CANCEL')).Caption := '&Cancelar '+inttostr(Tempo_Msg);
end else
begin
Mensagem.ModalResult := mrCancel;
end;
end;
end;
end;
Begin
Form1.Timer7.Enabled:=false;
Tempo_Msg:=tempo;
Mensagem:=CreateMessageDialog(Msg, AType, Abuttons);
Mensagem.HelpConText:=IndiceHelp;
With Mensagem Do Begin
For i :=0 To ComponentCount -1 Do Begin
If (Components[i] is TButton) Then Begin
If (TButton(Components[i]).ModalResult=DefButton) Then Begin
ActiveControl:=TWincontrol(Components[i]);
End;
End;
End;
If Atype=mtConfirmation Then Caption := 'Confirmação'
else If AType=mtWarning Then Caption := 'Atenção'
else If AType=mtError Then Caption := 'Erro'
else If AType=mtInFormation Then Caption := 'Informação';
TButton(Mensagem.FindComponent('YES')).Caption := '&Sim '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('NO')).Caption := '&Não '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ABORT')).Caption := '&Abortar'+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('RETRY')).Caption := '&Excel '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('IGNORE')).Caption := '&Ignorar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ALL')).Caption := '&Texto '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('HELP')).Caption := '&Ajunda '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('CANCEL')).Caption := '&Cancelar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('CLOSE')).Caption := '&Fechar '+inttostr(Tempo_Msg);
End;
if Tempo_Msg> 0 then
begin
with TTimer.Create(Mensagem) do
begin
Name := 'MsgTimer';
Interval := 1000;
end;
TMethod(TimerMethod).Code := Addr(UpdateProgressBar);
TMethod(TimerMethod).Data := mensagem.FindComponent('MsgTimer');
TTimer(mensagem.FindComponent('MsgTimer')).OnTimer := TimerMethod;
end;
Result:=Mensagem.Showmodal;
Form1.Timer7.Enabled:=true;
Mensagem.Free;
End;
Como chamar a função:
MessageDlgDefaultTime('Antes de iniciar iremos atualizar os dados, por favor aguarde!',tempo, mtConfirmation, [mbYes], 0,mrYes);
function MessageDlgDefaultTime(Msg :String;tempo:integer; AType: TMsgDlgType; AButtons : TMsgDlgButtons;
IndiceHelp : LongInt; DefButton : TModalResult=MrNone) : Word;
Var
I:Integer;
Mensagem:TForm;
TimerMethod: TNotifyEvent;
procedure UpdateProgressBar(Data: Pointer; Sender: TObject);
var
Mensagem: TForm;
lButton: TButton;
begin
if Sender is TTimer then
begin
if TTimer(Sender).Owner is TForm then
begin
Mensagem := TForm(TTimer(Sender).Owner);
Tempo_Msg:=Tempo_Msg-1;
if Tempo_Msg<>-1 then
begin
Mensagem := TForm(TButton(Sender).Owner);
TButton(Mensagem.FindComponent('YES')).Caption := '&Sim '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('NO')).Caption := '&Não '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ABORT')).Caption := '&Abortar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('RETRY')).Caption := '&Excel '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('IGNORE')).Caption := '&Ignorar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ALL')).Caption := '&Texto '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('HELP')).Caption := '&Ajunda '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('CANCEL')).Caption := '&Cancelar '+inttostr(Tempo_Msg);
end else
begin
Mensagem.ModalResult := mrCancel;
end;
end;
end;
end;
Begin
Form1.Timer7.Enabled:=false;
Tempo_Msg:=tempo;
Mensagem:=CreateMessageDialog(Msg, AType, Abuttons);
Mensagem.HelpConText:=IndiceHelp;
With Mensagem Do Begin
For i :=0 To ComponentCount -1 Do Begin
If (Components[i] is TButton) Then Begin
If (TButton(Components[i]).ModalResult=DefButton) Then Begin
ActiveControl:=TWincontrol(Components[i]);
End;
End;
End;
If Atype=mtConfirmation Then Caption := 'Confirmação'
else If AType=mtWarning Then Caption := 'Atenção'
else If AType=mtError Then Caption := 'Erro'
else If AType=mtInFormation Then Caption := 'Informação';
TButton(Mensagem.FindComponent('YES')).Caption := '&Sim '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('NO')).Caption := '&Não '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ABORT')).Caption := '&Abortar'+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('RETRY')).Caption := '&Excel '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('IGNORE')).Caption := '&Ignorar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('ALL')).Caption := '&Texto '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('HELP')).Caption := '&Ajunda '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('CANCEL')).Caption := '&Cancelar '+inttostr(Tempo_Msg);
TButton(Mensagem.FindComponent('CLOSE')).Caption := '&Fechar '+inttostr(Tempo_Msg);
End;
if Tempo_Msg> 0 then
begin
with TTimer.Create(Mensagem) do
begin
Name := 'MsgTimer';
Interval := 1000;
end;
TMethod(TimerMethod).Code := Addr(UpdateProgressBar);
TMethod(TimerMethod).Data := mensagem.FindComponent('MsgTimer');
TTimer(mensagem.FindComponent('MsgTimer')).OnTimer := TimerMethod;
end;
Result:=Mensagem.Showmodal;
Form1.Timer7.Enabled:=true;
Mensagem.Free;
End;
Como chamar a função:
MessageDlgDefaultTime('Antes de iniciar iremos atualizar os dados, por favor aguarde!',tempo, mtConfirmation, [mbYes], 0,mrYes);
GOSTEI 0
Ederaldo
23/09/2014
Olá! Salmo Alves Martins.
Sou novo no fórum e no Delphi Ex8. tentei compilar a sua função, mas deu erro na linha:
"Mensagem:=CreateMessageDialog(Msg, AType, Abuttons);"
A mensagem de erro é:
"[dcc32 Error] Unit1.pas(36): E2003 Undeclared identifier: 'createMessageDialog'"
O que está errado?
Saudações.
Obrigado.
Sou novo no fórum e no Delphi Ex8. tentei compilar a sua função, mas deu erro na linha:
"Mensagem:=CreateMessageDialog(Msg, AType, Abuttons);"
A mensagem de erro é:
"[dcc32 Error] Unit1.pas(36): E2003 Undeclared identifier: 'createMessageDialog'"
O que está errado?
Saudações.
Obrigado.
GOSTEI 0
Sysbase Informática
23/09/2014
Bom dia!
Também está ocorrendo o mesmo erro de compilação que deu para o Ederaldo. Constatei que a função 'CreateMessageDialog' é uma função VCL e a compilação para o Android não é possível.
Tem algum forma de contornar este problema?
Saudações,
Rafael Moroni
Também está ocorrendo o mesmo erro de compilação que deu para o Ederaldo. Constatei que a função 'CreateMessageDialog' é uma função VCL e a compilação para o Android não é possível.
Tem algum forma de contornar este problema?
Saudações,
Rafael Moroni
GOSTEI 0