Página 1 de 1

Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 10:11
por wesley assis
Prezados,

Estou passando meus programas clipper para Tela Grafica MiniGui. Eu preenchia e inicializava as variáveis automaticamente com o nome do campo DBF precedido de uma letra: exemplo wNOME, donde o NOME é o nome do campo. Como faço para inicializar por exemplo se tenho minha tela de nome Win_1? No braço digitaria uma por uma como a seguir
Win_1.WCodem.Value := ' ' // CODEM é nome do campo DBF
Win_1.WNoem.Value := ' ' // Noem é o nome do campo DBF
Win_1.WData.Value := ctod(" ") // Data
...

Abaixo o programa fazia a Macro substituição com & (i comercial), só que no minigui não aceita o (.) ponto na varíavel.

Código: Selecionar todos

PROCEDURE INIC_VAR
A=FCOUNT()
FOR I=1 TO A
    IF TYPE(FIELD(I))<>'M'
       NOMECAMPO=FIELD(I)
       NOMEVAR='W'+NOMECAMPO
       PUBLIC &NOMEVAR
       DO CASE
          CASE TYPE(FIELD(I))='C'
             &NOMEVAR=SPAC(LEN(&NOMECAMPO))
          CASE TYPE(FIELD(I))='N'
             &NOMEVAR=0
          CASE TYPE(FIELD(I))='D'
             &NOMEVAR=CTOD('')
          CASE TYPE(FIELD(I))='L'
             &NOMEVAR=.F.
       ENDCASE
    ENDIF
NEXT
Abraço

Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 10:46
por Pablo César
Wesley, veja se dá certo eu não testei:

Código: Selecionar todos

FOR I=1 TO FCOUNT()
    IF TYPE(FIELD(I))<>'M'
       SetProperty( "Win_1", "W"+FIELDNAME(I), "Value", VQValor(I) )
    ENDIF
NEXT

Function VQValor(n)
DO CASE
   CASE TYPE(FIELD(n))='C'
        xRet:=SPACE(FieldSize(n))
   CASE TYPE(FIELD(n))='N'
        xRet:=0
   CASE TYPE(FIELD(n))='D'
        xRet:=CTOD('')
   CASE TYPE(FIELD(n))='L'
        xRet:=.F.
ENDCASE
Return xRet

Re: Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 14:13
por wesley assis
Pablo,

Obrigado.
No meu DBF têm 13 campos e mas neste Formulário uso somente 2. Compilou tudo certinho, mas quando vou executar a inclusão, ele exige que todos os 13 campos sejam definidos: Veja o erro: Control: WEnem Of Win_1 Not defined.
Deletei os outros 11 campos do DBF como teste e funcionou perfeitamente (Incluiu, alterou, etc). Ou seja, agora está gerando automaticamente as variaveis de acordo com o DBF, até aí é o que eu quero, mas se eu não atilizá-los no formulário o sistema dá erro com a mensagem acima. Tem como resolver isto?

Outra coisa, como faço pra mostrar o código neste quadro Azul do fórum?

Wesley

Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 15:37
por Pablo César
Oi Wesley, o que passei, serve para atribuir um valor a um objeto como TextBox, por exemplo. Mas antes você precisa criá-lo. E para isso você tem duas formas com DEFINE (seja com código ou por meio da fmg) e a outra através de código com @ lin,col... No entanto se você criou um formulário, terá que transcrever em forma de código para dentro do seu PRG.
Ja se a sua intenção é criar variáveis para alguma utilidade, você pode criar assim, por exemplo:

Código: Selecionar todos

FOR i:=1 TO FCOUNT()
    cTexLabel := 'text'+str(i,1)
    @ (i*20)-10,016 LABEL &cTexLabel WIDTH 368 HEIGHT 20 VALUE VQValor(i) ;
    FONT 'ARIAL' SIZE 10 CENTERALIGN
NEXT i

Function VQValor(n)
DO CASE
   CASE TYPE(FIELD(n))='C'
        cRet:=FieldGet(n)
   CASE TYPE(FIELD(n))='N'
        cRet:=STR(FieldGet(n),8,0)
   CASE TYPE(FIELD(n))='D'
        cRet:=DTOC(FieldGet(n))
   CASE TYPE(FIELD(n))='L'
        cRet:=(IF(FieldGet(n)=.T.,"Sim","Não"))
ENDCASE
Return cRet
No meu DBF têm 13 campos e mas neste Formulário uso somente 2.
Então quer dizer que você não precisaria atribuir todos os campos do dbf, como você mencionou na sua primeira mensagem. Só não entendo o por quê você precisa definir todas essas variáveis ?
Compilou tudo certinho, mas quando vou executar a inclusão, ele exige que todos os 13 campos sejam definidos: Veja o erro: Control: WEnem Of Win_1 Not defined.
Se no seu formulário não estiverem definidos, não tem como atribuir novos valores.
Deletei os outros 11 como teste e funcionou perfeitamente (Incluiu, alterou, etc)
Você remover os campos só para dar certo ?
Ou seja, agora está gerando automaticamente as variaveis de acordo com o DBF
Como eu disse, não está sendo criado variáveis no meu primeiro exemplo, apenas atribuindo valores a um objeto do Win_1
se eu não a atilizar no formulário o sistema dá erro com a mensagem acima. Tem como resolver isto?
Tem que analisar o que você está pretendendo. Sugiro você postar o prg, dbf e o fmg do projeto criado. Zip tudo e anexe a sua próxima mensagem (cómo fazer isso ? Leia este trecho: Clicando aqui)
como faço pra mostrar o código neste quadro Azul do fórum?
Quer dizer como colocar o seu código dentro da exibição para código fontes ? Veja Clicando aqui

Re: Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 16:07
por Toledo
Wesley, só para complementar o exemplo que o Pablo passou e evitar o erro WEnem Of Win_1 Not defined, faça o seguinte:

Código: Selecionar todos

FOR I=1 TO FCOUNT()
    IF TYPE(FIELD(I))<>'M'
       IF IsControlDefined("W"+FIELDNAME(I),"Win_1")
          SetProperty( "Win_1", "W"+FIELDNAME(I), "Value", VQValor(I) )
       ENDIF
    ENDIF
NEXT
Abraços,

Re: Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 16:43
por wesley assis
Pablo,
Então quer dizer que você não precisaria atribuir todos os campos do dbf, como você mencionou na sua primeira mensagem. Só não entendo o por quê você precisa definir todas essas variáveis ?
Há campos que realmente eu não preciso de mostrar em meu formulário, por exemplo, campo DATA e HORA (Data e Hora em que os registros são modificados).
Você remover os campos só para dar certo ?
Sim deletei para ver se os erros eram oriundos destes campos que não estavam no formulário
Como eu disse, não está sendo criado variáveis no meu primeiro exemplo, apenas atribuindo valores a um objeto do Win_1
Sim realmente estou querendo somente atribuir valores a um objeto. Tanto que agradeço a você pela ajuda, pois o programa está funcionando desde quê o formulário tenha os mesmos campos do arquivo DBF.

Abraço

Re: Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 16:53
por wesley assis
Toledo,

Fiz a substituição daquele pequeno código em complemento ao do Pablo, e agora não está dando mensagem de erros. A unica coisa que está acontecendo é que ao incluir, não está limpando as varíaveis. Ele prenche com a que está na linha de GRID.

Muito obrigado antecipadamente.

Wesley Assis

Re: Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 18:05
por Toledo
Wesley, como o Pablo sugeriu, seria melhor você postar aqui o código fonte desta sua rotina de inclusão, assim ficaria mais fácil saber o que está acontecendo.

Abraços,

Re: Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 18:15
por wesley assis
Toledo,

Está funcionando, só que está alimentando a variável ao invés de limpar. Está funcionando como se fosse GetProperty() ao invés de SetProperty().

Mais uma vez obrigado.

Código: Selecionar todos

#include 'minigui.ch'

SET NAVIGATION EXTENDED
FormL := "Win_1"
   Public Incluir := .F.     

SELE 1
IF .NOT. ABRE('CIAS',5,'C')
   @ 22,16
   @ 22,16 SAY 'Arquivo indisponivel. Tecle <Enter>'
   INKEY(0)
   CLOSE DATA
   RETURN
ENDIF
   DEFINE WINDOW Win_1           ;
      AT 0,0               ;
      WIDTH 670            ;
      HEIGHT 460           ;
      TITLE 'Cadastro de Empresas' ;
      MODAL             

      DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 59,35 IMAGESIZE 20,20  FLAT BORDER

         BUTTON PRIMERO       ;
            CAPTION '&Primeiro'   ;
            PICTURE 'primero.bmp' ;
            ACTION ( dBGoTop() , Win_1.grid_1.RecNo := RecNo() ) 

         BUTTON ANTERIOR   ;
            CAPTION '&Anterior'  ;
            PICTURE 'anterior.bmp'   ;
            ACTION ( dBSkip ( -1 ) , Win_1.grid_1.RecNo := RecNo() ) 

         BUTTON SIGUIENTE  ;
            CAPTION '&Proximo'    ;
            PICTURE 'siguiente.bmp'  ;
            ACTION ( dBSkip (1) , if ( Eof() , DbGoBottom() , Nil ) , Win_1.grid_1.RecNo := RecNo() ) 

         BUTTON ULTIMO     ;
            CAPTION '&Ultimo'    ;
            PICTURE 'ultimo.bmp'  ;
            ACTION ( dBGoBottom () , Win_1.grid_1.RecNo := RecNo() )  SEPARATOR 

         BUTTON BUSCAR  ;
            CAPTION '&Pesquisar' ;
            PICTURE 'buscar.bmp'  ;
            ACTION Buscar()

         BUTTON Nuevo    ;
            CAPTION '&Incluir'  ;
            PICTURE 'nuevo.bmp'   ;
            ACTION ( Incluir := .T. , Incluir() )

         BUTTON EDITAR     ;
            CAPTION '&Editar'    ;
            PICTURE 'editar.bmp'  ;
            ACTION If ( BloquearRegistro() , ActivarEdicion() , Nil )

         BUTTON ELIMINAR   ;
            CAPTION 'E&xcluir'  ;
            PICTURE 'borrar.bmp'  ;
            ACTION Eliminar() 


         BUTTON IMPRIMIR   ;
            CAPTION '&Imprimir'  ;
            PICTURE 'imprimir2.bmp' ;
            ACTION Imprimir() 


         BUTTON CERRAR  ;
            CAPTION '&Fechar' ;
            PICTURE 'cerrar.bmp' ;
            ACTION Win_1.release 

      END TOOLBAR

      @ 56,10 GRID grid_1           ;
         WIDTH 190            ;
         HEIGHT 360           ;  
         HEADERS { 'Cód.' , 'Empresa' }  ;
         WIDTHS { 040 , 180 }       ;
         ROWSOURCE "Cias"         ;
         COLUMNFIELDS { 'Codem' , 'Noem' } ;
         ON CHANGE Actualizar() ;
         ON DBLCLICK ( ActivarEdicion() , If ( ! BloquearRegistro() , DesactivarEdicion() , Nil ) )

      @ 56,210 FRAME FRAME_1 ;
         WIDTH 450      ;
         HEIGHT 360           

      @ 66 , 220 LABEL LABEL_1 ;
         VALUE 'Cód:' ;
         WIDTH 80

      @ 66 , 290 TEXTBOX WCodem ;
         MAXLENGTH 01

      @ 96 , 220 LABEL LABEL_2 ;
         VALUE 'Empresa:' ;
         WIDTH 80
      @ 96 , 290 TEXTBOX WNoem ;
         MAXLENGTH 40

      @ 120 , 220 LABEL LABEL_3 ;
         VALUE 'Endereço:' ;
         WIDTH 80
      @ 120 , 290 TEXTBOX WEnem ;
         MAXLENGTH 30

      @ 376,320 BUTTON ACEPTAR ;
         CAPTION 'G&ravar' ;
         ACTION AceptarEdicion()

      @ 376,425 BUTTON CANCELAR ;
         CAPTION 'Cancela&r' ;
         ACTION CancelarEdicion()

   END WINDOW


   DesactivarEdicion()

   Win_1.grid_1.SetFocus

   Win_1.grid_1.RecNo := Cias->(RecNo())
   
   CENTER WINDOW Win_1

   ACTIVATE WINDOW Win_1

   DO LIB_VAR
   CLOSE DATA


RETURN
*------------------------------------------------------------------------------*
PROCEDURE AbrirTablas
*------------------------------------------------------------------------------*

   USE TIPOS INDEX TIPOS SHARED NEW
   SET ORDER TO TAG Cod_Tipo
   GO TOP

   USE CONTACTOS INDEX CONTACTOS SHARED NEW
   SET ORDER TO TAG Apellido
   GO TOP

RETURN
*------------------------------------------------------------------------------*
PROCEDURE CerrarTablas
*------------------------------------------------------------------------------*

   Close Contactos
   Close Tipos

RETURN
*------------------------------------------------------------------------------*
PROCEDURE DesactivarEdicion
*------------------------------------------------------------------------------*

   Win_1.grid_1.Enabled       := .T.

   Win_1.WCodem.Enabled       := .F.
   Win_1.WNoem.Enabled        := .F.
   Win_1.WEnem.Enabled        := .F.

   Win_1.Aceptar.Enabled      := .F.
   Win_1.Cancelar.Enabled     := .F.

   Win_1.ToolBar_1.Enabled    := .T.

   Win_1.grid_1.SetFocus

RETURN
*------------------------------------------------------------------------------*
PROCEDURE ActivarEdicion
*------------------------------------------------------------------------------*

   Win_1.grid_1.Enabled       := .F.
   Win_1.WCodem.Enabled       := .T.      // 12/04/2011
   Win_1.WNoem.Enabled        := .T.      // 12/04/2011
   Win_1.WEnem.Enabled        := .T.      // 12/04/2011

   Win_1.Aceptar.Enabled      := .T.
   Win_1.Cancelar.Enabled     := .T.
   Win_1.ToolBar_1.Enabled    := .F.


   Win_1.Wcodem.SetFocus     // 19/04/2011


RETURN
*------------------------------------------------------------------------------*
PROCEDURE CancelarEdicion()
*------------------------------------------------------------------------------*

   DesactivarEdicion()

   Actualizar()

   UNLOCK

   Incluir := .F.

RETURN
*------------------------------------------------------------------------------*
PROCEDURE AceptarEdicion()
*------------------------------------------------------------------------------*
local nNuevoRecNo

   DesactivarEdicion()

   If Incluir == .T.

      Locate for Codem = Win_1.WCodem.Value   // abaixo   13/04/2011
      If .not. eof()
         MsgExclamation('Código já existe!')
         Cias->( dbGoTo ( Win_1.Grid_1.RecNo ) )
         Unlock
         Win_1.grid_1.Refresh
         Return
      EndIf
      Cias->(DbAppend())
      Incluir := .F.
   else
      Cias->( dbGoTo ( Win_1.Grid_1.RecNo ) )
   EndIf

   nNuevoRecNo := Cias->( RecNo() )

   Cias->Noem   := Win_1.WNoem.Value
   Cias->Codem  := Win_1.WCodem.Value
   Cias->Enem   := Win_1.WEnem.Value

   Win_1.grid_1.Refresh

   If Incluir == .T.
      Win_1.grid_1.RecNo := nNuevoRecNo
   EndIf

   UNLOCK

RETURN


PROCEDURE INIC_VARForm
**********************
FOR I=1 TO FCOUNT()
   IF TYPE(FIELD(I))<>'M'
      IF IsControlDefined ("W"+FIELDNAME(I),"Win_1")
          SetProperty( "Win_1", "W"+FIELDNAME(I), "Value", VQValor(I) )
      ENDIF
   ENDIF
NEXT

Function VQValor(n)
DO CASE
   CASE TYPE(FIELD(n))='C'
        xRet:=SPACE(FieldSize(n))
   CASE TYPE(FIELD(n))='N'
        xRet:=0
   CASE TYPE(FIELD(n))='D'
        xRet:=CTOD('')
   CASE TYPE(FIELD(n))='L'
        xRet:=.F.
ENDCASE
Return xRet


*------------------------------------------------------------------------------*
PROCEDURE Incluir()
*------------------------------------------------------------------------------*

do inic_varForm
*do inic_varForm with "Value"    // Pssando o VALUE como parametro = Value da Propriedade

   ActivarEdicion()

RETURN
*------------------------------------------------------------------------------*
PROCEDURE Actualizar()
*------------------------------------------------------------------------------*

   Cias->( dbGoTo ( Win_1.Grid_1.RecNo ) )

   Win_1.WCodem.Value   := Cias->Codem  
   Win_1.WNoem.Value    := Cias->Noem  
   Win_1.WEnem.Value    := Cias->Enem  
Return
*------------------------------------------------------------------------------*
Function BloquearRegistro()
*------------------------------------------------------------------------------*
Local RetVal

   Cias->( dbGoTo ( Win_1.Grid_1.RecNo ) ) 

   If Cias->(RLock())
      RetVal := .t.
   Else
      MsgExclamation ('Registro Está sendo editado por outro Usuario. Tente mais Tarde')
      RetVal := .f.
   EndIf

Return RetVal
*------------------------------------------------------------------------------*
Procedure Eliminar
*------------------------------------------------------------------------------*
   If MsgYesNo ( 'Confirma Exclusão?')
      IF .NOT. BLOQUEIA(5)
         @ 22,16
         @ 22,16 SAY 'Registro indisponivel'
         INKEY(0)
         return
      ELSE
         DELE
         UNLOCK
         COMMIT
      ENDIF
      Win_1.grid_1.Refresh
   EndIf
Return
*------------------------------------------------------------------------------*
Procedure Buscar
*------------------------------------------------------------------------------*
Local Buscar

   Buscar := Upper ( AllTrim ( InputBox( 'Coloque o código a Pesquisar' , 'Busqueda' ) ) )

   If .Not. Empty(Buscar)

      Locate for Codem = Buscar
      If .not. eof()
         Win_1.grid_1.RecNo := Cias->(RecNo())
      Else
         MsgExclamation('Nao encontrado registros')
      EndIf

   EndIf

Return

PROCEDURE IMPRIMIR()
********************
FORM:= "RDC0951.RTF"       // TESTE
SET PRINT TO
SET PRINT OFF
SET DEVICE TO SCREEN
DO LIB_VAR
IMPRIME:= "WORDVIEW.EXE "+ FORM
RUN (IMPRIME)


RETURN

Inicialização e Preenchimento variável

Enviado: 19 Abr 2011 20:10
por Pablo César
Realmente com o código em mãos, dá pra visualizar melhor as coisas...

Apartir da linha 248 do seu código, onde está a procedure INIC_VARForm, de fato não está considerando como verdadeira a linha 251 em nenhum caso, então não está atribuindo o valor vazio. Isso porque os argumentos não deveriam ser strings. Mas se quiser usá-los terá que usar _IsControlDefined em lugar de IsControlDefined. Veja este tópico no fórum oficial da http://hmgforum.com/viewtopic.php?f=20&t=1275

Então substitua onde na linha 251 diz: IF IsControlDefined ("W"+FIELDNAME(I),"Win_1") substitua por: IF _IsControlDefined ("W"+FIELDNAME(I),"Win_1") (com sub-traço na frente da função), daí irá dar certo. Eu testei e funcionou.

Re: Inicialização e Preenchimento variável

Enviado: 20 Abr 2011 08:14
por wesley assis
Pablo / Toledo,

RESOLVIDO.

Que tenham um bom dia, e obrigado pela paciência.

Wesley Assis