Ir para conteúdo
  • Cadastre-se

dev botao

Compatibilidade ACBrECF + Firemonkey


Data Lider
  • Este tópico foi criado há 3010 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom, depois de muitas horas, consegui colocar para funcionar a função de procurar porta no Firemonkey. Não tive a oportunidade de testar todo o componente, mas pelo que pude verificar a única coisa que impedia ele de funcionar como deveria era o formulário de diálogo do ACBrECF. Então venho aqui trazer as modificações e suas justificativas.

Observações

  • Todas as alterações foram testadas em uma impressora DARUMA MACH 2.
  • A versão do Delphi foi XE8 Trial, muito provável alguma coisa ou outra não vá funcionar em XE5-XE2 sem alguma alteração muito pequena.(talvez apenas tipos).
  • Foi adicionado um IFDEF VER290(XE8) , cabe a alguém testar em versões anterior e verificar o funcionamento.

Novas USES (Somente FMX)

  • System.Character - Utilizada para conversão em variáveis do tipo CHAR.
  • System.Types       - Utilizada para utilização em run-time de variáveis do tipo TRectF em canvas do Firemonkey.
  • System.UIConsts  - Utilizada para conversão de variáveis do tipo cor do Firemonkey (TAlphaColor).

Problemas Encontrados

  • Não era possível exibir formulários em run-time no firemonkey, apresentava erro de resource, a solução foi utilizar o CreateNew:
    {$IFNDEF FMX}
    fsFormMsg := TForm.create( Application ) ;
    {$ELSE}
    fsFormMsg := TForm.CreateNew( Application ) ;
    {$ENDIF}
  • A cor de fundo do formulário não era alterada:
fsFormMsg.Fill.Kind          := TBrushKind.Solid;
  • As propriedades da fonte como também sua cor não era possível de serem alteradas (foi adicionado uma tarefa por vocês para futuro). Uma observação é que a propriedade "TagStr",é presente em todos os componentes Firemonkey.
<b>ACBrECF.pas</b> - Adicionado nova propriedade para cor de fonte apenas para o firemonkey
 property FormMsgColorFont : TAlphaColor read  fsFormMsgColorFont write fsFormMsgColorFont ;

//Realiza composição das 3 informações em apenas 1 tag
fsFormMsg.TagString          := ECF.FormMsgFonte.Size.ToString + ';'
                              + ECF.FormMsgFonte.Family + ';'
                              + AlphaColorToString(ECF.FormMsgColorFont);
                              

<b>ACBrECFClass.pas</b> - Depois é desmontada para leitura das informações
        
//Carregando informações da fonte, family e cor
with TStringList.Create do
    try
      StrictDelimiter := True;
      Delimiter := ';';
      DelimitedText := fsFormMsg.TagString;
      fsFormMsg.Canvas.Font.Size := Strings[0].ToSingle;
      fsFormMsg.Canvas.Font.Family := Strings[1];
      fsFormMsg.Canvas.Fill.Kind := TBrushKind.None;
      fsFormMsg.Canvas.Fill.Color := StringToAlphaColor(Strings[2]);
    finally
      Free;
    end;


  • A rotina de desenho não estava adequada para o Firemonkey.
       fsFormMsg.Width := Round(fsFormMsg.Canvas.TextWidth(Texto)) + 25;
       fsFormMsg.Height := Round(fsFormMsg.Canvas.TextHeight(Texto))+ 15;
       Application.ProcessMessages; //Se não adicionar essa linha, o firemonkey não faz a pintura o texto.
       fsFormMsg.Canvas.BeginScene; //Todo canvas no firemonkey é necessário este bloco de proteção.
       try
          fsFormMsg.Canvas.StrokeThickness := 1; //Espessura do pincel.
          fsFormMsg.Canvas.FillText(TRectF.Create(0, 0, fsFormMsg.Width, fsFormMsg.Height), Texto, True, 100, [], TTextAlign.Center, TTextAlign.Center);
       finally
         fsFormMsg.Canvas.EndScene;
       end;
  • Por ultimo, e não menos importante, a rotina de pressionar a tecla para cancelar o dialogo não estava funcionando, o código informado não atende a situações diversas que o Firemonkey apresenta no OnKeyDown. O Firemonkey quando pressionado por uma tecla que não é dita como especial, a variável KeyChar é preenchida, porem se você utilizar uma tecla como F1 ou ENTER o KeyChar fica em branco, então o Key é preenchido.
    if (fsFormMsgTeclaParaFechar <> 0)  and (fsFormMsgEstado <> fmsAbortado) then
    begin
      if (KeyChar <> #0) and (Integer(KeyChar.ToUpper) = fsFormMsgTeclaParaFechar) then
        fsFormMsgEstado := fmsAbortado
      else if (Key > 0) and (Key = fsFormMsgTeclaParaFechar) then
        fsFormMsgEstado := fmsAbortado
      else
      begin
        Key := 0;
        KeyChar := #0;
      end;
    end;
 

 

ACBrECFClass.pas

ACBrECF.pas

Editado por Data Lider
  • Curtir 1

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

Bom dia, obrigado pela contribuição, mas no FMX não usaremos o Form, o melhor é criar um evento e deixaremos assim para cada uma cria o seu form o jeito que precisar e dispara-lo.

Se tiver interesse em trabalhar nesse sentido, só depois me mandar que avalio para subir.

  • Curtir 1

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Bom Dia, bom, de qualquer maneira fica o exemplo para quem não quiser criar o próprio formulário. Porque na VCL não permite criar o próprio formulário também?

Eu penso no seguinte, fica mais simples para o usuário ter um componente que pode ser testado sem intervenção, se ele quiser personalizar a mensagem, então ele utiliza o recurso (que tem que ser implementado ainda), mas seria interessante mantar o código alterado para quem não quer se preocupar com esses detalhes. Até para quem está migrando da VCL e já está acostumado com o tipo de mensagem trabalhada pela ACBr.

Você realmente acha um problema mantar os dois modos ?

Editado por Data Lider

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

21/08/2015 - 13:12 - Atualização

Boa tarde Isaque, conforme sugerido, eu fiz as alterações, porém mantive também o padrão VCL no FMX. Uma observação é que visando mantar poucas alterações para chegar ao resultado, e evitar vazamento de memória, mantive a linha que libera o formulário após a utilização, portanto o formulário que será enviado pelo usuário será estanciado no momento da utilização.

Para sua sugestão foram criados dois eventos:

  • OnCriarFormMsg - Utilizado para anexar o formulário que o usuário quiser ao componente no momento da chamada do procedimento FormMsgDoProcedure.
  • OnDrawFormMsg - Utilizado no momento que a mensagem é enviada para ser desenhada, FormMsgPinta.

O exemplo de utilização é:

  TForm1 = class(TForm)
    ACBrECF1: TACBrECF;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ACBrECF1CriarFormMsg(var CustomForm: TForm);
    procedure ACBrECF1DrawFormMsg(const Mensagem: string);
  private
    { Private declarations }
  public
    { Public declarations }
     Msg: TForm2; //O tipo é do meu formulário personalizado.
  end;
  
  //#############################################################
  
procedure TForm1.ACBrECF1CriarFormMsg(var CustomForm: TForm);
begin
  Msg := TForm2.Create(Self); //Essa variável será liberada após uso
  CustomForm := Msg;
end;

procedure TForm1.ACBrECF1DrawFormMsg(const Mensagem: string);
begin
  {Posso enviar para um TText ou TLabel, Canvas ou mesmo chamar
   um procedimento próprio que trata a mensagem. }

  Msg.Text1.Text := Mensagem; 
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if  not ACBrECF1.AcharPorta then
   ShowMessage('Falha')
 else
   ShowMessage(ACBrECF1.Porta);
end;

Os dois modos foram testados e estão funcionando corretamente, por padrão o funcionamento é utilizando o formulário igual o da VCL, se o usuário quiser ativar o recurso de formulário personalizado basta utilizar os eventos, ficou muito simples. Para ver um formulário personalizado com o logo da ACBr piscando clique no link https://youtu.be/hvHZnLyM9vE

Qualquer dúvida estou a disposição, os novos arquivos estão em anexo.

ACBrECFClass.pas

ACBrECF.pas

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

Durante os testes achei um problema que a primeira vista parece ser na conexão, porém é na seguinte linha de código:

        {$IFDEF FMX}
        Application.MainForm.BringToFront ;
        {$ELSE}
        Application.BringToFront ;
        {$ENDIF}

Quando é utilizada formulários que são exibidos antes do principal, como splash, configuração de conexão etc.. a variável MainForm ainda não foi contemplada com o formulário, a correção foi:

          {$IFDEF FMX}
          if Assigned(Application.MainForm) then
            Application.MainForm.BringToFront ;
          {$ELSE}
          Application.BringToFront ;
          {$ENDIF}

Arquivo completo com a alteração em anexo.

ACBrECFClass.pas

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

Bom dia, ótimo trabalho, se possível converta o ACBrECF Demo para FMX, para que consigamos mais testes.

Vou baixar suas implementações, mas eu mesmo para ajudar mais teria que ter algo real como o Demo para testar também, senão fica difícil de te ajudar mais.

Você realmente acha um problema mantar os dois modos ?

Não pelo contrário, se for bem testado e funcional podemos deixar.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

colaboração disponível no repositório do Trunk2

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Bom dia, ótimo trabalho, se possível converta o ACBrECF Demo para FMX, para que consigamos mais testes.

Vou baixar suas implementações, mas eu mesmo para ajudar mais teria que ter algo real como o Demo para testar também, senão fica difícil de te ajudar mais.

Você realmente acha um problema mantar os dois modos ?

Não pelo contrário, se for bem testado e funcional podemos deixar.

Foi meio trabalhoso porque o aplicativo parece pequeno, mas não é, são muitas abas para desenhar e tudo mais. Porém conforme sugerido, eu tirei a madrugada de hoje para fazer a conversão, pouca coisa foi testada, mas o básico já foi testado. Estou postando o anexo logo, para caso alguém queira prosseguir, eu somente vou poder dar continuidade da aqui 1 ou 2 semanas.

O que falta ? (Já está funcionando, e operando, são apenas pendências).

  • Adicionar os eventos já convertidos aos seus respectivos itens do TMainMenu (20 minutos).
  • Testar todas as rotinas.
  • O código do TWebBrowser foi comentado, a pesar de existir o componente para o firemonkey, o código precisa ser atualizado.

O que foi testado ?

  • Comunicação
  • Mensagens (PopUp Msg).
  • Relatórios (Leitura X etc..)

obs: Quem for testar, lembrar que a ACBr.INC tem que ser modificada para testar no firemonkey.

Projeto completo em anexo.

ACBrECF_DEmo.thumb.png.df79fcbd5b4162585

 

Firemonkey.zip

  • Curtir 1

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

colaboração disponível no repositório do Trunk2

Prezado, quando fiz a compilação do meu PAF, me deparei com os seguintes arquivo sem conversão para firemonkey, no caso os diálogos.

  • ACBrBase (ACBrComum).
  • ACBrECFNaoFiscal (ACBrSerial).
  • ACBrECFSchalter (ACBrSerial).
  • ACBrECFSweda (ACBrSerial).

Os arquivos foram alterados e estão compilando normalmente agora. Já utilizando Trunk 2.

ACBrComum e ACBrSerial.zip

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

Aplicado no SVN, e obrigado pela conversão do ECFTest, vou baixar e subi-lo, assim podemos ir implementando aos poucos se faltar algo, excelente trabalho.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Foi fazer o teste no XE5 mas me deparei com muitos erros ao abrir o exemplo do acbr.

Os componentes ficaram fora do lugar e faltando muitas declarações de componentes ou até inexistes

O Firemonkey pode ser dividido em duas fases, XE2 até XE6 e XE7 até XE8, a criação foi realizada para a segunda geração.

Como dito no tópico, nem todos os eventos foram vinculados ao TMainMenu, seria muito interessante se você que dispõe da versão XE5 cria-se outra variante do projeto para a primeira geração do Firemonkey além de vincular os restantes dos eventos, seria de grande ajuda, toda colaboração é bem vinda. Sem contar que é mais simples descer uma versão FMX2 para FMX1 do que fazer VCL toda para FMX.

O XE7 foi um divisor de aguas em termos de dispositivo móvel, grandes alterações em classes que não eram alteradas desde o XE2, além da adição da propriedade "FMX.Edit.TEdit.ControlType" que trouxe mais competitividade para aplicativos no ANDROID e IOS criados no Delphi, que antes sofriam com desempenho. Isso é um assunto grande, mas contamos com sua colaboração.

Editado por Data Lider

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

aqui na empresa eu uso o XE5 e o estamos migrando para 8 vou dar uma olhada no projeto novamente. Os projetos aberto no XE5 funciona perfeitamente no XE8 ja fiz alguns testes.

O Interessante é que alguns componentes do ACBr rodasse para o mobile ja comecei a a fazer alguns teste anteriormente mas tive alguns problemas e dei uma parada nos teste.

Link para o comentário
Compartilhar em outros sites

Isaque, durante uma inicialização hoje no desenvolvimento, o nosso aplicativo não identificou a ECF, porém no ACBr demo para o firemonkey estava identificando, investigando o componente, tinha mais uma linha com o MainForm sem a verificação de NIL, então adicionei, se puder subir novamente. Obrigado.

   Result := (ExibeMensagem or BloqueiaMouseTeclado) and
              (AguardaImpressao or ((TimeOut - TempoInicioMsg) > 1) ) and
              FormMsgControla and
              {$IFDEF FMX} Assigned(Application.MainForm) and Application.MainForm.Visible{$ELSE} Application.ShowMainForm{$ENDIF} ;

Eu verifiquei o resto do arquivo e o ACBrECF.pas e não existe outra chamada do tipo, era para eu ter adicionado em todas as outras chamadas quando eu corrigi esse erro  anteriormente, falha minha.

ACBrECFClass.pas

Editado por Data Lider

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

Feito, e disponível no SVN.

  • Curtir 1

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Desculpe, agora sim.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

  • 4 meses depois ...

Meio atrasado, mas segue os arquivos com os eventos vinculados e aparentemente quase tudo funcionando, a parte do WebBrowser só com mais tempo. Correção do DPR da venda frenética. A maioria das alterações estão no FMX.

Projeto ECFTeste.dpr (Firemonkey)

ECFTeste.dpr

ECFTeste1.fmx

ECFTeste1.pas

Editado por Data Lider

 www.datalider.com.br - [email protected] - Macgayver Armini

 

Link para o comentário
Compartilhar em outros sites

Opa, muito bom, obrigado.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3010 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...