Como usar o WITH

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar o WITH

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar o WITH

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Como usar o WITH

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar o WITH

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar o WITH

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar o WITH

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como usar o WITH

Mensagem por asimoes »

Eu também gostei, vou adotar nos meus códigos.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder