Página 1 de 2

Mudar ordem dos elementos de um achoice

Enviado: 12 Mar 2008 13:53
por Pablo César
Quem ja se viu a necessidade de fazer uma rotina em que precise ser alterado a ordem seja de registros ou de elementos de vetores. Por exemplo:

1. Tenho os seguintes elementos (aqui exemplificados como vetor unidimensional): aVetor:={"DDDD","CCCC","AAAA","BBBB"}
2. Preciso ordenar de forma que fiquem:
  • AAAA
    BBBB
    CCCC
    DDDD
Passarei abaixo uma rotina que precisa ser melhorada, pois ela utiliza-se do ACHOICE para escolher o elemento que precisa mudar a ordem.

Código: Selecionar todos

/*
PROGRAMA   : MUDAPOS.PRG
COMENTARIO : Rotina para alterar a ordem dos elementos através de um menú.
             Clipper 5.2 + CT
*/

#include "inkey.ch"
#include "achoice.ch"

FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={"DDDD","CCCC","AAAA","BBBB"} // 1º exemplo
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)

FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={}
FOR I=65 TO 90
    AADD(aVetor,REPLICATE(CHR(I),4))  // 2º exemplo
NEXT
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)


FUNCTION MUDA_SEQ(nLni,nCli,nLnf,nClf,aCor,aVetor)
SET CURSOR OFF
nTam:=LEN( aVetor )
nTlm:=LEN( ALLTRIM( STR( nTam ) ) )
nIni:=1
SETCOLOR(aCor[1]+","+aCor[2]+",,,"+aCor[3])
@ nLni-1,(nCli-2)-(nTlm+1) CLEAR TO ( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2
@ nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2 BOX ( CHR(218)+CHR(196)+CHR(191)+CHR(179)+CHR(217)+CHR(196)+CHR(192)+CHR(179) ) COLOR aCor[4]
SOMBRA(nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2)
DO WHILE .T.
   MENSAGEM("Selecione com <Enter> o que deseja mudar a ordem")
   FOR I=1 TO nTam
       @ (nLni-1)+I,(nCli-nTlm)-1 SAY PADL(ALLTRIM(STR(I)),nTlm) COLOR aCor[1]
   NEXT
   nIni:=ACHOICE(nLni,nCli,nLnf,nClf,aVetor,,"FUN_KEY",nIni)
   IF LASTKEY()=27
      EXIT
   ENDIF
   MENSAGEM("Utilize "+CHR(25)+" e "+CHR(24)+" para mudar e <Enter> para finalizar")
   aVetor_tmp:=aVetor
   nIni_tmp:=nIni
   DO WHILE .T.
      aElement:=aVetor[nIni]
      nLnP:=FVQPOS(nCli,aElement)
      @ nLnP,nCli SAY PADR(aElement,(nClf-nCli)+2) COLOR aCor[3]
      @ nLnP,(nCli-1) SAY CHR(16) COLOR aCor[3]
      @ nLnP,nCli+(nClf-nCli)+1 SAY CHR(17) COLOR aCor[3]
      nKey:=INKEY(0)
      @ (nLni-1)+nIni,(nCli-1) SAY " " COLOR aCor[1]
      @ (nLni-1)+nIni,nCli+(nClf-nCli)+1 SAY " " COLOR aCor[1]
      DO CASE
         CASE nKey=27                         // ESC
              aVetor:=aVetor_tmp
              nIni:=nIni_tmp
              EXIT
         CASE nKey=13                         // ENTER
              EXIT
         CASE nKey=5                          // Up
              avetor:=SOBE(aVetor,nIni,nTam)
         CASE nKey=24                         // Down
              avetor:=DESCE(avetor,nIni,nTam)
      ENDCASE
      nIni:=ASCAN( avetor,ALLTRIM(aElement) )
      FOR I=1 TO nTam
          @ (nLni-1)+I,nCli SAY PADR(avetor[I],(nClf-nCli)+1) COLOR (IF(I=nIni,aCor[2],aCor[1]))
      NEXT
   ENDDO
ENDDO
RETURN aVetor

FUNCTION SOBE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=1
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<(nIni-1)
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=(nIni-1)
          AADD( aTmp, anew[nIni] )
       ELSE
          IF nCurrent=nIni
             AADD( aTmp, anew[(nIni-1)] )
             nRini:=1
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION DESCE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=nTam
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<nIni
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=nIni
          AADD( aTmp, anew[nIni+1] )
       ELSE
          IF nCurrent=(nIni+1)
             AADD( aTmp, anew[nIni] )
             nRini:=2
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION FUN_KEY( nMode, nCurElement, nRowPos )
LOCAL nRetVal:=AC_CONT, nKey:=LASTKEY()
DO CASE
   CASE nMode == AC_IDLE
        nRetVal := AC_CONT
   CASE nMode == AC_HITTOP
        TONE( 100, 3 )
   CASE nMode == AC_HITBOTTOM
        TONE( 100, 3 )
   CASE nMode == AC_EXCEPT
        DO CASE
           CASE nKey == K_RETURN
                nRetVal := AC_SELECT
           CASE nKey == K_ESC
                nRetVal := AC_ABORT
           OTHERWISE
                nRetVal := AC_GOTO
        ENDCASE
ENDCASE
RETURN nRetVal

FUNCTION FVQPOS(VPC,VSTRNG)
Local VPL,VPT,VFND,VPOS
VPT:=LEN(VSTRNG)
VPOS:=0
FOR VPL=1 TO 24
    VFND:=CHARODD(SCREENSTR(VPL,VPC,VPT))
    VPOS:=VPOS+1
    IF VFND=VSTRNG
       EXIT
    ENDIF
NEXT
RETURN VPOS

FUNCTION SOMBRA( LIN_SUP, COL_SUP, LIN_INF, COL_INF )
IF PCOUNT() = 2 .OR. PCOUNT() = 3
   C_SOM := COL_SUP; L_SOM := LIN_SUP
   LIN_SUP := VAL( SUBS( C_SOM, 1, 2 ) )
   COL_SUP := VAL( SUBS( C_SOM, 3, 2 ) )
   LIN_INF := VAL( SUBS( C_SOM, 5, 2 ) )
   COL_INF := VAL( SUBS( C_SOM, 7, 2 ) )
   COL_SOM := SUBS( C_SOM, 9 )
   LIN_SOM := L_SOM
ENDIF
IF COL_SUP < 2 .OR. LIN_INF > 22
   C_SOM := ""; L_SOM := ""
   RETURN .F.
ENDIF
IF PCOUNT() = 3
   RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
   RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
   RETURN .F.
ENDIF
IF PCOUNT() != 2
   COL_SOM := SAVESCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1 )
   LIN_SOM := SAVESCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2 )
ENDIF
IF SUBS( COL_SOM, 2, 1 ) != CHR( 8 )
   C_SOM := STR( LIN_SUP, 2 ) + STR( COL_SUP, 2 ) + STR( LIN_INF, 2 ) +;
	    STR( COL_INF, 2 ) + COL_SOM
   L_SOM := LIN_SOM
ENDIF
FOR I = 2 TO LEN( COL_SOM ) STEP 2
   COL_SOM := STUFF( COL_SOM, I, 1, CHR( 8 ) )
NEXT
FOR I = 2 TO LEN( LIN_SOM ) / 2 STEP 2
   LIN_SOM := STUFF( LIN_SOM, I, 1, CHR( 8 ) )
NEXT
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .T.

FUNCTION MENSAGEM( TEXTO, PAUSA )
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR()
IF TEXTO = NIL; TEXTO := ""; ENDIF
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR "N/W"
IF PAUSA = NIL
   ULT_MENSAGEM := TEXTO
ELSE
   INKEY( PAUSA )
   @ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR "W/N"
ENDIF
RETURN NIL
Esta rotina, funciona bem mas quando a quantidade de elementos ultrapassa a quantidade máxima de linhas de uma tela (normalmente para tela no modo 80x24), fica inviável. A solução que eu penso que daria certo, é em lugar disto:

Código: Selecionar todos

nIni:=ASCAN( avetor,ALLTRIM(aElement) ) 
FOR I=1 TO nTam
    @ (nLni-1)+I,nCli SAY PADR(avetor[I],(nClf-nCli)+1) COLOR (IF(I=nIni,aCor[2],aCor[1]))
NEXT
Mudar para que a exibição em tela de parte dos elementos, possa se divida em dois blocos de telas, através da função SCROLL. Como eu não tenho muita experiência com a função SCROLL(), gostaria de pedir ajuda para quem tem familiaridade com essa função e poder fazer que esta rotina funcionasse em todas as situações. É dizer, o que preciso resolver é questão de exibição em tela por causa de que são exibidos PARTE dos elementos no achoice.

Enviado: 12 Mar 2008 14:22
por Pablo César
Para quem ja compilou, deve ter percebido o drama. Mas acho que teria outra solução mais simples e prática para ser adotada. Em lugar de usar o SCROLL, o que demandaria muitos SAVESCREENs e @ SAYs... acho que poderia ser utilizado uma ACHOICE com saída imediata através de função para o achoice, de forma que sirva apenas para exibir parte dos elementos, conforme tamanho do achoice. Vou tentar, se alguém tiver alguma sugestão, ficarei pronto para testar...

Enviado: 12 Mar 2008 15:29
por Pablo César
Estou quase conseguindo, falta fazer alguns ajustes. Vejam como está ficando:

Código: Selecionar todos

/*
PROGRAMA   : MUDAPOS.PRG
COMENTARIO : Rotina para alterar a ordem dos elementos atrav‚s de men£
             Clipper 5.2 + CT
*/

#include "inkey.ch"
#include "achoice.ch"


//------------ Exemplo 1
FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={"DDDD","CCCC","AAAA","BBBB"}
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)

//------------ Exemplo 2
FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={}
FOR I=65 TO 90
    AADD(aVetor,REPLICATE(CHR(I),4))
NEXT
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)




FUNCTION MUDA_SEQ(nLni,nCli,nLnf,nClf,aCor,aVetor)
SET CURSOR OFF
nTam:=LEN( aVetor )
nTlm:=LEN( ALLTRIM( STR( nTam ) ) )
nIni:=1
SETCOLOR(aCor[1]+","+aCor[2]+",,,"+aCor[3])
@ nLni-1,(nCli-2)-(nTlm+1) CLEAR TO ( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2
@ nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2 BOX ( CHR(218)+CHR(196)+CHR(191)+CHR(179)+CHR(217)+CHR(196)+CHR(192)+CHR(179) ) COLOR aCor[4]
// SOMBRA(nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2)
DO WHILE .T.
   // MENSAGEM("Selecione com <Enter> o que deseja mudar a ordem")
   /*
   FOR I=1 TO nTam
       @ (nLni-1)+I,(nCli-nTlm)-1 SAY PADL(ALLTRIM(STR(I)),nTlm) COLOR aCor[1]
   NEXT
   */
   nIni:=ACHOICE(nLni,nCli,nLnf,nClf,aVetor,,"FUN_KEY",nIni)
   IF LASTKEY()=27
      EXIT
   ENDIF
   // MENSAGEM("Utilize "+CHR(25)+" e "+CHR(24)+" para mudar e <Enter> para finalizar")
   aVetor_tmp:=aVetor
   nIni_tmp:=nIni
   DO WHILE .T.
      aElement:=aVetor[nIni]
      aTmp:={}
      FOR nCurrent := 1 TO nTam
          // IF nCurrent=nIni
          //    AADD(aTmp,PADL(ALLTRIM(STR(nCurrent)),nTlm)+CHR(16)+PADR(aVetor[ nCurrent ]+CHR(17))
          // ELSE

          // AADD(aTmp,PADR(PADL(ALLTRIM(STR(nCurrent)),nTlm)+"ÿ"+aVetor[ nCurrent ],(nClf-nClf)))
          AADD(aTmp,PADL(ALLTRIM(STR(nCurrent)),nTlm)+"ÿ"+aVetor[ nCurrent ])

          // ENDIF
      NEXT
      KEYBOARD CHR(13)

      // ACHOICE(nLni,nCli,nLnf,nClf,aVetor,,"FUN_SAI",nIni)
      ACHOICE(nLni,nCli-2,nLnf,nClf+1,aTmp,,"FUN_SAI",nIni)

      nLnP:=FVQPOS(nCli,aElement)
      @ nLnP,nCli SAY PADR(aElement,(nClf-nCli)+2) COLOR aCor[3]
      @ nLnP,(nCli-1) SAY CHR(16) COLOR aCor[3]
      @ nLnP,nCli+(nClf-nCli)+1 SAY CHR(17) COLOR aCor[3]
      @ nLnP,(nCli-1) SAY " " COLOR aCor[1]
      @ nLnP,nCli+(nClf-nCli)+1 SAY " " COLOR aCor[1]
      nKey:=INKEY(0)
      DO CASE
         CASE nKey=27                         // ESC
              aVetor:=aVetor_tmp
              nIni:=nIni_tmp
              EXIT
         CASE nKey=13                         // ENTER
              EXIT
         CASE nKey=5                          // Up
              avetor:=SOBE(aVetor,nIni,nTam)
         CASE nKey=24                         // Down
              avetor:=DESCE(avetor,nIni,nTam)
      ENDCASE
      nIni:=ASCAN( avetor,ALLTRIM(aElement) )
   ENDDO
ENDDO
RETURN aVetor

FUNCTION SOBE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=1
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<(nIni-1)
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=(nIni-1)
          AADD( aTmp, anew[nIni] )
       ELSE
          IF nCurrent=nIni
             AADD( aTmp, anew[(nIni-1)] )
             nRini:=1
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION DESCE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=nTam
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<nIni
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=nIni
          AADD( aTmp, anew[nIni+1] )
       ELSE
          IF nCurrent=(nIni+1)
             AADD( aTmp, anew[nIni] )
             nRini:=2
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION FUN_KEY( nMode, nCurElement, nRowPos )
LOCAL nRetVal:=AC_CONT, nKey:=LASTKEY()
DO CASE
   CASE nMode == AC_IDLE
        nRetVal := AC_CONT
   CASE nMode == AC_HITTOP
        TONE( 100, 3 )
   CASE nMode == AC_HITBOTTOM
        TONE( 100, 3 )
   CASE nMode == AC_EXCEPT
        DO CASE
           CASE nKey == K_RETURN
                nRetVal := AC_SELECT
           CASE nKey == K_ESC
                nRetVal := AC_ABORT
           OTHERWISE
                nRetVal := AC_GOTO
        ENDCASE
ENDCASE
RETURN nRetVal

FUNCTION FUN_SAI()
RETURN AC_SELECT

FUNCTION FVQPOS(VPC,VSTRNG)
Local VPL,VPT,VFND,VPOS
VPT:=LEN(VSTRNG)
VPOS:=0
FOR VPL=1 TO 24
    VFND:=CHARODD(SCREENSTR(VPL,VPC,VPT))
    VPOS:=VPOS+1
    IF VFND=VSTRNG
       EXIT
    ENDIF
NEXT
RETURN VPOS
Agora eu tenho que sair, mas retornarei ainda hoje com o código ja terminado. Pensei que alguém iria dar-me uma mãozinha... mas tudo bem, eu sei que vou conseguir e irei postar o código definitivo. Até +

Enviado: 12 Mar 2008 17:17
por Daniel
se é so pra por em ordem, tenta assim.

aVetor:={"DDDD","CCCC","AAAA","BBBB"}
aVetorEmOrdem:= ASort(aVetor,,, { |x,y| x < y })

Enviado: 12 Mar 2008 17:25
por Maligno
Não li o código, mas pelo que entendi, a intenção não é apenas ordenar, mas montar um recurso que permita o usuário escolher a ordem dos elementos.

Enviado: 12 Mar 2008 18:02
por Pablo César
Maligno escreveu:Não li o código
Ahhh que pena ! Pensei que irias me ajudar... hihi mas não se preocupe está quase saindo (vou fazer um lanche e ja sai).
Maligno escreveu:um recurso que permita o usuário escolher a ordem dos elementos.
Isso mesmo, Maligno. A ordem é o usuário que irá determinar. Coloquei como exemplo aquela ordem AAAA, BBBB, CCCC... isso deve ter confundido o Daniel, mesmo assim vou terminar agora e posto logo que terminar.

Enviado: 12 Mar 2008 18:43
por Wind
Eu uso algo parecido: a matriz original tem uma segunda coluna que controla a ordem de apresentação, a qual é alterada pela função de usuário do ACHOICE... Uso CTRL 24 (ao invés de 24) etc., pra manter as teclas de navegação acima e abaixo.

* Matriz inicial:
matriz:={}
aadd(matriz,{"AAAAAA",1})
aadd(matriz,{"BBBBBB",2})
aadd(matriz,{"CCCCCC",3})
aadd(matriz,{"DDDDDD",4})

Código: Selecionar todos

function escolhe(matriz)
publ inicio:=1, saída:=.f.
do whil .t.
  reordena()
  bc=achoice(07,01,12,15,mostra,,"usuario",inicio)
  if saida
    exit
  endi
endd
quit

Código: Selecionar todos

function reordena
priv x
matriz=asort(matriz,,,{ |x,y| x[2]<y[2] })
pub mostra:={}
for x=1 to len(matriz)
  aadd(mostra,matriz[x,1])
next

Código: Selecionar todos

function usuario(a1,a2,a3)
priv x,y
x=2
if lastkey()=401 // CRTL SETA BAIXO
  if a2#len(mostra)
    y=matriz[a2,2]
    matriz[a2,2]:=matriz[a2+1,2]
    matriz[a2+1,2]:=y
    x=0
    inicio=a2+1
  endi
elseif lastkey()=397 // CRTL SETA ACIMA
  if a2#1
    y=matriz[a2,2]
    matriz[a2,2]:=matriz[a2-1,2]
    matriz[a2-1,2]:=y
    x=0
    inicio=a2-1
  endi
elseif lastkey()=27
  saida=.t.
  x=0
endi
retu x

Enviado: 12 Mar 2008 18:46
por Maligno
Pablo César escreveu:Ahhh que pena ! Pensei que irias me ajudar...
Nada me daria mais prazer. Mas estou preso naquele programa de gerenciamento de servidores POP que eu havia comentado. E tem coisa que tá de rosca. :[

Enviado: 12 Mar 2008 18:48
por Toledo
Pablo, dê uma olhada se é assim que você quer...

Código: Selecionar todos

/*
PROGRAMA   : MUDAPOS.PRG
COMENTARIO : Rotina para alterar a ordem dos elementos através de um menú.
             Clipper 5.2 + CT
*/

#include "inkey.ch"
#include "achoice.ch"

FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={"DDDD","CCCC","AAAA","BBBB"} // 1º exemplo
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)

FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={}
FOR I=65 TO 90
    AADD(aVetor,REPLICATE(CHR(I),4))  // 2º exemplo
NEXT
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)


FUNCTION MUDA_SEQ(nLni,nCli,nLnf,nClf,aCor,aVetor)
SET CURSOR OFF
nTam:=LEN( aVetor )
nTlm:=LEN( ALLTRIM( STR( nTam ) ) )
nIni:=1
nPosJan:=0
nTJa:=(nLnf-nLni)
nNui:=1
nNuf:=nNui+nTJa
IF nNuf>nTam
 nNuf:=nTam
ENDIF
nLini:=nLni
nColi:=(nCli-nTlm)-1
cCor1:=aCor[1]
SETCOLOR(aCor[1]+","+aCor[2]+",,,"+aCor[3])
@ nLni-1,(nCli-2)-(nTlm+1) CLEAR TO ( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2
@ nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2 BOX ( CHR(218)+CHR(196)+CHR(191)+CHR(179)+CHR(217)+CHR(196)+CHR(192)+CHR(179) ) COLOR aCor[4]
SOMBRA(nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2)
DO WHILE .T.
   MENSAGEM("Selecione com <Enter> o que deseja mudar a ordem")
   nLin:=nLni
   FOR I=nNui TO nNuf
       @ nLin,(nCli-nTlm)-1 SAY PADL(ALLTRIM(STR(I)),nTlm) COLOR aCor[1]
       nLin+=1
   NEXT
   nIni:=ACHOICE(nLni,nCli,nLnf,nClf,aVetor,,"FUN_KEY",nIni,nPosJan)
   IF LASTKEY()=27
      EXIT
   ENDIF
   MENSAGEM("Utilize "+CHR(25)+" e "+CHR(24)+" para mudar e <Enter> para finalizar")
   aVetor_tmp:=aVetor
   nIni_tmp:=nIni
   DO WHILE .T.
      aElement:=aVetor[nIni]
      nLnP:=(nLni+nPosJan)    //FVQPOS(nCli,aElement)
      @ nLnP,nCli SAY PADR(aElement,(nClf-nCli)+2) COLOR aCor[3]
      @ nLnP,(nCli-1) SAY CHR(16) COLOR aCor[3]
      @ nLnP,nCli+(nClf-nCli)+1 SAY CHR(17) COLOR aCor[3]
      nKey:=INKEY(0)
      @ nLnP,(nCli-1) SAY " " COLOR aCor[1]
      @ nLnP,nCli+(nClf-nCli)+1 SAY " " COLOR aCor[1]
      DO CASE
         CASE nKey=27                         // ESC
              aVetor:=aVetor_tmp
              nIni:=nIni_tmp
              EXIT
         CASE nKey=13                         // ENTER
              EXIT
         CASE nKey=5                          // Up
              avetor:=SOBE(aVetor,nIni,nTam)
              nPosJan-=1
              IF nPosJan<=0
               nPosJan:=0
              ENDIF
         CASE nKey=24                         // Down
              avetor:=DESCE(avetor,nIni,nTam)
              nPosJan+=1
              IF nPosJan>=(nNuf-nNui)
               nPosJan:=(nNuf-nNui)
              ENDIF
      ENDCASE
      nIni:=ASCAN( avetor,ALLTRIM(aElement) )
      IF nPosJan=nTJa
       IF (nNuf-nNui)<nIni
        nNui:=nIni-(nNuf-nNui)
        nNuf:=nNui+nTJa
       ENDIF
      ENDIF
      IF nIni<nNui
       nNui:=nIni
       nNuf:=nNui+nTJa
      ENDIF
      nLin:=nLni
      FOR I=nNui TO nNuf
          @ nLin,(nCli-nTlm)-1 SAY PADL(ALLTRIM(STR(I)),nTlm) COLOR aCor[1]
          @ nLin,nCli SAY PADR(avetor[I],(nClf-nCli)+1) COLOR aCor[1]
          nLin+=1
      NEXT
   ENDDO
ENDDO
RETURN aVetor

FUNCTION SOBE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=1
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<(nIni-1)
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=(nIni-1)
          AADD( aTmp, anew[nIni] )
       ELSE
          IF nCurrent=nIni
             AADD( aTmp, anew[(nIni-1)] )
             nRini:=1
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION DESCE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=nTam
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<nIni
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=nIni
          AADD( aTmp, anew[nIni+1] )
       ELSE
          IF nCurrent=(nIni+1)
             AADD( aTmp, anew[nIni] )
             nRini:=2
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION FUN_KEY( nMode, nCurElement, nRowPos )
LOCAL nRetVal:=AC_CONT, nKey:=LASTKEY()
nPosJan:=nRowPos
IF nCurElement<nNui
   nNui:=nCurElement
   nNuf:=nNui+nTJa
ENDIF
IF nPosJan=nTJa
 IF (nNuf-nNui)<nCurElement
  nNui:=nCurElement-(nNuf-nNui)
  nNuf:=nNui+nTJa
 ENDIF
ENDIF
nLin:=nLini
FOR I=nNui TO nNuf
    @ nLin,nColi SAY PADL(ALLTRIM(STR(I)),nTlm) COLOR cCor1
    nLin+=1
NEXT
DO CASE
   CASE nMode == AC_IDLE
        nRetVal := AC_CONT
   CASE nMode == AC_HITTOP
        TONE( 100, 3 )
   CASE nMode == AC_HITBOTTOM
        TONE( 100, 3 )
   CASE nMode == AC_EXCEPT
        DO CASE
           CASE nKey == K_RETURN
                nRetVal := AC_SELECT
           CASE nKey == K_ESC
                nRetVal := AC_ABORT
           OTHERWISE
                nRetVal := AC_GOTO
        ENDCASE
ENDCASE
RETURN nRetVal

FUNCTION FVQPOS(VPC,VSTRNG)
Local VPL,VPT,VFND,VPOS
VPT:=LEN(VSTRNG)
VPOS:=0
FOR VPL=1 TO 24
    VFND:=CHARODD(SCREENSTR(VPL,VPC,VPT))
    VPOS:=VPOS+1
    IF VFND=VSTRNG
       EXIT
    ENDIF
NEXT
RETURN VPOS

FUNCTION SOMBRA( LIN_SUP, COL_SUP, LIN_INF, COL_INF )
IF PCOUNT() = 2 .OR. PCOUNT() = 3
   C_SOM := COL_SUP; L_SOM := LIN_SUP
   LIN_SUP := VAL( SUBS( C_SOM, 1, 2 ) )
   COL_SUP := VAL( SUBS( C_SOM, 3, 2 ) )
   LIN_INF := VAL( SUBS( C_SOM, 5, 2 ) )
   COL_INF := VAL( SUBS( C_SOM, 7, 2 ) )
   COL_SOM := SUBS( C_SOM, 9 )
   LIN_SOM := L_SOM
ENDIF
IF COL_SUP < 2 .OR. LIN_INF > 22
   C_SOM := ""; L_SOM := ""
   RETURN .F.
ENDIF
IF PCOUNT() = 3
   RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
   RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
   RETURN .F.
ENDIF
IF PCOUNT() != 2
   COL_SOM := SAVESCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1 )
   LIN_SOM := SAVESCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2 )
ENDIF
IF SUBS( COL_SOM, 2, 1 ) != CHR( 8 )
   C_SOM := STR( LIN_SUP, 2 ) + STR( COL_SUP, 2 ) + STR( LIN_INF, 2 ) +;
       STR( COL_INF, 2 ) + COL_SOM
   L_SOM := LIN_SOM
ENDIF
FOR I = 2 TO LEN( COL_SOM ) STEP 2
   COL_SOM := STUFF( COL_SOM, I, 1, CHR( 8 ) )
NEXT
FOR I = 2 TO LEN( LIN_SOM ) / 2 STEP 2
   LIN_SOM := STUFF( LIN_SOM, I, 1, CHR( 8 ) )
NEXT
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .T.

FUNCTION MENSAGEM( TEXTO, PAUSA )
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR()
IF TEXTO = NIL; TEXTO := ""; ENDIF
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR "N/W"
IF PAUSA = NIL
   ULT_MENSAGEM := TEXTO
ELSE
   INKEY( PAUSA )
   @ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR "W/N"
ENDIF
RETURN NIL
Abraços,

Enviado: 12 Mar 2008 18:55
por Pablo César
Quê nada Maligno, nem ligue. Eu sou muito ancioso com as coisas... este exemplo eu queria terminar logo e acabei me apavorando pensando que eu iria utilizar o recurso de SCROLL para dar sensação de movimento da tela. Mas logo ví que um achoice com saída "forçada" resolvia meu caso.

Mas enfim acabei conseguindo e vou postar para que sirva como exemplo alguns dos recursos que utilizei. Alias, pelo que eu vejo temos outros exemplos que vou compilar, analisar-los e comentar a respeito.

Código: Selecionar todos

/*
PROGRAMA   : MUDAPOS.PRG
COMENTARIO : Rotina para alterar a ordem dos elementos atrav‚s de men£
             Clipper 5.2 + CT
*/

#include "inkey.ch"
#include "achoice.ch"


//------------ Exemplo 1
FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={"DDDD","CCCC","AAAA","BBBB"}
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)

//------------ Exemplo 2
FOR I=0 TO 24
    @ I,00 SAY REPLICATE("Û",80) COLOR "W+/B"
NEXT
aVetor:={}
FOR I=65 TO 90
    AADD(aVetor,REPLICATE(CHR(I),4))
NEXT
aNew:=MUDA_SEQ(06,18,21,63,{"15/01","01/07","15/04","15/01"},aVetor)




FUNCTION MUDA_SEQ(nLni,nCli,nLnf,nClf,aCor,aVetor)
SET CURSOR OFF
nTam:=LEN( aVetor )
nTlm:=LEN( ALLTRIM( STR( nTam ) ) )
nIni:=1
SETCOLOR(aCor[1]+","+aCor[2]+",,,"+aCor[3])
@ nLni-1,(nCli-2)-(nTlm+1) CLEAR TO ( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2
@ nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2 BOX ( CHR(218)+CHR(196)+CHR(191)+CHR(179)+CHR(217)+CHR(196)+CHR(192)+CHR(179) ) COLOR aCor[4]
// SOMBRA(nLni-1,(nCli-2)-(nTlm+1),( if( (nLni+nTam+1)<nLnf,(nLni+nTam),nLnf+1) ),nClf+2)
DO WHILE .T.
   // MENSAGEM("Selecione com <Enter> o que deseja mudar a ordem")
   nIni:=ACHOICE(nLni,nCli,nLnf,nClf,aVetor,,"FUN_KEY",nIni)
   IF LASTKEY()=27
      EXIT
   ENDIF
   // MENSAGEM("Utilize "+CHR(25)+" e "+CHR(24)+" para mudar e <Enter> para finalizar")
   aVetor_tmp:=aVetor
   nIni_tmp:=nIni
   DO WHILE .T.
      aElement:=aVetor[nIni]
      aTmp:={}
      FOR nCurrent := 1 TO nTam
          AADD(aTmp,PADL(ALLTRIM(STR(nCurrent)),nTlm)+"ÿ"+aVetor[ nCurrent ])
      NEXT
      KEYBOARD CHR(13)
      ACHOICE(nLni,(nCli-nTlm)-1,nLnf,nClf+1,aTmp,,"FUN_SAI",nIni)
      nLnP:=FVQPOS(nCli,aElement)
      @ nLnP,nCli SAY PADR(aElement,(nClf-nCli)+1) COLOR aCor[3]
      nKey:=INKEY(0)
      DO CASE
         CASE nKey=27                         // ESC
              aVetor:=aVetor_tmp
              nIni:=nIni_tmp
              EXIT
         CASE nKey=13                         // ENTER
              EXIT
         CASE nKey=5                          // Up
              avetor:=SOBE(aVetor,nIni,nTam)
         CASE nKey=24                         // Down
              avetor:=DESCE(avetor,nIni,nTam)
      ENDCASE
      nIni:=ASCAN( avetor,ALLTRIM(aElement) )
   ENDDO
   FOR I=nLni TO ( if( (nLni+nTam)<nLnf,(nLni+nTam)-1,nLnf) )
       @ I,(nCli-nTlm)-1 SAY SPACE(nTlm+1) COLOR aCor[1]
   NEXT
ENDDO
RETURN aVetor

FUNCTION SOBE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=1
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<(nIni-1)
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=(nIni-1)
          AADD( aTmp, anew[nIni] )
       ELSE
          IF nCurrent=nIni
             AADD( aTmp, anew[(nIni-1)] )
             nRini:=1
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION DESCE(aTmp,nIni,nTam)
Local aNew
aNew:={}
FOR nCurrent := 1 TO nTam
    AADD( aNew,SUBSTR(aTmp[nCurrent],AT("ÿ",aTmp[nCurrent])+1) )
NEXT
IF nIni=nTam
   RETURN aNew
ENDIF
aTmp:={}
FOR nCurrent := 1 TO nTam
    IF nCurrent<nIni
       AADD( aTmp, anew[nCurrent] )
    ELSE
       IF nCurrent=nIni
          AADD( aTmp, anew[nIni+1] )
       ELSE
          IF nCurrent=(nIni+1)
             AADD( aTmp, anew[nIni] )
             nRini:=2
          ELSE
             AADD( aTmp, anew[(nIni+nRini)] )
             nRini:=nRini+1
          ENDIF
       ENDIF
    ENDIF
NEXT
RETURN aTmp

FUNCTION FUN_KEY( nMode, nCurElement, nRowPos )
LOCAL nRetVal:=AC_CONT, nKey:=LASTKEY()
DO CASE
   CASE nMode == AC_IDLE
        nRetVal := AC_CONT
   CASE nMode == AC_HITTOP
        TONE( 100, 3 )
   CASE nMode == AC_HITBOTTOM
        TONE( 100, 3 )
   CASE nMode == AC_EXCEPT
        DO CASE
           CASE nKey == K_RETURN
                nRetVal := AC_SELECT
           CASE nKey == K_ESC
                nRetVal := AC_ABORT
           OTHERWISE
                nRetVal := AC_GOTO
        ENDCASE
ENDCASE
RETURN nRetVal

FUNCTION FUN_SAI()
RETURN AC_SELECT

FUNCTION FVQPOS(VPC,VSTRNG)
Local VPL,VPT,VFND,VPOS
VPT:=LEN(VSTRNG)
VPOS:=0
FOR VPL=1 TO 24
    VFND:=CHARODD(SCREENSTR(VPL,VPC,VPT))
    VPOS:=VPOS+1
    IF VFND=VSTRNG
       EXIT
    ENDIF
NEXT
RETURN VPOS
Removí aas funções SOMBRA e MENSAGEM que é para não desviar a atenção. Caso alguém queira está na primeira postagem.

Enviado: 12 Mar 2008 20:08
por Pablo César
Agradeço muito aos colegas que responderam.

Caro colega Wind, em primeiro lugar seja bem vindo ao nosso fórum. Fico muito surpreso com o conteúdo do seu código e da forma tão enxuta. Utilizando uma matriz bidimensional, sintetiza muita coisa. E a idéia de utilizar <Ctrl><Seta para baixo> e <Ctrl><Seta para cima> dão melhor idéia de movimentação. Parabéns pelo seu exemplo. Eu tive que fazer algumas alterações porque estava dando erro ao compilar, ficando assim:

Código: Selecionar todos

cls
matriz:={} 
aadd(matriz,{"AAAAAA",1}) 
aadd(matriz,{"BBBBBB",2}) 
aadd(matriz,{"CCCCCC",3}) 
aadd(matriz,{"DDDDDD",4}) 

publ inicio:=1, saida:=.f., mostra:={}
do whil .t. 
   reordena()
   bc=achoice(07,01,12,15,mostra,,"usuario",inicio)
   if saida
      exit
   endi
endd
for i=1 to len(mostra)
    ? mostra[i]
next
 

function reordena 
priv x 
matriz=asort(matriz,,,{ |x,y| x[2]<y[2] }) 
mostra:={}
for x=1 to len(matriz) 
    aadd(mostra,matriz[x,1])
next 


function usuario(a1,a2,a3) 
priv x,y 
x=2 
if lastkey()=401 // CRTL SETA BAIXO 
   if a2#len(mostra)
      y=matriz[a2,2]
      matriz[a2,2]:=matriz[a2+1,2]
      matriz[a2+1,2]:=y
      x=0
      inicio=a2+1
   endi
elseif lastkey()=397 // CRTL SETA ACIMA 
   if a2#1
      y=matriz[a2,2]
      matriz[a2,2]:=matriz[a2-1,2]
      matriz[a2-1,2]:=y
      x=0
      inicio=a2-1
   endi
elseif lastkey()=27 
   saida=.t.
   x=0
endi 
retu x
Entendí o seu exemplo, caberia melhor ainda o código para que não precisasse utilizar variáveis públicas. Mas gostei, está muito sintético.

Caro Toledo, suas correções foram muito propícias. Coincidentemente, dias atrás, estive a ponto de criar um novo tópico perguntando ao pessoal, se alguém sabia do 9º parâmetro da função ACHOICE. Para quê serviria, e tinha visto um exemplo no meu diretório \CLIP53\SOURCE\SAMPLE\FILEMAN.PRG. Mas confesso que não tinha entendido muito bem. E agora percebí que você o utilizou uma variável chamada nPosJan em lugar da minha função FVQPOS (que faz leitura do vídeo e extrai o número da linha no vídeo). Um recurso que eu vinha utilizando para sub-menus e que ora pareceria uma técnica mui pouco ortodoxa, mas que me ajudou muito até agora. No entanto você ainda conseguiu, simular a enumeração em tela, dando a sensação de estar fazendo rodar os itens e ainda de forma mais limpa e clara (pois com o uso do achoice-abortável que eu incrementei depois, o item em questão fica na primeira linha na rolagem, o que distorcianva a visualização). Gostei também suas correções e da utilidade do 9º parâmetro (em boa hora) que na minha opinião poucos colegas se fazem uso desse parâmetro do achoice. Obrigado pela atenção, espero que este tópico sirva de aprendizado da utilização de vetores e do poderoso "achoice".

Enviado: 12 Mar 2008 21:12
por rosalvo rosa

Código: Selecionar todos

 m_teste:= {}
   AAdd(m_teste,{"aa","bx","ca",1}) //1
   AAdd(m_teste,{"ac","bb","cc",2}) //2
   AAdd(m_teste,{"ac","bb","ca",3}) //3
   AAdd(m_teste,{"ac","ba","cc",4}) //4
   AAdd(m_teste,{"ad","bb","cc",5}) //5

   OrdenaMatriz(m_teste,1,2,3)
   m_teste:={}
   m_teste:= Aclone(m_OrdFinal)

   For i:=1 To Len(m_teste)
      @ 10+i, 10 Say m_teste[i][1] + m_teste[i][2] + m_teste[i][3] + Str(m_teste[i][4])      
   Next

   Func OrdenaMatriz(m_xmatriz,nOrd1,nOrd2,nOrd3)
   Public m_zMatriz:={}
   Public m_OrdFinal:={}
   asort(m_xmatriz, Nil, Nil, { |x, y| x[nOrd1] < y[nOrd1] })
   For z2:=1 To Len(m_xmatriz)
      nOrd:= m_xmatriz[z2][nOrd1]
      zant:= z2
      While z2 <= Len(m_xmatriz) .AND. m_xmatriz[z2][nOrd1] = nOrd
         AAdd(m_zMatriz,(m_xmatriz[z2]))
         z2++
      EndDo
      If z2 > zant .AND. z2 <= Len(m_xmatriz)
         z2--
      EndIf
      If z2 > Len(m_xmatriz)
         z2:= Len(m_xmatriz)
      EndIf
      If Len(m_zMatriz) > 1
         asort(m_zMatriz, Nil, Nil, { |x, y| x[nOrd2] < y[nOrd2] })
         If nOrd3 <> 0
            For x:=1 To Len(m_zMatriz)
               Public m_Ord3:={}
               TercMatrizOrdem(m_zMatriz,nOrd2,nOrd3,@m_Ord3)
               m_zMatriz:={}
               For x4:= 1 To Len(m_Ord3)
                  AAdd(m_OrdFinal,(m_Ord3[x4]))
               Next
            Next
         EndIf
      Else
         If Len(m_zMatriz) = 1
            AAdd(m_OrdFinal,(m_zMatriz[1]))
         EndIf
         m_zMatriz:= {}
      EndIf
   Next
   Return m_OrdFinal
   *************************************************************
   Func TercMatrizOrdem(m_zMatriz,nOrd2,nOrd3,m_Ord3)
   m_Ord3:={}
   m_FinOrd:={}
   For z3:=1 To Len(m_zMatriz)
      nOrd:= m_zMatriz[z3][nOrd2]
      zant:= z3
      While z3 <= Len(m_zMatriz) .AND. m_zMatriz[z3][nOrd2] = nOrd
         AAdd(m_Ord3,(m_zMatriz[z3]))
         z3++
      EndDo
      If z3 > zant .AND. z3 <= Len(m_zMatriz)
         z3--
      EndIf
      If z3 > Len(m_zMatriz)
         z3:= Len(m_zMatriz)
      EndIf
      If Len(m_Ord3) > 1
         asort(m_Ord3, Nil, Nil, { |x, y| x[nOrd3] < y[nOrd3] })
         For x3:= 1 To Len(m_Ord3)
            AAdd(m_FinOrd,(m_Ord3[x3]))
         Next
         m_Ord3:= {}
      Else
         If Len(m_Ord3) = 1
            AAdd(m_FinOrd,(m_Ord3[1]))
            m_Ord3:= {}
         EndIf
      EndIf
   Next
   m_Ord3:= {}
   m_Ord3:= ACLONE(m_FinOrd)
   Return m_Ord3


nesta função, vc poderá ordenar sua matriz em uma ordem e duas
sub-ordens, respectivamente nOrd1,nOrd2 e nOrd3.
exemplo :
ordenamatriz(@m_matriz,2,4,1)
não sei se ajuda, mas está aí.

Enviado: 12 Mar 2008 21:32
por Pablo César
Boa noite Rosalvo, obrigado pelo seu exemplo. Eu não conseguí compilar pois está dando falta da função TERCMATRIZ, se pudesse mandar a função que falta, agradeço. Também gostaria de saber cómo seria a sintaxe para chamar a função OrdenaMatriz, os parâmetros nOrd1, nOrd2 e nOrd3 são obrigatórios ? O quê iriam nesse parâmetros ?

ordena matriz

Enviado: 12 Mar 2008 21:35
por rosalvo rosa
Olá Pablo, acabei de editar a msg novamente, dê uma olhada.
um abraço.

Re: ordena matriz

Enviado: 12 Mar 2008 21:53
por Pablo César
Rosalvo, eu conseguí compilar após duas re-edições da sua mensagem anterior. E chamei a sua função da seguinte forma:

Código: Selecionar todos

matriz:={} 
FOR I=65 TO 90 
    AADD(matriz,{REPLICATE(CHR(I),6),I})
NEXT 
vetor:=OrdenaMatriz(matriz,1,2)
O terceiro parâmetro é caso eu queira ordenar uma matriz quadridimensional, não é ?. O quê acontece se coloco os três parâmetros ? Você poderia exemplificar ?.