Página 1 de 2

textbox date

Enviado: 29 Jul 2023 16:18
por JoséQuintas
exemplo.png
Eu tento não reclamar, mas é difícil...
É só olhar exemplo...
Coloquei DATE igual no exemplo, e não aceita.
Vamos olhar na IDE.
hmge.png
Legal, resolvido.
d:\github\dlgauto\source>HBMK2 hmge.hbc -w3 -es2 -m -n *.hbp -strip -compr -workdir=c:\temp -q -Id:\fontes\build\
hbmk2: Processing environment options: -comp=mingw
hbmk2: Processing configuration: d:\harbour\bin\hbmk.hbc
Harbour 3.2.0dev (r2307062207)
Copyright (c) 1999-2021, https://harbour.github.io/
dlg_createedit.prg(126) Error E0030 Syntax error "syntax error at '@'"
dlg_createedit.prg(137) Error E0030 Syntax error "syntax error at '@'"
dlg_createedit.prg(149) Error E0030 Syntax error "syntax error at '@'"
3 errors
E agora ? olho aonde ?

É fácil dizer pra olhar exemplo, dizer que tem muito exemplo, que tem IDE, mas e quando nenhum deles ajuda ?

Talvez olhar no fonte da LIB, a InputWindow() ?

Pois é... não é tão simples assim começar do zero.
Quem não sabe, acaba sabendo menos ainda.
O que criei, estilo gerador, é justamente pra coisas desse tipo não fazerem desanimar.

É porque estou usando automático?
ÓTIMO
Isso já resolve pipinos que poderia ter depois.

Mas vamos em frente, de um jeito ou de outro, deve ter alguma saída, e ela vai acabar aparecendo.
Dá pra ir vendo outras coisas.

Alguma idéia ?

Nota: só acrescentei o DATE ou NUMERIC ou CHARACTER, já tentei com mudança de ordem. PARENT ou OF são equivalentes

textbox date

Enviado: 29 Jul 2023 16:37
por JoséQuintas

Código: Selecionar todos

         DO CASE
         CASE aItem[ CFG_FTYPE ] == "N"
            aItem[ CFG_TOBJ ] := "Text" + Ltrim( Str( aItem:__EnumIndex ) )
            @ nRow2, nCol2 TEXTBOX ( aItem[ CFG_TOBJ ] ) ;
               PARENT    ( ::oDlg ) ;
               HEIGHT    20 ;
               WIDTH     aItem[ CFG_FLEN ] * 12 ;
               NUMERIC ;
               VALUE     aItem[ CFG_VALUE ] ;
               MAXLENGTH aItem[ CFG_FLEN ] ;
               FONT      "verdana" SIZE 12 ;
               ON CHANGE Nil
         CASE aItem[ CFG_FTYPE ] == "D"
            aItem[ CFG_TOBJ ] := "Text" + Ltrim( Str( aItem:__EnumIndex ) )
            @ nRow2, nCol2 TEXTBOX ( aItem[ CFG_TOBJ ] ) ;
               PARENT    ( ::oDlg ) ;
               HEIGHT    20 ;
               WIDTH     aItem[ CFG_FLEN ] * 12 ;
               ; // DATE .T. ;
               VALUE     aItem[ CFG_VALUE ] ;
               MAXLENGTH aItem[ CFG_FLEN ] ;
               FONT      "verdana" SIZE 12 ;
               ON CHANGE Nil
         OTHERWISE
            aItem[ CFG_TOBJ ] := "Text" + Ltrim( Str( aItem:__EnumIndex ) )
            @ nRow2, nCol2 TEXTBOX ( aItem[ CFG_TOBJ ] ) ;
               PARENT    ( ::oDlg ) ;
               HEIGHT    20 ;
               WIDTH     aItem[ CFG_FLEN ] * 12 ;
               ; // CHARACTER ;
               VALUE     aItem[ CFG_VALUE ] ;
               MAXLENGTH aItem[ CFG_FLEN ] ;
               FONT      "verdana" SIZE 12 ;
               UPPERCASE ;
               ON CHANGE Nil
         ENDCASE
NUMERIC aceitou antes do VALUE.
Os outros ainda não.

textbox date

Enviado: 29 Jul 2023 21:56
por ivanil
Olá Quintas,

No ide tem o wizard, use uma tabela com todos os tipos de dados depois use o código gerado para seu protótipo.
Tudo é mais simples que parece.

textbox date

Enviado: 29 Jul 2023 23:00
por JoséQuintas
Praticamente foi o que eu fiz.
Mas não aceitou.
O que não testei foi compilar o fonte da IDE pra ver se a IDE tá falando a verdade.

textbox date

Enviado: 29 Jul 2023 23:28
por ivanil
Use a minha IDE, a que você está usando não tem o wizard.

textbox date

Enviado: 29 Jul 2023 23:51
por JoséQuintas
edit.png
É complicado, parece que a minigui faz de tudo pro programador desistir.

textbox date

Enviado: 30 Jul 2023 09:21
por JoséQuintas
Resolvido, deixei pra entender depois.

textbox date

Enviado: 30 Jul 2023 23:17
por ivanil
É complicado, parece que a minigui faz de tudo pro programador desistir.
Como você já viu, ha duas sintaxes para minigui, você esta usando a alternativa e minha preferida, pois você consegue deixar o código enxuto e com uma aparência muito melhor segundo meu ponto de vista.
Seu código está com erros de sintaxe bem aparente, teoricamente misturou as 2 formas ja que não forneceu o valor as propriedades;
Para entender mais a fundo é bom visitar os includes.

na escrita convencional:
@ ... NUMERIC, o include entende que o controle é NUMERIC, então não tem valor ;

Na escrita alternativa, todas as propriedades devem ter um valor, você deixou algumas em branco.

Mencionei acima a possibilidade de enxugar código, veja abaixo uma forma mais curta de seu código

Define TEXTBOX (aItem[CFG_...])
Parent ...
...
NUMERIC aItem[CFG_FTYPE]=="N"
DATE aItem[CFG_FTYPE]=="D"
End TEXTOX

Perceba também que maxlength é para os textbox do tipo carácter, para os numéricos você deveria usar Mascara INPUTMASK, para os campos tipo Date tem um controle mais elegante e cheio de recursos,

Boa sorte no seu projeto.

textbox date

Enviado: 31 Jul 2023 09:35
por JoséQuintas
ivanil escreveu:Mencionei acima a possibilidade de enxugar código, veja abaixo uma forma mais curta de seu código

Define TEXTBOX (aItem[CFG_...])
Parent ...
...
NUMERIC aItem[CFG_FTYPE]=="N"
DATE aItem[CFG_FTYPE]=="D"
End TEXTOX
Pra harbour seria normal, mas quem disse que a LIB aceita isso?
Harbour 3.2.0dev (r2307062207)
Copyright (c) 1999-2021, https://harbour.github.io/
frm_CreateEdit.prg(128) Error E0030 Syntax error "syntax error at 'AITEM'"
Harbour 3.2.0dev (r2307062207)
Copyright (c) 1999-2021, https://harbour.github.io/
frm_CreateEdit.prg(128) Error E0021 Incorrect number of arguments in DATE
Passed: 1, expected: 0
1 error
Pois é, você, programador experiente em minigui, caiu nas "pegadinhas" dela, coisa que deveria funcionar mas não funciona.

textbox date

Enviado: 31 Jul 2023 10:04
por JoséQuintas
Pronto.
Postei minha rotina nos grupos OOHG e MINIGUI.
Incluindo os #ifdef pra chamar a atenção do troço que inventei, que serve pra testar tudo de uma vez.
No momento o fonte é válido pras duas LIBs, então, tem tudo a ver.

textbox date

Enviado: 31 Jul 2023 10:22
por ivanil
Olá Quintas,

Funciona normalmente, não ha pegadinha.

Apenas corrija o código conforme indicado...

Se for usar a sintaxe convencional, tire o valor da propriedade, não existe NUMERIC .T., o proprio NUMERIC é o indicador que o TEXTBOX é NUMERIC

se for usar a forma alternativa, toda a propriedade deve ter um valor, pois o criador do objeto é o "END TEXTBOX"

Grande abraço.

textbox date

Enviado: 31 Jul 2023 10:28
por JoséQuintas
O código está sendo compilado normalmente.

Código: Selecionar todos

         DO CASE
         CASE aItem[ CFG_FTYPE ] == "N"
            aItem[ CFG_TOBJ ] := "Text" + Ltrim( Str( aItem:__EnumIndex ) )
            DEFINE TEXTBOX ( aItem[ CFG_TOBJ ] )
               PARENT ( ::oDlg )
               ROW nRow2
               COL nCol2
               HEIGHT    20
               WIDTH     aItem[ CFG_FLEN ] * 12
               FONTNAME "verdana"
               NUMERIC .T.
               VALUE     aItem[ CFG_VALUE ]
               MAXLENGTH aItem[ CFG_FLEN ]
               ON CHANGE Nil
            END TEXTBOX
         CASE aItem[ CFG_FTYPE ] == "D"
            aItem[ CFG_TOBJ ] := "Text" + Ltrim( Str( aItem:__EnumIndex ) )
            DEFINE TEXTBOX ( aItem[ CFG_TOBJ ] )
               PARENT ( ::oDlg )
               ROW nRow2
               COL nCol2
               HEIGHT    20
               WIDTH     aItem[ CFG_FLEN ] * 12
               DATE .T.
               VALUE     aItem[ CFG_VALUE ]
            END TEXTBOX
         OTHERWISE
            aItem[ CFG_TOBJ ] := "Text" + Ltrim( Str( aItem:__EnumIndex ) )
            DEFINE TEXTBOX ( aItem[ CFG_TOBJ ] )
               PARENT ( ::oDlg )
               ROW nRow2
               COL nCol2
               HEIGHT    20
               WIDTH     aItem[ CFG_FLEN ] * 12
               FONTNAME "verdana"
               VALUE     aItem[ CFG_VALUE ]
               MAXLENGTH aItem[ CFG_FLEN ]
            END TEXTBOX
         ENDCASE
Mas se colocar NUMERIC e DATE juntos dá erro.

textbox date

Enviado: 31 Jul 2023 14:53
por ivanil

Código: Selecionar todos


#include <hmg.ch>
Function Main( )
    Local aStr,a,nRow:=10,cLabel,cContr,cField,cMasc
    DbCreate("Test",{{"Codigo","N",5,0},{"Data","D",8,0},{"dataHora","T",8,0},{"Descricao","C",30,0},{"ativo","L",1,0},{"valor","N",12,4}})
    use Test alias t shared new
    
    T->(DbAppend())
    T->Codigo  := 1
    T->Data    := ctod("01/07/2023")
    T->dataHora:= hb_DateTime()
    T->Descricao:="Test1"
    T->ativo    := TRUE
    
    aStr:=T->(DbStruct())

    
    DEFINE WINDOW MAIN AT 265.5000,660.0000 WIDTH 600 HEIGHT 549  TITLE "" MAIN 
      For each a in aStr
      
        cLabel:="lbl"+a[1]
        cContr:="ctr"+a[1]
        cField:="T->"+a[1]
        
        @ nRow,10 Label &cLabel width 100 height 20 value a[1]+"-"+a[2] Rightalign
        Do case
            case a[2] $"D,@"
                DEFINE DATEPICKER &cContr
                    COL 120
                    ROW nRow
                    FIELD &cField
                    WIDTH 120 
                    TOOLTIP "Field "+a[1]
                    RANGEMIN Date()-30
                    RANGEMAX Date()+90
                    SHOWNONE  .T. 
                    UPDOWN .T.
                    if a[2]="D"
                        DATEFORMAT 'dd/MMM/yyyy'
                    else
                        DATEFORMAT 'dd/MMM/yyyy hh:mm:ss'
                        WIDTH 160
                    endif
                END DATEPICKER 

                           
            case a[2] $"N,C"
                DEFINE TEXTBOX &cContr
                    COL 120
                    ROW nRow
                    FIELD &cField
                    WIDTH 120 
                    TOOLTIP "Field "+a[1]
                    if a[2]="N"
                        NUMERIC TRUE
                        
                        cMasc:=Replicate("9",a[3])
                        if a[4]>0
                           cMasc := StrTran(Transform(val(cMasc),"@e 999,999,999,999"),".",",")+"."+replicate("9",a[4])
                           FORMAT "E"
                        endif
                        INPUTMASK cMasc
                    else
                        MAXLENGTH a[3]
                    endif
                END TEXTBOX 
            case a[2]="L"
                DEFINE CHECKBOX  &cContr
                    COL 120
                    ROW nRow
                    FIELD &cField
                    TOOLTIP "Field "+a[1]
                    TRANSPARENT TRUE
                END CHECKBOX 
        Endcase
        nRow += 30
      Next
    END WINDOW
    Main.Center

    Main.activate()

    REturn .T.


textbox date

Enviado: 31 Jul 2023 15:53
por JoséQuintas

Código: Selecionar todos

             DEFINE DATEPICKER &cContr
                    COL 120
                    ROW nRow
                    FIELD &cField
                    WIDTH 120 
                    TOOLTIP "Field "+a[1]
                    RANGEMIN Date()-30
                    RANGEMAX Date()+90
                    SHOWNONE  .T. 
                    UPDOWN .T.
                    if a[2]="D"
                        DATEFORMAT 'dd/MMM/yyyy'
                    else
                        DATEFORMAT 'dd/MMM/yyyy hh:mm:ss'
                        WIDTH 160
                    endif
                END DATEPICKER 
Isso é outra coisa que eu não sabia, sobre poder usar um IF no meio do comando.
Nem sei se existe exemplo disso, mas se existir, dificilmente iria encontrar.
Mas falta o teste prático, só acredito vendo kkkk

textbox date

Enviado: 31 Jul 2023 16:45
por ivanil
o fonte esta completo... so compilar...