skn Novato

Registrado: Quinta-Feira, 20 de Julho de 2017 Mensagens: 4
|
Enviada: Ter Ago 22, 2017 12:08 pm Assunto: Atualização de componentes após requisição HTTP (FireMonkey) |
|
|
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? |
|