As rotinas apresentadas aqui permitem realizar rotações na tela de texto padrão: 25 linhas x 80 colunas. Os efeitos são gerados com o auxílio das funções SaveScreen e RestScreen. Veja a dica Como o Clipper grava o vídeo com a função SaveScreen, para ter um maior entendimento do funcionamento destas rotinas.
Veja abaixo como você pode realizar rotações na tela, em cada uma das quatro direções e nas diagonais.
1. Rotação para a esquerda - a tela é movida para a esquerda, sendo que a primera coluna vai para a posição da última coluna:
// o conteúdo da tela é armazenado na variável cTela
cTela := SaveScreen(0, 0, MaxRow(), MaxCol())
// iniciá-se um ‘loop’ que vai da primeira linha (0)
// até a última linha (24)
For nLinha := 0 To 24
// a posição inicial da linha nLinha, dentro da variável, é calculada
nPosIni := nLinha * 160 + 1
// o conteúdo da linha é armazenado, temporariamente,
// na variável cLinha
cLinha := SubStr(cTela, nPosIni, 160)
// os dois primeiros elementos (caractere e atributos) são transferidos para
// o final da linha
cLinha := SubStr(cLinha, 3) + SubStr(cLinha, 1, 2)
// o conteúdo da linha é colocado de volta na variável cTela
cTela := SubStr(cTela, 1, nPosIni - 1) + cLinha + SubStr(cTela, nPosIni + 160)
Next nLinha
// o conteúdo da tela, modificado, é restaurado
RestScreen(0, 0, MaxRow(), MaxCol(), cTela)
2. Rotação para a direita - a tela é movida para a direita, sendo que a última coluna vai para a posição da primeira coluna. O processo é semelhante ao descrito acima. A diferença reside no fato de que o último caractere da linha deve ser transferido para o início:
// o conteúdo da tela é armazenado na variável cTela
cTela := SaveScreen(0, 0, MaxRow(), MaxCol())
// inicia-se um ‘loop’ que vai da primeira linha (0)
// até a última linha (24)
For nLinha := 0 To 24
// a posição inicial da linha nLinha, dentro da variável, é calculada
nPosIni := nLinha * 160 + 1
// o conteúdo da linha é armazenado, temporariamente,
// na variável cLinha
cLinha := SubStr(cTela, nPosIni, 160)
// os dois últimos elementos (caractere e atributos) são transferidos para
// o começo da linha
cLinha := SubStr(cLinha, 159, 2) + SubStr(cLinha, 1, 158)
// o conteúdo da linha é colocado de volta na variável cTela
cTela := SubStr(cTela, 1, nPosIni - 1) + cLinha + SubStr(cTela, nPosIni + 160)
Next nLinha
// o conteúdo da tela, modificado, é restaurado
RestScreen(0, 0, MaxRow(), MaxCol(), cTela)
3. Rotação para cima - a tela é movida para cima, sendo que a primeira linha vai para a posição da última linha:
// o conteúdo da tela é armazenado na variável cTela
cTela := SaveScreen(0, 0, MaxRow(), MaxCol())
// o conteúdo da primeira linha é transferido
// para o final
cTela := SubStr(cTela, 161) + SubStr(cTela, 1, 160)
// o conteúdo da tela, modificado, é restaurado
RestScreen(0, 0, MaxRow(), MaxCol(), cTela)
4. Rotação para baixo - a tela é movida para baixo, sendo que a última linha vai para a posição da primeira linha:
// o conteúdo da tela é armazenado na variável cTela
cTela := SaveScreen(0, 0, MaxRow(), MaxCol())
// o conteúdo da primeira linha é transferido
// para o final
cTela := SubStr(cTela, 24 * 160 + 1, 160) + SubStr(cTela, 1, 24 * 160)
// o conteúdo da tela, modificado, é restaurado
RestScreen(0, 0, MaxRow(), MaxCol(), cTela)
5. Rotação em diagonal - basta usar as rotinas acima em conjunto. Veja abaixo como seria uma rotação para cima e para a esquerda:
// o conteúdo da tela é armazenado na variável cTela
cTela := SaveScreen(0, 0, MaxRow(), MaxCol())
// rotina de rotação para cima
cTela := SubStr(cTela, 161) + SubStr(cTela, 1, 160)
// rotina de rotação para a esquerda
For nLinha := 0 To 24
nPosIni := nLinha * 160 + 1
cLinha := SubStr(cTela, nPosIni, 160)
cLinha := SubStr(cLinha, 3) + SubStr(cLinha, 1, 2)
cTela := SubStr(cTela, 1, nPosIni - 1) + cLinha + SubStr(cTela, nPosIni + 160)
next l
// o conteúdo da tela, modificado, é restaurado
RestScreen(0, 0, MaxRow(), MaxCol(), cTela)
Autor/fonte: Marcos Gambeta
Tags:
Clipper