Página 8 de 35

Meu modo de trabalho

Enviado: 16 Jul 2017 17:58
por microvolution
JoséQuintas escreveu:Fiz um teste agora, mas é um controle meu que não existe na GTWVG oficial.
Ainda não coloquei recurso no controle de redimensionar imagem, mas fica igual outras LIBs.
telajpa.png
Parece piada, mas é sério: até criei controles de uso em tela Windows, pra GTWVG, mas eu mesmo não uso.
meu professor, você conseguiu resolver o problema dos textos/imagens que sobrepõem aí no menu e textos?

Meu modo de trabalho

Enviado: 16 Jul 2017 23:53
por JoséQuintas
A saída seria usar menu Windows, e deixar a imagem fixa de fundo, igual outras LIBs fazem.

Meu modo de trabalho

Enviado: 18 Set 2017 18:47
por JoséQuintas
Faltou dizer:
Não precisa, e NEM DEVEM copiar daqui.
É bom tentar comentar com os desenvolvedores das LIBs, porque eles devem fazer os arquivos mais adequados, os meus são só para meus testes, e podem estar errados.

Mesmo assim, estão todos aqui.

https://github.com/JoseQuintas/AllGui

Os fontes das LIBs são originais, mas os HBP e HBC não vieram com as LIBs, então é só pra teste mesmo.
Pra produção é melhor usar os arquivos originais, porque são eles que vão ser usados para suporte.

Mas fica aí a dica, pra cobrar dos autores de suas LIBs.

E podem criar pra fivewin também, no mesmo estilo.

E numa IDE, bastaria a IDE ter arquivos iguais.....

Meu modo de trabalho

Enviado: 31 Jan 2018 19:50
por microvolution
JoséQuintas escreveu:Mas fica aí a dica, pra cobrar dos autores de suas LIBs.
prezado professor, por incrível que pareça, estava num outro tópico onde eu tenho "umas muitas dúvidas" e alguém havia me dado uma pasta (eu perguntando sobre HMG) e que eu não achava... até que o MSDN disse que era referente à HMG-E.

Se o Sr. que é "ninja" está com este montão de "trecos/troços", imagina "euzinho" que estou ainda de fraldas...

Eu, disse no outro tópico, que deveria haver uma união e homogenia entre as LIBs, pois são tantas: HMG, HMGE, OOHG, HWGUI, WVW, VWG, etc... e o que a gente aprende numa - apesar de tudo ser HARBOUR, não é do mesmo jeito na outra...
deveria ser padronizado como são o ABNT e ABNT2, ou ASC e ASCII.

#ficaAdica

Meu modo de trabalho

Enviado: 24 Set 2019 07:35
por juniorcamilo
como pós imagem em modo console?
viewtopic.php?f=43&t=16842&hilit=wvw&start=45

download/file.php?id=2901&mode=view

Meu modo de trabalho

Enviado: 24 Set 2019 09:51
por JoséQuintas
juniorcamilo escreveu:como pós imagem em modo console?
DrawImage(), e depois o texto por cima.
Mas a imagem some se mover tela, minimizar, etc... por isso só usei em teste.

Meu modo de trabalho

Enviado: 24 Set 2019 10:57
por juniorcamilo
estou atrás disso!!!
viewtopic.php?f=4&t=19031#p122172

como será?

Meu modo de trabalho

Enviado: 24 Set 2019 16:37
por JoséQuintas
Vixe.....
HB_FUNC_TRANSLATE( WVG_DRAWTEXT , WAPI_DRAWTEXT )
Nem precisa da GTWVG !!!
No Harbour 3.4 o Viktor transferiu a função, que é da API Windows pra hbwin.

Ta aí uma coisa interessante:
No 3.2, a função está na GTWVG, mas era pura API Windows
No 3.4, o Viktor padronizou e moveu a função pra HBWIN, que contém rotinas do Windows.

Diferença?
É API Windows... nem precisa GTWVG.
IGUAL EM QUALQUER LIB GRÁFICA.

Tão entendendo o que digo sobre padronizar LIBs?
O que era GTWVG... que era API Windows... foi para o lugar certo.
Igual todas as LIBs poderiam fazer, e ficaria muito mais padronizado !!!!

Meu modo de trabalho

Enviado: 24 Set 2019 16:39
por JoséQuintas
/* mappings to hbwin */
HB_FUNC_TRANSLATE( WVG_APPENDMENU , WAPI_APPENDMENU )
HB_FUNC_TRANSLATE( WVG_BRINGWINDOWTOTOP , WAPI_BRINGWINDOWTOTOP )
HB_FUNC_TRANSLATE( WVG_CALLWINDOWPROC , WAPI_CALLWINDOWPROC )
HB_FUNC_TRANSLATE( WVG_CHECKDLGBUTTON , WAPI_CHECKDLGBUTTON )
HB_FUNC_TRANSLATE( WVG_CHECKMENUITEM , WAPI_CHECKMENUITEM )
HB_FUNC_TRANSLATE( WVG_CHECKRADIOBUTTON , WAPI_CHECKRADIOBUTTON )
HB_FUNC_TRANSLATE( WVG_CLIENTTOSCREEN , WAPI_CLIENTTOSCREEN )
HB_FUNC_TRANSLATE( WVG_CREATEMENU , WAPI_CREATEMENU )
HB_FUNC_TRANSLATE( WVG_CREATEPOPUPMENU , WAPI_CREATEPOPUPMENU )
HB_FUNC_TRANSLATE( WVG_CREATEWINDOWEX , WAPI_CREATEWINDOWEX )
HB_FUNC_TRANSLATE( WVG_DEFWINDOWPROC , WAPI_DEFWINDOWPROC )
HB_FUNC_TRANSLATE( WVG_DELETEMENU , WAPI_DELETEMENU )
HB_FUNC_TRANSLATE( WVG_DESTROYMENU , WAPI_DESTROYMENU )
HB_FUNC_TRANSLATE( WVG_DESTROYWINDOW , WAPI_DESTROYWINDOW )
HB_FUNC_TRANSLATE( WVG_DRAWMENUBAR , WAPI_DRAWMENUBAR )
HB_FUNC_TRANSLATE( WVG_DRAWTEXT , WAPI_DRAWTEXT )
HB_FUNC_TRANSLATE( WVG_ENABLEMENUITEM , WAPI_ENABLEMENUITEM )
HB_FUNC_TRANSLATE( WVG_ENABLEWINDOW , WAPI_ENABLEWINDOW )
HB_FUNC_TRANSLATE( WVG_FILLRECT , WAPI_FILLRECT )
HB_FUNC_TRANSLATE( WVG_GETDESKTOPWINDOW , WAPI_GETDESKTOPWINDOW )
HB_FUNC_TRANSLATE( WVG_GETDIALOGBASEUNITS , WAPI_GETDIALOGBASEUNITS )
HB_FUNC_TRANSLATE( WVG_GETDLGITEM , WAPI_GETDLGITEM )
HB_FUNC_TRANSLATE( WVG_GETDLGITEMTEXT , WAPI_GETDLGITEMTEXT )
HB_FUNC_TRANSLATE( WVG_GETFOCUS , WAPI_GETFOCUS )
HB_FUNC_TRANSLATE( WVG_GETSTOCKOBJECT , WAPI_GETSTOCKOBJECT )
HB_FUNC_TRANSLATE( WVG_HINSTANCE , WIN_HINSTANCE )
HB_FUNC_TRANSLATE( WVG_HIWORD , WAPI_HIWORD )
HB_FUNC_TRANSLATE( WVG_INSERTMENU , WAPI_INSERTMENU )
HB_FUNC_TRANSLATE( WVG_ISDLGBUTTONCHECKED , WAPI_ISDLGBUTTONCHECKED )
HB_FUNC_TRANSLATE( WVG_ISICONIC , WAPI_ISICONIC )
HB_FUNC_TRANSLATE( WVG_ISWINDOW , WAPI_ISWINDOW )
HB_FUNC_TRANSLATE( WVG_ISZOOMED , WAPI_ISZOOMED )
HB_FUNC_TRANSLATE( WVG_LOWORD , WAPI_LOWORD )
HB_FUNC_TRANSLATE( WVG_MAKELPARAM , WAPI_MAKELPARAM )
HB_FUNC_TRANSLATE( WVG_MESSAGEBOX , WAPI_MESSAGEBOX )
HB_FUNC_TRANSLATE( WVG_MOVEWINDOW , WAPI_MOVEWINDOW )
HB_FUNC_TRANSLATE( WVG_POSTMESSAGE , WAPI_POSTMESSAGE )
HB_FUNC_TRANSLATE( WVG_SCREENTOCLIENT , WAPI_SCREENTOCLIENT )
HB_FUNC_TRANSLATE( WVG_SENDDLGITEMMESSAGE , WAPI_SENDDLGITEMMESSAGE )
HB_FUNC_TRANSLATE( WVG_SENDMESSAGE , WAPI_SENDMESSAGE )
HB_FUNC_TRANSLATE( WVG_SENDMESSAGETEXT , WAPI_SENDMESSAGE )
HB_FUNC_TRANSLATE( WVG_SETBKCOLOR , WAPI_SETBKCOLOR )
HB_FUNC_TRANSLATE( WVG_SETBKMODE , WAPI_SETBKMODE )
HB_FUNC_TRANSLATE( WVG_SETDLGITEMTEXT , WAPI_SETDLGITEMTEXT )
HB_FUNC_TRANSLATE( WVG_SETFOCUS , WAPI_SETFOCUS )
HB_FUNC_TRANSLATE( WVG_SETFOREGROUNDWINDOW , WAPI_BRINGWINDOWTOTOP )
HB_FUNC_TRANSLATE( WVG_SETPARENT , WAPI_SETPARENT )
HB_FUNC_TRANSLATE( WVG_SETTEXTCOLOR , WAPI_SETTEXTCOLOR )
HB_FUNC_TRANSLATE( WVG_SETWINDOWLONG , WAPI_SETWINDOWLONGPTR )
HB_FUNC_TRANSLATE( WVG_SETWINDOWTEXT , WAPI_SETWINDOWTEXT )
HB_FUNC_TRANSLATE( WVG_SHOWWINDOW , WAPI_SHOWWINDOW )
HB_FUNC_TRANSLATE( WVG_SLEEP , WAPI_SLEEP )
HB_FUNC_TRANSLATE( WVG_TREEVIEW_SELECTITEM , WAPI_TREEVIEW_SELECTITEM )
HB_FUNC_TRANSLATE( WVG_TREEVIEW_SETBKCOLOR , WAPI_TREEVIEW_SETBKCOLOR )
HB_FUNC_TRANSLATE( WVG_TREEVIEW_SETLINECOLOR , WAPI_TREEVIEW_SETLINECOLOR )
HB_FUNC_TRANSLATE( WVG_TREEVIEW_SETTEXTCOLOR , WAPI_TREEVIEW_SETTEXTCOLOR )
HB_FUNC_TRANSLATE( WVG_UPDATEWINDOW , WAPI_UPDATEWINDOW )
HB_FUNC_TRANSLATE( WVT__MAKEDLGTEMPLATE , __WAPI_DLGTEMPLATE_RAW_NEW )

#ifdef HB_LEGACY_LEVEL5

/* local synonyms (deprecated) */
HB_FUNC_TRANSLATE( WVT_APPENDMENU , WAPI_APPENDMENU )
HB_FUNC_TRANSLATE( WVT_CREATEMENU , WAPI_CREATEMENU )
HB_FUNC_TRANSLATE( WVT_CREATEPOPUPMENU , WAPI_CREATEPOPUPMENU )
HB_FUNC_TRANSLATE( WVT_DELETEMENU , WAPI_DELETEMENU )
HB_FUNC_TRANSLATE( WVT_DESTROYMENU , WAPI_DESTROYMENU )
HB_FUNC_TRANSLATE( WVT_ENABLEMENUITEM , WAPI_ENABLEMENUITEM )

Meu modo de trabalho

Enviado: 24 Set 2019 17:13
por JoséQuintas
hazael escreveu:você pode (sempre pôde) fazer isso
Em parte...
O Viktor padronizou mais, movendo e padronizando as chamadas à API Windows.
Talvez no 3.2 não existam todas essas funções, e precise mais código fonte pra fazer a mesma coisa.

Foi nessa padronização que acabei tendo o recurso do Windows de redimensionar imagem, que faz parte do Windows !!!
Acho que no 3.2 ainda não tem isso, já que não atualizaram a GTWVG com as atualizações do 3.4, e nem a hbwin.

Meu modo de trabalho

Enviado: 24 Set 2019 17:15
por JoséQuintas
Mas voltando à pergunta sobre letra maior na GTWVG

Provavelmente a próxima vai ser: e como uso isso?

Se é função da API Windows.... tem manual detalhado na Microsoft, não precisa manual no Harbour, e nem na GTWVG !!!

Meu modo de trabalho

Enviado: 18 Out 2019 23:43
por JoséQuintas
Continuando....

Em posts anteriores, de 2016, eu havia comentado de acabar com DBFs, mas parei de mexer por alguns anos.
Faltaram telas em GTWVG.
Agora usando ícones multiresolução, que ficam bons em qualquer resolução de monitor.
E o EXE... que tinha cerca de 2MB na época das postagens, agora tem 6.5MB por conta das imagens.
jpa1.png
jpa2.png

Meu modo de trabalho

Enviado: 19 Out 2019 01:18
por JoséQuintas
Então....
Na continuação da migração pra MySQL, comecei a mexer em outras coisas ao mesmo tempo...
Então anulei tudo, e fazer uma coisa de cada vez.

Uma coisa é o seguinte: tenho um único cadastro pra clientes/fornecedores e transportadoras.
clientes/fornecedores usa cdtipo="1", e transportadoras usa cdtipo="3".
Vou separar as transportadoras e acabar com esse cdtipo.

Primeiro passo: confirmar índices

Código: Selecionar todos

   IndexDbf( "jpcadas", "Cadastros (Cli/Forn/Transp)" )
   IndexInd( "jpcadas1", "cdTipo + cdCodigo" )
   IndexInd( "jpcadas2", "cdTipo + cdNome + cdCodigo" )
   IndexInd( "jpcadas3", "cdTipo + cdCnpj + cdDivisao + cdCodigo" )
   IndexInd( "jpcadas4", "cdTipo + cdApelido + cdCodigo" )
   IndexInd( "telefone", "cdTipo + cdTelefone + cdCodigo" )
   IndexInd( "numlan",   "cdCodigo" )
   IndexInd( "nome",     "cdNome + cdCodigo" )
   IndexInd( "cnpj",     "cdCnpj+cdCodigo" )
Já tenho índices com e sem o cdtipo, e já faço muito uso desses índices sem cdtipo, isso vai facilitar.

Só lembrando:

usando NTX, temos lá trocentos arquivos de índice
SET INDEX TO ntx1, ntx2, ntx3, ntx4, ntx5, ntx6, ntx7, ntx8, ntx9, ntx10, ntx11

usando CDX, é um único arquivo, e os índices são internos
SET INDEX TO jpcadas

Além disso, ao invés de SET ORDER TO 1, SET ORDER TO 2, etc...., podemos usar o nome: OrdSetFocus( "numlan" )
Com isso, vou poder apagar os índices jpcadas1 a 4 tranquilamente (após retirar o uso nos fontes, lógico).
Se usasse SET ORDER por número... isso não seria possível.

Primeiro rotina de criar/atualizar estrutura do arquivo:

Código: Selecionar todos

STATIC FUNCTION JPTRANSPCreateDbf()

   LOCAL mStruOk := { ;
      { "TPCODIGO",   "C", 6 }, ;
      { "TPNOME",     "C", 50 }, ;
      { "TPAPELIDO",  "C", 20 }, ;
      { "TPCNPJ",     "C", 18 }, ;
      { "TPENDERECO", "C", 40 }, ;
      { "TPNUMERO",   "C", 10 }, ;
      { "TPCOMPL",    "C", 20 }, ;
      { "TPBAIRRO",   "C", 20 }, ;
      { "TPCIDADE",   "C", 21 }, ;
      { "TPUF",       "C", 2 }, ;
      { "TPCEP",      "C", 9 }, ;
      { "TPTELEFONE", "C", 30 }, ;
      { "TPINSEST",   "C", 18 }, ;
      { "TPCONTATO",  "C", 30 }, ;
      { "TPTELEF2",   "C", 15 }, ;
      { "TPTELEF3",   "C", 15 }, ;
      { "TPFAX",      "C", 30 }, ;
      { "TPEMAIL",    "C", 250 }, ;
      { "TPHOMEPAGE", "C", 100 }, ;
      { "TPOBS",      "C", 100 }, ;
      { "TPSTATUS",   "C", 6 }, ;
      { "TPINFINC",   "C", 80 }, ;
      { "TPINFALT",   "C", 80 } }

   SayScroll( "JPTRANSP, verificando atualizações" )

   IF ! ValidaStru( "jptransp", mStruOk )
      MsgStop( "jptransp não disponível!" )
      QUIT
   ENDIF

   RETURN NIL
Depois rotina de reindexar:

Código: Selecionar todos

   IndexDbf( "jptransp", "Transportadoras" )
   IndexInd( "numlan",   "tpCodigo" )
   IndexInd( "nome",     "tpNome + tpCodigo" )
   IndexInd( "cnpj",     "tpCnpj + tpCodigo" )
Pronto, na próxima atualização do sistema, arquivo será criado automaticamente.

Meu modo de trabalho

Enviado: 19 Out 2019 01:47
por JoséQuintas
Agora a transferência.
Já tenho a rotina de atualização automática, então é só acrescentar mais essa.

Código: Selecionar todos

// ze_update2019.prg
FUNCTION ze_Update2019()

   IF AppVersaoDbfAnt() < 20191011; Update1011(); ENDIF
   IF AppVersaoDbfAnt() < 20191019; Update1019(); ENDIF

   RETURN NIL
E agora criar a Update1019() (19/10) fazendo a transferência de cdtipo="3" para o novo jptransp.

Na próxima vez que o cliente atualizar versão, terá um arquivo novo só com transportadoras.

Agora é alterar os fontes, para ao invés de usar jpcadas, passar a usar jptransp.

Neste ponto não posso liberar pra cliente, só quando terminar a alteração pra usar jptransp ao invés de jpcadas, senão a conversão vai ficar desatualizada.

Terminado isto, já posso liberar pra clientes.

Depois, mexer nos fontes pra eliminar de vez o campo cdtipo.

Começar eliminando o uso dos índices jpcadas1 a jpcadas4.
Primeiro eliminar as pesquisas por esses índices.
Nesta etapa, tanto faz se atualizar ou não nos clientes durante o processo.

Depois, ajustar os fontes de clientes/fornecedores pra não usarem o cdtipo, deixando a remoção definitiva por último.
Mesma coisa: vou poder atualizar nos clientes a qualquer momento.

Por último: eliminar de vez, mas....antes de eliminar o campo, preciso pegar as transportadoras, lembram? cdtipo="3"
Então, cdtipo só vai deixar de existir no arquivo depois, quando realmente não precisar mais.
Uso isto na fase intermediária:

Código: Selecionar todos

IF AppVersaoDbfAnt() < 20191019
   AAdd( mStruOk, { "CDTIPO", "C", 1 }  )
ENDIF
Ou seja, defino até quando o campo vai existir.
Quem atualizar versão depois desta, após a transferência o campo vai ser eliminado.

Quando terminar por definitivo, altero aqui também:

Código: Selecionar todos

FUNCTION AppVersaoDbf()

   RETURN 20191014
Esse é o controle de versão de DBF.
Ao alterar o número de versão, obrigatoriamente o aplicativo faz backup de tudo.
Só depois do backup é que o aplicativo vai alterar estruturas, e transferir transportadoras.

Isso já venho usando desde a versão de 2002, desde o Clipper, que já mostrei neste post.
Apenas coloquei no aplicativo pra ele fazer automático, o que muito antigamente eu fazia manualmente.
É criar uma rotina que atualiza, e com o tempo vai melhorando, conforme as necessidades que forem aparecendo.

Meu modo de trabalho

Enviado: 19 Out 2019 06:27
por JoséQuintas
A atualização... tudo rotina comum.

Código: Selecionar todos

STATIC FUNCTION Update1019()

   IF ! AbreArquivos( "jptransp", "jpcadas" )
      QUIT
   ENDIF
   SELECT jpcadas
   SET ORDER TO 0
   GOTO TOP
   DO WHILE ! Eof()
      IF jpcadas->cdTipo != "3"
         SKIP
         LOOP
      ENDIF
      SELECT jptransp
      SEEK jpcadas->cdCodigo
      IF Eof()
         RecAppend()
         REPLACE jptransp->tpCodigo WITH jpcadas->cdCodigo, ;
      ENDIF
      RecLock()
      REPLACE ;
         jptransp->tpNome     WITH jpcadas->cdNome, ;
         jptransp->tpApelido  WITH jpcadas->cdApelido ;
...
         jptransp->tpInfAlt   WITH jpcadas->cdInfAlt
      SELECT jpcadas
      //RecLock()
      //DELETE
      //RecUnlock()
      SKIP
   ENDDO
   CLOSE DATABASES

   RETURN NIL
A checagem é precaução.
Não excluir é precaução.
Durante os testes, posso ficar convertendo toda hora.
Mas terminando as alterações, antes de instalar nos clientes, aí apago de vez.