ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Atualização de componentes após requisição HTTP (FireMonkey)

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
skn
Novato
Novato


Registrado: Quinta-Feira, 20 de Julho de 2017
Mensagens: 4

MensagemEnviada: Ter Ago 22, 2017 12:08 pm    Assunto: Atualização de componentes após requisição HTTP (FireMonkey) Responder com Citação

Estou desenvolvendo um servidor HTTP, utilizando DataSnap, que vai receber algumas fotos associadas a alguns QR Codes de um app Android.

As fotos são enviadas do Android via JSON juntamente com a lista dos QRCodes associados a elas usando o método PUT. Após serem salvas no banco de dados, o formulário principal deve ser atualizado e mostrar uma galeria de fotos com seus respectivos QRCodes associados.

Segue o código do método AcceptPhotoGroup, responsável por receber as fotos e salvar no banco de dados:

Código:

//TApi é a classe que lida com os métodos do servidor
function TApi.AcceptPhotoGroup(Data: TJSONObject): boolean;
begin
  //Salva as fotos e os QRCodes no banco de dados......

  TPhotoGalleryHelper.UpdatePhotos;

  Result := true; //Retorna true para o Android
end;


O método TPhotoGalleryHelper.UpdatePhotos vai atualizar as informações sobre as fotos e reconstruir a galeria no formulário principal. A galeria é feita de um TGridLayout, onde, pra cada linha da minha consulta SQL, eu adiciono um TLayout com um TImage e um TLabel pra mostrar a quantidade de QRCodes que aquela foto possui associados a ela, segue o código:

Código:

//FrmMain é o meu formulário principal
//GrdPhotos é o TGridLayout

class procedure TPhotoGalleryHelper.UpdatePhotos;
var
  photosDir: string;
  ctrl: TControl;
  i: Integer;
  FLayout: TLayout;
  FPhotos, FQrCodeIcons: TImage;
  FCodesCount: TLabel;
begin
  photosDir := ExtractFilePath(ParamStr(0)) + '\photos';

  i := 0;

  //Apaga tudo dentro do TGridLayout
  while i < FrmMain.GrdPhotos.ControlsCount do
  begin
    if FrmMain.GrdPhotos.Controls[i] is TLayout then
      FrmMain.GrdPhotos.Controls[i].Free
    else
      inc(i);
  end;

  i := 0;

  //DmFotografia.QryPhotos é a query SQL que busca as fotos e a quantidade de QRCodes pra cada uma
  with DmFotografia.QryPhotos do
  begin
    Refresh;

    First;

    while not Eof do
    begin
      //Crio um TLayout
      FLayout := TLayout.Create(FrmMain);
      FrmMain.GrdPhotos.AddObject(FLayout);

      FPhotos := TImage.Create(FrmMain);
      FPhotos.Parent := FLayout;
      FPhotos.Align := TAlignLayout.Top;
      FPhotos.Margins.Bottom := 10;
      FPhotos.Margins.Left := 10;
      FPhotos.Margins.Right := 10;
      FPhotos.Margins.Top := 10;
      FPhotos.Height := 110;
      FPhotos.Tag := FieldByName('id').Value;
      FPhotos.WrapMode := TImageWrapMode.Stretch;
      FPhotos.Bitmap.LoadFromFile
        (Format('%s\%s', [photosDir, FieldByName('url').Value]));
      FPhotos.OnDblClick := PhotoClick;

      //Crio um TLabel com um ícone de QRCode
      FCodesCount := TLabel.Create(FrmMain);
      FCodesCount.Parent := FLayout;
      FCodesCount.Position.X := 10;
      FCodesCount.Position.Y := 126;
      FCodesCount.Width := 161;
      FCodesCount.TextSettings.HorzAlign := TTextAlign.Trailing;
      FCodesCount.TextSettings.FontColor := $FF4C453E;
      FCodesCount.Text := FieldByName('cards').Value;

      FQrCodeIcons := TImage.Create(FrmMain);
      FQrCodeIcons.Parent := FCodesCount;
      FQrCodeIcons.Position.X := 162;
      FQrCodeIcons.Width := 19;
      FQrCodeIcons.Height := 17;
      FQrCodeIcons.Bitmap.LoadFromFile(Format('%s\icon_qrcode.png',
        [ExtractFilePath(ParamStr(0))]));

      Next;

      inc(i);
    end;
  end;

  //Atualizo uma query com um contador do total de fotos
  DmFotografia.QryPhotosCount.Refresh;
end;


O problema é o seguinte: existe um botão no formulário principal que chama a função UpdatePhotos e funciona normalmente, existem outros botões em outros formulários no sistema que também chamam essa função e funciona tudo bem. O único lugar onde ela não funciona bem é dentro do método AcceptPhotoGroup do servidor: algumas imagens não são carregadas direito, às vezes os contadores não são atualizados, às vezes aparece um erro de índice... é bem aleatório os erros que aparecem nesse caso. Ele chega a salvar tudo no banco de dados. Se eu reiniciar o programa, ou clicar nos outros botões de atualizar a galeria, funciona normalmente. Ele só não consegue mostrar essas atualização da galeria logo depois de salvar no método PUT.

Alguém poderia me dar uma ajuda?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB