Alguem sabe como rolar um Canvas ?

Programação Delphi e Pascal

Moderadores: 51, guest2003

Alguem sabe como rolar um Canvas ?

Mensagempor Wagner de Queiroz » 01 Ago 2007 21:12

Pessoal, to numa enrascada das brabas.

Preciso fazer um processo igual a este abaixo:

Imagem

Estou desenhando diretamente no canvas da aplicacao e nao posso usar componentes externos por causa do Turbo Delphi Explorer. Desenhar o grafico é facil o problema é que eu preciso saber como ir rolando o canvas. Preciso mostrar os ultimos 25 resultados de uma plotagem maluca e preciso ir rolando os dados mais antigos para fora para dar espaco aos dados mais novos (Como o historico do uso de CPU do programa Gerenciador de Tarefas do Windows, para quem nao sabe o ctrl alt Del vai de dar uma dica (Aba Desempenho))

preciso fazer um grafico igual aquele para monitorar os dados de um processo.

Alguem tem ideia de como eu faria isso ?
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Mensagempor chipselect » 02 Ago 2007 15:37

boa tarde Wagner, sua imagem não abriu no meu Firefox... mas eu fiz uma "rolagem" em canvas quando fiz meu próprio visualizador de relatório de impressão (época que gostava de fazer tudo na unha). Eu usava metafile e o scroll era limitado ao tamanho do papel de impressão. Segue o código:

[code]
void TFormRelatorios::printScreen()
{
TMetafile *m;
TRect retangulo;
long x,y;
clearScreen();
m = (TMetafile *) lista->Items[indiceAtual];
y=((float)m->Height/m->Width)*imagem->Width;
x=y-imagem->Height;
ScrollBar1->Max=(int)x-1;
if(ScrollBar1->Position>=x)ScrollBar1->Position=x;
retangulo.left=0;
retangulo.right=imagem->Width;
retangulo.top=-1*ScrollBar1->Position;
retangulo.bottom=imagem->Height+x+retangulo.top;
imagem->Canvas->Brush->Color=clBtnFace;
imagem->Canvas->Rectangle(0,0,imagem->Width,imagem->Height);
imagem->Canvas->Brush->Color=clWhite;
imagem->Canvas->Rectangle(retangulo);
imagem->Canvas->StretchDraw(retangulo,m);
}
void TFormRelatorios::clearScreen()
{
TRect rect;
rect.left=0;
rect.top=0;
rect.right=imagem->Width;
rect.Bottom=imagem->Height;
imagem->Canvas->Brush->Color=clGreen;
imagem->Canvas->FillRect(rect);
}
[/code]

Caso você esteja usando as funções de desenho geométrico, como linhas, você pode causar um "clearScreen" em cada amostra nova, mandar um "repaint" no componente e então, no evento de pintura do componente, desenhar as últimas 25 amostras após chamar o default draw dele. Isso é melhor do que usar "janelinha de desenho" como fiz, porque no seu caso não há limite para o "fim do scroll", o que poderia estourar os limites das variáveis de coordenadas usando "janelinha de pintura".

Obviamente o processo é lento, depende de sua taxa de atualização desejada, caso seja "alta" para a vcl, vai ter que escrever um "componente" mais veloz, derivado do TPanel por exemplo.

O Turbo C++ Explorer não pode instalar pacotes adicionais além de dificultar a instalação de componentes novos, mas caso tenha o código fonte do componente, é possível incluir o componente no TC sim, só dá um trabalhão, e não infringe a licença de uso do TC++ Explorer.

Caso seja um projeto de hobby (não comercial), então baixe o TurboTweaker 1.17, pressione "Crtl + Alt + L" numa tela específica para aparecer a opção "desbloquear o TC" que você terá um TC Professional e poderá instalar qualquer componente.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor Wagner de Queiroz » 03 Ago 2007 01:10

Acabei de chegar em casa agora, 1 da matina, trabalhando até nao aguentar, apesar do seu codigo ser em C, e eu usar o Delphi, nao deve ser dificil traduzir. De toda forma Muito obrigado pelas dicas !

Agora que parece que esta novela acaba, vou comecar a brigar com a porta serial, acho que sua dica do tweak vai me ajudar tb.

To pensando em usar o Synaser (Vide dica que eu mesmo publiquei aqui)
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Mensagempor chipselect » 03 Ago 2007 14:08

eu não conheço o sinaser, baixei ele, parece que as funções são bloqueantes, não? Isso facilita a programação.

Eu utilizo esse código aqui (com uma ou outra modificaçãozinha):
http://tetraedre.com/advanced/serial2.php

Roda em thread e gera mensagens de eventos, as funções não são bloqueantes, mas isso tudo pode complicar seu projeto, caso o objetivo não inclua performance e usabilidade ao máximo.

Outro problema desse código é não ser muito portável para Linux, pois usa coisas como WaitForMultipleObjects, que é do Windows, mas um pessoal do Linux está "portando" essa funcionalidade pro pinguin... se já não terminaram isso.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50


Voltar para Delphi e Pascal

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x