DBEDIT - Codigo fonte para analise e alterações

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

DBEDIT - Codigo fonte para analise e alterações

Mensagem por rochinha »

Amiguinhos

Eis aqui o codigo fonte do DBEdit que consegui apos descompilar um programa meu.

O codigo pode servir para estudos e se preferirem, melhora-lo.

Codigo completo:

Código: Selecionar todos

/*
* 
* DBEdit Source
* 
*/
#include "common.ch"
#include "inkey.ch"

//-----------------------------------------------------------------
//  file-wide static variables
// static Static1, Static2

function DBEDIT( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, ;
   Arg9, Arg10, Arg11, Arg12 )

   local Local1, Local2, Local3, Local4, Local5, Local6, Local7, ;
      Local8, Local9, Local10
   public Static1, Static2
   if ( EOF() )
      goto bottom
   endif
   Local1 := dbedsetup(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, ;
      Arg8, Arg9, Arg10, Arg11, Arg12)
   Local1:skipblock({ |_1| skipped(_1) })
   Local1:autolite(.F.)
   Local2 := setcursor(0)
   Local7 := {Static1, Static2}
   Static1 := .F.
   Static2 := .T.
   Local5 := .T.
   Local3 := .T.
   do while ( Local3 )
      do while ( !Local1:stabilize() )
         if ( ( Local4 := nextkey() ) == 0 )
         elseif ( Local4 != 1001 )
            exit
         endif
      enddo
      if ( ( Local4 := InKey() ) == 0 )
         if ( Local5 )
            Local3 := calluser(Local1, Arg6, 0)
            do while ( !Local1:stabilize() )
            enddo
         endif
         if ( Local3 .AND. Static2 )
            Local1:hilite()
            do while ( ( Local4 := InKey(0) ) == 1001 )
            enddo
            Local1:dehilite()
            if ( ( Local6 := SetKey(Local4) ) != Nil )
               eval(Local6, procname(1), procline(1), "")
               loop
            endif
         else
            Static2 := .T.
         endif
      endif
      Local5 := .T.
      do case
      case Local4 == 1002 .OR. Local4 == 1006
         do case
         case ( Local9 := mrow() ) < Local1:ntop()
         case ( Local10 := mcol() ) < Local1:nleft()
         case Local9 > Local1:nbottom()
         case Local10 <= Local1:nright()
            Local8 := Local1:mrowpos() - Local1:rowpos()
            do while ( Local8 < 0 )
               Local8++
               Local1:up()
            enddo
            do while ( Local8 > 0 )
               Local8--
               Local1:down()
            enddo
            Local8 := Local1:mcolpos() - Local1:colpos()
            do while ( Local8 < 0 )
               Local8++
               Local1:left()
            enddo
            do while ( Local8 > 0 )
               Local8--
               Local1:right()
            enddo
         endcase
      case Local4 == 0
      case Local4 == 24
         if ( Static1 )
            Local1:hitbottom(.T.)
         else
            Local1:down()
         endif
      case Local4 == 5
         if ( Static1 )
            Local1:hittop(.T.)
         else
            Local1:up()
         endif
      case Local4 == 3
         if ( Static1 )
            Local1:hitbottom(.T.)
         else
            Local1:pagedown()
         endif
      case Local4 == 18
         if ( Static1 )
            Local1:hittop(.T.)
         else
            Local1:pageup()
         endif
      case Local4 == 31
         if ( Static1 )
            Local1:hittop(.T.)
         else
            Local1:gotop()
         endif
      case Local4 == 30
         if ( Static1 )
            Local1:hitbottom(.T.)
         else
            Local1:gobottom()
         endif
      case Local4 == 4
         Local1:right()
      case Local4 == 19
         Local1:left()
      case Local4 == 1
         Local1:home()
      case Local4 == 6
         Local1:end()
      case Local4 == 26
         Local1:panleft()
      case Local4 == 2
         Local1:panright()
      case Local4 == 29
         Local1:panhome()
      case Local4 == 23
         Local1:panend()
      otherwise
         Local3 := calluser(Local1, Arg6, Local4)
         Local5 := .F.
      endcase
   enddo
   setcursor(Local2)
   Static1 := Local7[ 1 ]
   Static2 := Local7[ 2 ]
   return .T.

static function DBEDSETUP(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, ;
   Arg8, Arg9, Arg10, Arg11, Arg12)

   local Local1, Local2, Local3, Local4, Local5, Local6, Local7, ;
      Local8
   if (ValType(Arg1) != "N" .OR. Arg1 < 0)
      Arg1:= 0
   endif
   if (ValType(Arg2) != "N" .OR. Arg2 < 0)
      Arg2:= 0
   endif
   if (ValType(Arg3) != "N" .OR. Arg3 > MaxRow() .OR. Arg3 < Arg1)
      Arg3:= MaxRow()
   endif
   if (ValType(Arg4) != "N" .OR. Arg4 > MaxCol() .OR. Arg4 < Arg2)
      Arg4:= MaxCol()
   endif
   if ((Arg4 - Arg2) * (Arg3 - Arg1) > MaxRow() * MaxCol())
      Arg1:= Arg2:= 0
      Arg3:= MaxRow()
      Arg4:= MaxCol()
   endif
   Local1:= tbrowsedb(Arg1, Arg2, Arg3, Arg4)
   if (ISARRAY(Arg5))
      Local3:= Len(Arg5)
      Local2:= 1
      do while (Local2 <= Local3)
         if (ValType(Arg5[Local2]) != "C" .OR. Empty(Arg5[Local2]))
            exit
         endif
         Local2++
      enddo
      Local3:= Local2 - 1
   else
      Local3:= FCount()
   endif
   if (Local3 == 0)
      return .F.
   endif
   Local1:headsep("ÍÑÍ")
   Local1:colsep(" ³ ")
   Local1:ColorSpec := "N/W,N/BG,B/W,B/BG,B/W,B/BG,R/W,B/R"
   Local4:= array(Local3, 6)
   if (ISARRAY(Arg5))
      for Local2:= 1 to Local3
         if ("->" $ Arg5[Local2])
            Local6:= At("->", Arg5[Local2])
            Local4[Local2][3]:= SubStr(Arg5[Local2], 1, Local6 - 1)
            Local4[Local2][4]:= SubStr(Arg5[Local2], Local6 + 2)
            Local4[Local2][1]:= Local4[Local2][3] + "->;" + ;
               Local4[Local2][4]
         else
            Local4[Local2][3]:= Nil
            Local4[Local2][4]:= Nil
            Local4[Local2][1]:= Arg5[Local2]
         endif
         Local4[Local2][2]:= Arg5[Local2]
      next
   elseif (FCount() > 0)
      for Local2:= 1 to Local3
         Local4[Local2][3]:= Nil
         Local4[Local2][4]:= Nil
         Local4[Local2][1]:= FieldName(Local2)
         Local4[Local2][2]:= FieldName(Local2)
      next
   else
      return .F.
   endif
   for Local2:= 1 to Local3
      Local5:= ""
      if (ISARRAY(Arg7))
         if (Len(Arg7) >= Local2 .AND. ISCHARACTER(Arg7[Local2]) ;
               .AND. !Empty(Arg7[Local2]))
            Local5:= Arg7[Local2]
         endif
      elseif (ISCHARACTER(Arg7) .AND. !Empty(Arg7))
         Local5:= Arg7
      endif
      Local7:= Nil
      if (ISMEMO(&(Local4[Local2][2])))
         Local7:= "{|| '  <Memo>  '}"
      elseif (Empty(Local5))
         if ("->" $ Local4[Local2][2])
            if (Upper(Local4[Local2][3]) == "M")
               Local7:= memvarbloc(Local4[Local2][2])
            elseif (Upper(Local4[Local2][3]) == "FIELD")
               Local7:= fieldwbloc(Local4[Local2][4], Select())
            else
               Local7:= fieldwbloc(Local4[Local2][4], ;
                  Select(Local4[Local2][3]))
            endif
         elseif (!Empty(fieldpos(Local4[Local2][2])))
            Local7:= fieldwbloc(Local4[Local2][2], Select())
         endif
      endif
      if (ISNIL(Local7))
         if (Empty(Local5))
            Local7:= "{||" + Local4[Local2][2] + "}"
         else
            Local7:= "{|| Transform(" + Local4[Local2][2] + ",'" + ;
               Local5 + "')}"
         endif
      endif
      if (ISCHARACTER(Local7))
         Local4[Local2][2]:= &Local7
      elseif (ISBLOCK(Local7))
         Local4[Local2][2]:= Local7
      endif
      if (ISARRAY(Arg8))
         if (Len(Arg8) >= Local2 .AND. ISCHARACTER(Arg8[Local2]))
            Local4[Local2][1]:= Arg8[Local2]
         endif
      elseif (ISCHARACTER(Arg8))
         Local4[Local2][1]:= Arg8
      endif
      Local4[Local2][3]:= Nil
      if (ISARRAY(Arg9))
         if (Len(Arg9) >= Local2 .AND. ISCHARACTER(Arg9[Local2]))
            Local4[Local2][3]:= Arg9[Local2]
         endif
      elseif (ISCHARACTER(Arg9))
         Local4[Local2][3]:= Arg9
      endif
      Local4[Local2][4]:= Nil
      if (ISARRAY(Arg10))
         if (Len(Arg10) >= Local2 .AND. ISCHARACTER(Arg10[Local2]))
            Local4[Local2][4]:= Arg10[Local2]
         endif
      elseif (ISCHARACTER(Arg10))
         Local4[Local2][4]:= Arg10
      endif
      Local4[Local2][5]:= Nil
      if (ISARRAY(Arg11))
         if (Len(Arg11) >= Local2 .AND. ISCHARACTER(Arg11[Local2]))
            Local4[Local2][5]:= Arg11[Local2]
         endif
      elseif (ISCHARACTER(Arg11))
         Local4[Local2][5]:= Arg11
      endif
      Local4[Local2][6]:= Nil
      if (ISARRAY(Arg12))
         if (Len(Arg12) >= Local2 .AND. ISCHARACTER(Arg12[Local2]))
            Local4[Local2][6]:= Arg12[Local2]
         endif
      elseif (ISCHARACTER(Arg12))
         Local4[Local2][6]:= Arg12
      endif
   next
   for Local2:= 1 to Local3
      Local8:= tbcolumnne(Local4[Local2][1], Local4[Local2][2])
      if (Local4[Local2][3] != Nil)
         Local8:headsep(Local4[Local2][3])
      endif
      if (Local4[Local2][4] != Nil)
         Local8:colsep(Local4[Local2][4])
      endif
      if (Local4[Local2][5] != Nil)
         Local8:footsep(Local4[Local2][5])
      endif
      if (Local4[Local2][6] != Nil)
         Local8:footing(Local4[Local2][6])
      endif
      Local8:ColorBlock := { || iif( Deleted(), { 3, 2 }, { 1, 2 } ) } // -> Definicao das cores do BROWSE e registros DELETADOS
      Local1:addcolumn(Local8)
   next
   return Local1

static function CALLUSER( Arg1, Arg2, Arg3 )

   local Local1, Local2, Local3, Local4
   do case
   case Arg3 != 0
      Local1 := 4
   case !Static1 .AND. emptyfile()
      Local1 := 3
   case Arg1:hitbottom()
      Local1 := 2
   case Arg1:hittop()
      Local1 := 1
   otherwise
      Local1 := 0
   endcase
   do while ( !Arg1:stabilize() )
   enddo
   Local3 := RecNo()
   if ( ValType(Arg2) != "C" .OR. Empty(Arg2) )
      if ( Arg3 == 13 .OR. Arg3 == 27 )
         Local2 := 0
      else
         Local2 := 1
      endif
   else
      Local2 := &Arg2(Local1, Arg1:colpos())
   endif
   Local4 := Local2 != 0
   if ( !Static1 .AND. EOF() .AND. !emptyfile() )
      skip -1
   endif
   if ( Local2 == 3 )
      Static1 := !( Static1 .AND. EOF() )
      if ( Static1 )
         goto bottom
         Arg1:down()
      else
         Arg1:refreshcur()
      endif
      Static2 := .F.
   elseif ( Local2 == 2 .OR. Local3 != RecNo() )
      if ( Local4 )
         Static1 := .F.
         if ( Set(_SET_DELETED) .AND. Deleted() .OR. ;
               !Empty(dbfilter()) .AND. !&( dbfilter() ) )
            skip 
         endif
         if ( EOF() )
            goto bottom
         endif
         Local3 := RecNo()
         Arg1:refreshall()
         do while ( !Arg1:stabilize() )
         enddo
         do while ( Local3 != RecNo() )
            Arg1:up()
            do while ( !Arg1:stabilize() )
            enddo
         enddo
         Static2 := .F.
      endif
   else
      Arg1:refreshcur()
   endif
   return Local4

static function EMPTYFILE
   if ( LastRec() == 0 )
      return .T.
   endif
   if ( ( EOF() .OR. RecNo() == LastRec() + 1 ) .AND. BOF() )
      return .T.
   endif
   return .F.

static function SKIPPED( Arg1 )
   local Local1 := 0
   if ( LastRec() != 0 )
      if ( Arg1 == 0 )
         if ( EOF() .AND. !Static1 )
            skip -1
            Local1 := -1
         else
            skip 0
         endif
      elseif ( Arg1 > 0 .AND. RecNo() != LastRec() + 1 )
         do while ( Local1 < Arg1 )
            skip 
            if ( EOF() )
               if ( Static1 )
                  Local1++
               else
                  skip -1
               endif
               exit
            endif
            Local1++
         enddo
      elseif ( Arg1 < 0 )
         do while ( Local1 > Arg1 )
            skip -1
            if ( BOF() )
               exit
            endif
            Local1--
         enddo
      endif
   endif
   return Local1
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Mensagem por carlos_dornelas »

Rochinha, tenho um dbf criptografado por uma rotina própria e vendo este seu tópico me surgiu a idéia da possibilidade de alterar o dbedit para mostrar os dados descriptografados, talvez através de um code blok, mas não sei por onde começar. Você já fez algo parecido ou poderia me dar uma luz?

Desde já obrigado,

Antonio Carlos - Curitiba
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Se os campos criptografados foram resolvidos usando alguma func'~ao de criptografia de alguma .LIB para Clipper conhecida voce terá exito.

Criptografia é uma coisa pessoal, exemplo:

Voce vai criptografar uma frase ou campo e usa uma técnica conhecida, até ai tudo bem se voce souber qual a ferramenta foi usado é possivel reverter.

Voce vai criptografar uma frase ou campo e usando uma técnica criada por voce, se voce se esquecer de como reverter, aí ja era.

Eua não aconselho, mas em todo caso faça testes usando as funções da SIX2 e outras .LIB que tenhas estas funções.

PS: Poste suas duvidas nos Forum Clipper/Fivewin, aqui serão somente para visualização.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder