Página 1 de 1

Como usar o WITH

Enviado: 03 Set 2016 20:28
por JoséQuintas
Qual a forma correta de se usar o WITH?
Tentei assim, mas não aceita.

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main

   LOCAL o

   o := MyClass():New()
   WITH o
      :Primeiro := 10
      :Segundo  := 20
      ? :Dobro()
   END WITH

   RETURN

CREATE CLASS MyClass
   VAR Primeiro
   VAR Segundo
   METHOD Dobro() INLINE ::Primeiro * ::Segundo

   END CLASS

Como usar o WITH

Enviado: 03 Set 2016 20:31
por JoséQuintas
Ok, achei um post de 4 anos atrás do kapiaba, aqui no fórum.

Código: Selecionar todos

WITH OBJECT o

Como usar o WITH

Enviado: 03 Set 2016 22:30
por Hasse
Boa noite meu caro Quintas.

Não sei se o amigo fez uma pergunta ou uma afirmação, mas parto do princípio que foi uma pergunta.
Tenho um pequeno aplicativo que lê os dados de uma tabela do banco Oracle:

Código: Selecionar todos

   WITH Object oRecSet
      *
      :cursorType := adOpenForwardOnly                // adOpenForward // adOpenDynamic // adOpenStatic //
      :activeConnection := oConexao
      :cursorLocation   := adUseServer
      :maxRecords       := 100000
      :cacheSize        := 100
      :source           := c_SeleStr
      :open()
      

      // área de leitura
      c_Nome      := :Fields( "NOME" ):Value
     .... etc...



      :MoveNext() 
      *
   END WITH
Assim, pelo pouco que entendo, ele evita que seja necessário repetir a cada linha o nome do objeto.

Acredito que deva ter outras aplicações.

Sds.

Como usar o WITH

Enviado: 04 Set 2016 12:04
por JoséQuintas
Além de menos digitação, tem outro lado interessante, que a gente sempre esquece:

Código: Selecionar todos

   nLini := Max( Int( ( MaxRow() - 10 ) / 2 ), 0 ) + 14 // Conforme posicao do logotipo
   nColi := Max( Int( MaxCol() - 50 ) / 2, 0 )
   oButton := tstPushButton():New()
   oButton:PointerFocus := .F.
   oButton:oImage := {, WVG_IMAGE_BITMAPRESOURCE, "FotoFachada",,1 }
   oButton:Create( , , { -( nLini - 15 ), -( nColi + 10 ) }, { -11, -30 } )
   oButton:lImageResize := .T.
   AppUserName( "" )
   AppUserLevel( 2 )
   @ nLini - 2, nColi + 15 SAY "Free Memory: " + LTrim( Str( Memory( 0 ) / 1024 / 1024 ) ) + " GB"
   Scroll( nLini, nColi, nLini + 2, nColi + 50, 0 )
   @ nLini, nColi TO nLini + 2, nColi + 50

Código: Selecionar todos

   nLini := Max( Int( ( MaxRow() - 10 ) / 2 ), 0 ) + 14 // Conforme posicao do logotipo
   nColi := Max( Int( MaxCol() - 50 ) / 2, 0 )
   oButton := tstPushButton():New()
   WITH OBJECT oButton
      :PointerFocus := .F.
      :oImage := {, WVG_IMAGE_BITMAPRESOURCE, "FotoFachada",,1 }
      :Create( , , { -( nLini - 15 ), -( nColi + 10 ) }, { -11, -30 } )
      :lImageResize := .T.
   END WITH
   AppUserName( "" )
   AppUserLevel( 2 )
   @ nLini - 2, nColi + 15 SAY "Free Memory: " + LTrim( Str( Memory( 0 ) / 1024 / 1024 ) ) + " GB"
   Scroll( nLini, nColi, nLini + 2, nColi + 50, 0 )
   @ nLini, nColi TO nLini + 2, nColi + 50
Já comentei sobre deixar o fonte fácil de fazer manutenção.
À primeira vista, a vantagem do WITH OBJECT é economizar digitação.
Na prática acabamos organizando o fonte pra usá-lo.

Ficou organizada a parte do fonte referente ao button.
Nem precisa inventar de colocar traços, colocar anotações, espaços em branco, etc.

Um fonte organizado, de fácil leitura, é a chave pra tudo.
Tem muita coisa que inventaram pra ajudar nisso, esse WITH OBJECT é uma delas.

Gostei.
Por enquanto 84 blocos melhorados.
withobject.png
No fonte da foto, como exemplo, o que faz parte da QUERY ficou dentro do bloco organizado com WITH OBJECT.

Como usar o WITH

Enviado: 04 Set 2016 12:14
por JoséQuintas
Como recurso adicional, o PNotepad permite fazer o code folding, que é "encolher" o bloco WITH OBJECT, pra ter uma visão melhor do restante do fonte.
Pois é... recursos pra facilitar mexer nos fontes estão aí, é só fazermos uso deles.
withobject2.png

Como usar o WITH

Enviado: 04 Set 2016 12:35
por JoséQuintas
Uia, este relatório usando a classe de PDF, alterado pra WITH OBJECT:

Código: Selecionar todos

   WITH OBJECT oPDF
      :SetType( 3 )
      :nPageWidth    := 80
      :nPageHeight   := 66
      :acHeader      := { "", "IMOVEIS PARA LOCACAO EM " + DToC( Date() ), "" }
      :acHeader[ 3 ] := "QUADRO         IMOVEL                 E N D E R E C O            B A I R R O  "
      :Begin()
      DO WHILE .NOT. Eof()
         :MaxRowTest()
         :DrawText( oPDF:nRow, 3, temp->Numero, "9999" )
         :DrawText( oPDF:nRow, oPDF:nCol + 4, temp->Geral )
         :DrawText( oPDF:nRow, oPDF:nCol + 4, temp->Tipo1 )
         :DrawText( oPDF:nRow, oPDF:nCol + 4, temp->Endereco )
         :DrawText( oPDF:nRow, oPDF:nCol + 4, temp->Bairro )
         :nRow += 1
         SKIP
      ENDDO
      :End()
   END WITH
Se não me engano, daria pra atribuir a variável no WITH OBJECT, vou testar depois:

Código: Selecionar todos

WITH OBJECT oPDF := PDFClass():New()
É... muito lugar onde dá pra usar isso.
Tomar cuidado pra não exagerar... rs

Como usar o WITH

Enviado: 04 Set 2016 13:21
por asimoes
Eu também gostei, vou adotar nos meus códigos.