Clipper - Como o Clipper grava o vídeo com a função SaveScreen

Posted by webmaster | Clipper |


Na linguagem Clipper, existem duas funções que permitem gravar e recuperar o vídeo, total ou parcialmente: a função SaveScreen e a função RestScreen. A primeira permite armazenar em uma variável do tipo ‘character’ o conteúdo de uma região do vídeo e a segunda permite recuperar o conteúdo armazenado. Conhecer como o vídeo é armazenado em uma variável abre caminho para uma série de possibilidades, como a criação de efeitos especiais por exemplo.

Quando uma tela ou parte dela é gravada em uma variável, a função SaveScreen armazena a informação de forma seqüencial: primeira linha, segunda linha, terceira linha e assim por diante. O conteúdo de cada linha é armazenado da esquerda para a direita. Cada caractere ocupa duas posições na variável de armazenamento: a primeira posição armazena o código ASCII do caractere e a segunda posição armazena os atributos (cores de frente e de fundo).

Desta forma, uma linha de 80 colunas necessita de 160 posições para ser armazenada: 80 para o conteúdo e 80 para os atributos. Neste ponto, deve ficar claro que as posições ímpares (1,3,5,7,…) guardam os caracteres presentes na região armazenada e as posições pares (2,4,6,8,…) guardam os atributos destes caracteres.

Os atributos de um caractere indicam a suas cores. A fórmula para se calcular o valor dos atributos de um determinado caractere é a seguinte:

nAtributo := CorDeFrente + CorDeFundo * 16

Com a tela armazenada em uma variável, é possível usar as funções de manipulação de ’strings’ do Clipper para modificar a informação gravada. Ao ser usada a função RestScreen para restaurar o conteúdo da tela, estará sendo restaurada a tela modificada.

Autor/fonte: Marcos Gambeta

Tags:

Clipper - Como fazer rotações no vídeo

Posted by webmaster | Clipper |


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 - Como saber se um ano é bissexto ou não

Posted by webmaster | Clipper |


Para saber se um ano é bissexto ou não, deve-se seguir as regras abaixo:

1. Se o ano não termina em 00, ele é bissexto se for divisível por 4. Exemplos: 1988, 1992, 1996, 2004, e assim por diante;

2. Se o ano termina em 00, ele é bissexto se for divisível por 400. Exemplos: 2000, 2400, 2800, e assim por diante.

A função abaixo pode ser usada para a identificação de anos bissextos:

#include “COMMON.CH”

Function AnoBissexto( nAno )

Local lAno

Default nAno To Year( Date() )
lAno := FALSE
If (nAno % 4 = 0 .And. nAno % 100 <> 0) .Or. (nAno % 400 = 0)
lAno := TRUE
EndIf
Return lAno

Ela recebe como parâmetro o ano e retorna .T. se for bissexto e .F. caso não seja. Se não for passado nenhum parâmetro, a função usará o ano corrente.

Autor/fonte: Marcos Gambeta

Tags:
Page 4 of 10Primeiro...«23456»...Último