CRUD em AdvPL – Parte 12,5

Introdução

No post anterior, foi inserido o recurso de inserir uma foro 3×4 para cada contato da agenda. Sabe o que faltou ? Sim, remover a foto! Tanto que nem compensa dizer que esta é a parte 13 do CRUD … risos … esta é a parte 12,5 😉

Ajustes na Rotina

Tão simples quanto isso, foi acrescentar o botão para remover a foto. A função alterada foi a ChgImage(). Antes de mais nada eu verifico se já tem uma foto para o contato atualmente posicionado. Caso exista, eu habilito o botão para apagar a foto atual. Caso a eliminação da foto seja confirmada, eu simplesmente gravo uma string em branco no campo IMAGE, limpo o arquivo de cache de visualização da pasta temporária, e mostro a foto padrão do sistema. Vejamos abaixo como ficou a rotina após estes ajustes, as partes inseridas ou alteradas estão em negrito.

STATIC Function ChgImage(oDlg,aBtns,aGets,oBmpFoto)
Local cTitle := 'Escolha uma imagem'
Local oDlgImg
Local cFile := space(50)
Local lOk := .F. , lErase := .F.
Local aFInfo
Local oGet1, oBtn1, oBtn2, oBtn3
Local cMemoImg := AGENDA->IMAGE

DEFINE DIALOG oDlgImg TITLE (cTitle) ;
  FROM 0,0 TO 120,425 PIXEL;
  FONT oDlg:oFont ; // Usa a mesma fonte do diálogo anterior 
  OF oDlg ; 
  COLOR CLR_BLACK, CLR_HBLUE

@ 05,05 GET oGet1 VAR cFile SIZE CALCSIZEGET(50),12 OF oDlgImg PIXEL

@ 25,05 BUTTON oBtn1 PROMPT "Buscar" SIZE 60,15 ;
  ACTION (BuscaFile(@cFile)) OF oDlgImg PIXEL

@ 25,70 BUTTON oBtn2 PROMPT "Ok" SIZE 60,15 ;
  WHEN File(alltrim(cFile)) ; 
  ACTION ( lOk := .T. , oDlgImg:End() ) OF oDlgImg PIXEL

@ 25,135 BUTTON oBtn3 PROMPT "Apagar" SIZE 60,15 ;
  ACTION ( lErase := .T. , oDlgImg:End() ) OF oDlgImg PIXEL

if Empty(cMemoImg)
  // Se o contato nao tem foto, não mostra o
  // botão para apagar a foto 
  oBtn3:Hide()
Endif

ACTIVATE DIALOG oDlgImg CENTER

If lErase
  If MsgYEsNo("Este contato tem uma foto. Deseja apagá-la ?")
    DBSelectArea("AGENDA")
    If DbrLock(recno())
      AGENDA->IMAGE := ""
      DBRUnlock()
      // Limpa ultima imagem desse ID do cache temporário 
      CleanImg(AGENDA->ID)
      // Carrega a imagem default para limpar 
      // o cache do componente de imagem 
      oBmpFoto:Load(,"\temp\tmp_photo_3x4.img")
    Else
      // Nao conseguiu bloqueio do registro
      // Mostra a mensagem e permanece no modo de alteração
      MsgStop("Registro não pode ser alterado, está sendo usado por outro usuário")
    Endif
  Endif
ElseIF lOk
  cFile := alltrim(cFile)
  aFInfo := Directory(cFile)
  If len(aFInfo) > 0 
    If aFInfo[1][2] > ( 128 * 1024) // Até 128 KB
      MsgStop("Arquivo muito grande ("+str(aFInfo[1][2]/2014,8,2)+" KB)","Imagem maior que 128 KB")
      return 
    Endif
  Else
    MsgStop('Arquivo não encontrado',cFile)
    return 
  Endif
  
  // Chegou ate aqui, atualiza o campo memo 
  If !empty(cMemoImg)
    lOk := MsgYEsNo("Este contato já tem uma foto. Deseja substituí-la ?")
  Endif

  If lOk
    // Lê a imagem do disco 
    cMemoImg := ReadFile(cFile)
    If empty(cMemoImg)
      // Imagem vazia, houve falha na leitura 
      Return
    Endif
    DBSelectArea("AGENDA")
    If DbrLock(recno())
      // Troca conteudo da imagem no Banco de Dados 
      AGENDA->IMAGE := cMemoImg
      DBRUnlock()
      // Limpa ultima imagem desse ID do cache temporário 
      CleanImg(AGENDA->ID)
      // Carrega a imagem default para limpar 
      // o cache do componente de imagem 
      oBmpFoto:Load(,"\temp\tmp_photo_3x4.img")
      // Agora Mostra a nova imagem do contato 
      ShowImg(oBmpFoto)
      // E Avisa que a imagem foi trocada com sucesso 
      MsgInfo("Imagem atualizada.")
    Else
      // Nao conseguiu bloqueio do registro
      // Mostra a mensagem e permanece no modo de alteração
      MsgStop("Registro não pode ser alterado, está sendo usado por outro usuário")
    Endif
  Endif
Endif
Return

Aproveitei para aumentar o campo para informar o nome do arquivo para 50 caracteres, com apenas uma alteração nos parâmetros da função cGetFile(), podemos escolher uma imagem em uma pasta do disco onde o SmartClient está sendo executado, sem alterar mais nenhuma linha de código.

Conclusão

Agora sim a manutenção da imagem dos contatos está completa. Agora, vou voltar pra “prancheta” e ver o que mais dá pra incrementar na Agenda! Daqui a pouco eu atualizo o GIRHUB com o código atualizado.

Agradeço desde já a audiência, curtidas e comentários, e desejo a todos TERABYTES DE SUCESSO 😀

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s