Tabbed-Panel/Page (painel com abas) no Clipper

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Dr.Microso
Usuário Nível 3
Usuário Nível 3
Mensagens: 173
Registrado em: 12 Jan 2009 21:26
Localização: Belo Horizonte, MG

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Dr.Microso »

Olá, caríssimos!!!

BioTech é um programa em MS-DOS (caso tb já conheça) que apresenta algumas implementações avançadas comuns à linguagens visuais como o Tabbed-Page ou Folder todavia operando in ASCII mode, que a princípio recusei-me à acreditar que era Clipper.
Porém a chamada do executável com a switch //info , veio a comprovar: CA-Clipper 5.2.
E foi o máximo onde fui, nem pude usar o teclado porque o software trabalha com dados sigilosos, então cópia do executável para um provável desmonte só de 2 jeitos: de jeito maneira e de jeito nenhum...

O assunto já foi abordado aqui como TabStrip pelo colega Pablo César que inclusive nos deixou uma contribuição bakana, mas o tal programa me deixou intrigado, justamente por possuir características idênticas (inclusive texto na orientaçao vertical) a da classe rFolder para FiveWin postada aqui desenvolvida pelo Ricardo Moura Marques, o que me leva a crer devida a semelhança, ser portada por uma LIB (mas qual???), que achei o maior tesão, porque embora já use xHarbour+FiveWin, tenho aplicativos em Clipper que não podem sofrer migração ainda por razões muito particulares.

Alguém aqui já teve contato com este software ou programa que apresentasse este tipo de controle?
Se tiver esta LIB (pode ser parecida tb) tenho muito interesse por causa das abas em multi-linhas.

Grato antecipadamente.
"O que domina aos outros é forte; o que domina a si mesmo é poderoso." [ Lao-Tsé - séc VII AC]
"É tipo uma Alquimia... Porções de código viram soluções que mutam-se fisicamente em sorrisos e outros, como o notebook que uso para escrever estas linhas..." dr.microso@hotmail.com
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Pablo César »

BioTech é um programa em MS-DOS (caso tb já conheça) que apresenta algumas implementações avançadas comuns à linguagens visuais como o Tabbed-Page ou Folder todavia operando in ASCII mode, que a princípio recusei-me à acreditar que era Clipper.
Apresenta pra nós. Eu não conheço e não achei ! Podia você nos mostrar ?

O exemplo que eu fiz, foi feito na unha sem biblioteca alguma (apenas a do mouse para permitir a sua inteiração) e aquele exemplo pode ser modificado para que a abas seja na posição vertical também, mas acho que o efeito visual em modo texto, não irá ficar bom. Mas pode ser adapatado.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Dr.Microso
Usuário Nível 3
Usuário Nível 3
Mensagens: 173
Registrado em: 12 Jan 2009 21:26
Localização: Belo Horizonte, MG

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Dr.Microso »

O código de sua autoria é show Pablo, bem funcional.
O tenho empregado em pelo menos uma dúzia de rotinas onde, a apresentação de opções simultâneas para alguns dados, só era feito através dos tradicionais menus (o aspecto ficava cansativo e não muito estético).

Antes de fazer o primeiro post, a exemplo de vc também segui o caminho óbvio... E lá se foi umas 2 horas de pesquisa na internet.
Como aqui temos profissionais de várias áreas, citei o nome do programa na esperança de alguém que atue no setor de laboratório ou engenharia genética tenha visto o bicho também.
O software é belga, desconheço a empresa criadora.
Mas vou tentar conseguir mais dados e umas screenshots do tal aplicativo, embora o colega que me apresentou seja deveras indigesto no trato.
Presumo que se é uma LIB, o mesmo recurso deva existir em outros software made in Clipper.
"O que domina aos outros é forte; o que domina a si mesmo é poderoso." [ Lao-Tsé - séc VII AC]
"É tipo uma Alquimia... Porções de código viram soluções que mutam-se fisicamente em sorrisos e outros, como o notebook que uso para escrever estas linhas..." dr.microso@hotmail.com
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Pablo César »

O software é belga, desconheço a empresa criadora.
Mas vou tentar conseguir mais dados e umas screenshots do tal aplicativo, embora o colega que me apresentou seja deveras indigesto no trato.
Ahh sim, agora entendo. Eu procurei mas não achei... Convide ele a participar do fórum (mas claro teríamos que sensurar o adjetivo utilizado, se bem que não é tão ofensivo...) numa dessas ele nos apresenta e passa aser mais uma luz...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por JoséQuintas »

Por acaso seria o SSTAB, Microsoft Tabbed Dialog Control?
Se for, ele faz parte do Visual Studio.
Como o Visual Studio permite criar controles, asssim como o Delphi, então o que viu pode ser algum produto comercial.
Mas essa parte básica que mencionou, o SSTAB tem.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por JoséQuintas »

Desculpe, reli seu texto e vi que se refere a programa DOS.
Cheguei a começar algo sobre tabs no Clipper, pra GETs e SAYs básicos, permitindo clicar nas abas, e usando aqueles chr(196), chr(205) e afins.
Bom, esqueci o nome da variável da Getsys, acho que é aGets.
Basicamente é um array de aGets.
a rotina ativa o conjunto correspondente conforme a aba clicada.
E nesse caso, toda a montagem de tela, incluindo says, precisam ser inclusos no array.
Com auxílio do #define, a alimentação do array acaba simulando um comando novo.
Quanto ao texto de lado, já vimos que é possível montagem de caracteres especiais no padrão VGA.
Mas só fiz o básico, só pra ver se como ia ficar.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Pablo César »

Mas só fiz o básico, só pra ver se como ia ficar.
Se puder, mostre para vermos como ficou
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por JoséQuintas »

Só montei um protótipo na época e nunca mais mexi.
O programa usado pra teste ficou assim:

Código: Selecionar todos

#include "tabget.ch"

procedure Main

readexit(.t.)
AltD(.t.)
//set eventmask to 159
set color to w/b, n/w,,,w/b
set scoreboard off
set status off
clear
lCancel := .f.
label0 = "MINHOCA"
text0  = "TATU"

TabBegin(5,5,20,70)
@ 0, 0 TABSAY Label0 "Teste"
@ 0, 10 TABGET Text0 "000002"

NewTab("Dados")
     @ 0, 0  TABSAY Label1 "Codigo"
     @ 0, 10 TABGET Text1  "000001" ;
        picture "@K 999999" valid Val(Text1)>0
     @ 1, 0  TABSAY Label2 "Nome"
     @ 1, 10 TABGET Text2 "NOMENOMENOME" ;
        picture "@!"
NewTab("Financeiro")
     @ 5, 10 TABSAY Label3 "Endereco"
     @ 5, 20 TABGET Text3 "ENDERECOENDERECO" picture "@!"
     @ 6, 10 TABSAY Label4 "Cidade"
     @ 6, 20 TABGET Text4 "CIDADECIDADE" picture "@!"
NewTab("Cobranca")
// @ 6, 20 TABCMD lCancel ;
//         CAPTION "&Cancel" ;
//        STATE { || OlaMundo() }
     @ 7, 10 TABSAY Label5 "UF"
     @ 7, 20 TABGET Text5 "SP" picture "@!A"
     @ 8, 10 TABSAY Label6 "CEP"
     @ 8, 20 TABGET Text6 "03676080" picture "@R 99999-999"
NewTab("Entrega")
   @ 5, 10 TABSAY Label7 "Codigo"
   @ 5, 20 TABGET Text7 "000005"
NewTab("Obs")
   @ 6, 10 TABSAY Label8 "minhoca"
   @ 6, 20 TABGET Text8 "tatu"
// NewTab()
//     @ 3, 10 TABMEMO Memo1 "teste"
TabEdit(.t.)
ReadTabs()
Return

function OlaMundo()
   @ 23, 0 say "Ola Mundo"
   inkey(0)
   Scroll(23,0,23,79,0)
return NIL
José M. C. Quintas
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por JoséQuintas »

E o .ch, como dá pra perceber, criado meio do estilo usado pela GetSys.
E o gerenciamento de tabs só alimenta uma GetSys conforme a tab.

Código: Selecionar todos

#command @ <row>, <col> TABGET <var> <xpr>                          ;
                        [PICTURE <pic>]                                 ;
                        [VALID <valid>]                                 ;
                        [WHEN <when>]                                   ;
                        [SEND <msg>]                                    ;
      => SetPos( <row>, <col> )                                         ;
       ; <var> := <xpr> ;
       ; TextBox( ;
           _GET_( <var>, <"var">, <pic>, <{valid}>, <{when}> ) )

// #command @ <row>, <col> TABSAY <xpr>                           ;
//       => SetPos( <row>, <col> )                                         ;
//        ; Label( <row>, <col>, <xpr> )


#command @ <row>, <col> TABSAY <var> <xpr> ;
                        [PICTURE <pic>]  ;
      =>  SetPos( <row>, <col> ) ;
      ; <var> := <xpr> ;
      ; TextBox( ;
         _GET_( <var>, <"var">, <pic>, {|x|.t.},{|x|.f.} ) )

#command @ <row>, <col> TABCMD <var> ;
           CAPTION <cCaption> ;
           STATE <oState> ;
           [ PICTURE <pic> ] ;
           [ VALID <valid> ] ;
           [ WHEN <when> ] ;
     => SetPos( <row>, <col> ) ;
        ; <var> := .f. ;
        ; xxxoGet = _GET_( <var>, <cCaption>, <pic>, <{valid}> , <{when}> ) ;
        ; xxxoGet:Control := _PushButt_( cCaption,,,, {<oState>},,,,,,,, ) ;
        ; xxxoGet:reader := { | a, b, c, d | GuiReader( a, b, c, d ) } ;
        ; xxxoGet:Control:Display();
        ; TextBox( xxxoGet )
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Pablo César »

Ficou faltando as funções:

TABBEGIN
TEXTBOX
NEWTAB
TABEDIT
READTABS

Sem elas não dá para compilar sem erros...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por JoséQuintas »

Só não lembro se depende da minha Getsys, alterada pra mouse, se tem algo mais pra isso.
Como eu disse no início, fiz em 2004 só por curiosidade, por ter visto no VB, e não cheguei a colocar em prática.

José M. C. Quintas

Código: Selecionar todos

* FUNCTAB.PRG

Static Tab_Numero := 0              // Num.Tab Atual
Static Tab_List   := {}             // Array com as Tabs
Static Tab_Conf   := {0,0,20,70,{}} // Config.Tabs
Static Tab_Edit   := .f.            // Se pode editar
Static Tab_NoTab  := {}             // Gets Fora da Tab


#define K_MOUSELEFT 1002

Function TabBegin(nLini,nColi,nLinf,nColf)
nLini      := iif(nLini==NIL,0,nLini)
nColi      := iif(nColi==NIL,0,nColi)
nLinf      := iif(nLinf==NIL,MaxRow(),nLinf)
nColf      := iif(nColf==NIL,MaxCol(),nColf)
Tab_List   := {}
Tab_Numero := 0
Tab_Conf   := {nLini,nColi,nLinf,nColf,{}}
Tab_NoTab  := {}
return NIL


Function NewTab(cNome)

aadd(Tab_List, {} )
Tab_Numero  := Len(Tab_List)
cNome := iif(cNome==NIL,"Tab"+Str(Len(Tab_List),1),cNome)
if Len(cNome) < 5
   cNome := Pad(cNome,5)
endif
aadd(Tab_Conf[5],cNome)
return NIL


Function PageEnd()
Tab_Numero := Tab_Numero - 1
return NIL


Function Label( mLinha,mColuna,mTexto )
local oGet
oGet := GetNew( mLinha,mColuna,&([{|x|"]+mTexto+["}]),NIL,,,)
If Tab_Numero == 0
   aadd( Tab_NoTab, oGet )
Else
   oGet:Row      := oGet:Row + Tab_Conf[1]+3
   oGet:Col      := oGet:Col + Tab_Conf[2]+1
   oGet:PreBlock := { |x| .f. }
   oGet:Tag      := {Tab_Numero,.f.}
   aadd( Tab_List[ Tab_Numero ], oGet )
Endif
return NIL


Function TextBox(oGet)

If Tab_Numero == 0
   aadd( Tab_NoTab, oGet)
Else
   oGet:Row := oGet:Row + Tab_Conf[1]+3
   oGet:Col := oGet:Col + Tab_Conf[2]+1
   aadd( Tab_List[ Tab_Numero ], oGet )
Endif
return NIL


Function ReadTabs()

Local cColor, cTexto, nCont, nColTab, nKey
Private aMouseHot := {}
Tab_Numero := 1
cColor := SetColor()
do while .t.
   aMouseHot := {}
   @ Tab_Conf[1]+2, Tab_Conf[2] to Tab_Conf[3], Tab_Conf[4]
   nColTab := Tab_Conf[2]+1
   for nCont = 1 to Len(Tab_List)
      if nCont == Tab_Numero
         set key -(19+nCont) to
      else
         set key -(19+nCont) to MudaTab
      endif
      cTexto := Tab_Conf[5,nCont]
      @ Tab_Conf[1], nColTab to Tab_Conf[1]+1, nColTab+Len(cTexto)+1
      @ Tab_Conf[1]+1, nColTab say Chr(179)+cTexto+Chr(179)
      if nCont == Tab_Numero
         @ Tab_Conf[1]+2, nColTab say Chr(217)+Space(Len(cTexto))+Chr(192)
      endif
      if Tab_Numero == nCont
         set color to N/W
      endif
      @ Tab_Conf[1]+1, nColTab+1 say cTexto
      aadd(aMouseHot,{Tab_Conf[1]+1,nColTab+1,Tab_Conf[1]+1,nColTab+Len(cTexto),-19+nCont})
      nColTab := nColTab+Len(cTexto)+2
      set color to (cColor)
   next
   Scroll(Tab_Conf[1]+3,Tab_Conf[2]+1,Tab_Conf[3]-1,Tab_Conf[4]-1,0)
   GetList := {}
   // GetList := Tab_List[Tab_Numero]
   For nCont = 1 To Len(Tab_NoTab)
      aadd(GetList,Tab_NoTab[nCont])
   Next
   For nCont = 1 To Len(Tab_List[Tab_Numero])
      aadd(GetList, Tab_List[Tab_Numero][nCont])
   Next
   for nCont = 1 to Len(GetList)
      GetList[nCont]:Display()
   next
   if Tab_Edit
      read
      nKey := 0
   else
      clear gets
      nKey := MyInkey(0)
   endif
   if LastKey() == 27
      exit
   elseif LastKey() == 5
      if Tab_Numero > 1
         Tab_Numero := Tab_Numero - 1
      endif
   elseif nKey == K_MOUSELEFT
      for nCont = 1 to Len(aMouseHot)
         if MouseRow() >= aMouseHot[nCont,1] .and. ;
            MouseCol() >= aMouseHot[nCont,2] .and. ;
            MouseRow() <= aMouseHot[nCont,3] .and. ;
            MouseRow() <= aMouseHot[nCont,4]
            Tab_Numero := nCont // KeyBoard Chr(aMouseHot[nCont,5])
         endif
      next
   elseif LastKey() != 23 .and. LastKey() > 0
      Tab_Numero := Tab_Numero + 1
      if Tab_Numero > Len(Tab_List)
         exit
      endif
   endif
enddo
Tab_List := {}
for nCont = 1 to Len(Tab_List)
   set key -(19+nCont) to
next
return NIL


Function MudaTab()
Tab_Numero := Abs(LastKey())-19
clear gets
return NIL


Function TabEdit(lDigita)
Local nReturn
nReturn := Tab_Edit
If lDigita != NIL
   Tab_Edit := lDigita
Endif
Return nReturn


Function MouseToTecla(nKey)
local nCont
if Type("aMouseHot") != "A"
   aMouseHot := {}
endif

for nCont = 1 to Len(aMouseHot)
   if MouseRow() >= aMouseHot[nCont,1] .and. ;
      MouseCol() >= aMouseHot[nCont,2] .and. ;
      MouseRow() <= aMouseHot[nCont,3] .and. ;
      MouseCol() <= aMouseHot[nCont,4]
      nKey := aMouseHot[nCont,5]
      Tab_Numero := nCont
      KeyBoard Chr(23)
   endif
next
return nKey



// oGet := GetNew( 10, 10, {|x| "OLA MUNDO"},;
//        NIL, "@R (999)999-9999", "N/BG, W+/BG" )

//   oGet := GetNew( 10, 10, {|x| IF(x == NIL, cVar, cVar := x)},;
//                      "cVar", "@R (999)999-9999", "N/BG, W+/BG" )

// Function GetNew2( nRow, nCol, bVar, cValue, cPict, cColor, bWhen, bValid )
// Local oGet
// cValue := iif( bVar == NIL, Eval(bVar), cValue )
// bWhen  := iif( bWhen == NIL, {||.t.}, bWhen )
// bValid := iif( bValid == NIL, {||.t.}, bValid )
// oGet := GetNew( nRow, nCol, bVar, cValue, cPict, cColor )
// oGet:PreBlock := bWhen
// oGet:PostBlock := bValid
// return oGet
Editado pela última vez por Toledo em 03 Jun 2010 22:18, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Adalberto »

Ola amigos deste forum,

Desejo contribuir, e tal vez ajudar, com uma alternativa, mas preciso anexar os Prg´s e o Exe e não sei como fazer esse trabalho.
Se alguma alma caritativa me da uma ajuda, Le agradeço desde já.

Parabéns para vocês.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por alxsts »

Olá!

Adalberto:
veja este tópico.
[]´s
Alexandre Santos (AlxSts)
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Re: Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Adalberto »

Alexandre

muito obrigado pela ajuda.

Anexo os PRG´s para mostrar otra forma de aplicação de Tab_abas em Clipper.

Saludos para todos, desde Santa Cruz de la Sierra - Bolivia.
Anexos
TAB_ABAS.ZIP
Painel de Tab_Abas en clipper puro
(3.75 KiB) Baixado 189 vezes
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tabbed-Panel/Page (painel com abas) no Clipper

Mensagem por Pablo César »

Que tal Adalberto ? Te arreglas bien con el portugues, ein ? Te felicito y tambien agradezco por tu contribuicion, podria colocarlo en la seccion "Contribuições, Dicas e Tutoriais" para explicar mejor y redictas tu mensaje anterior dandonos el link donde estará postado tu tópico de contribuicion...
Solo me quedé con ganas de ejecutar tu aplicativo. Sinó es mucho pedir... puedes colocar un ejemplo de test asi logramos visualizar el resultado ?

Un gran abrazo al pueblo boliviano !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder