Problema com o Timer
E ai pessoal td bem?
Olha tô com esse código:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Picture.LoadFromFile(ListBox1.Items[contador]);
inc(contador);
if contador = ListBox1.Items.Count then
contador:=0;
end;
Esse código faz com que a cada interlevalo, que no meu o intreval é igual a 100, mude imagem por imagem.
Gostaria de saber se há um jeito de ter um código que tem a mesma função que essa, mas qeu naum fique no procedure TForm1.Timer1Timer(Sender: TObject); e que fique num procedure do tipo procedure imagem(...); e que essa procedure imagem naum seja chamada dentro do timer, quero que seja totalmente independente da procedure Timer1Timer, se houver por favor me avisa... tô precisando muito dessa ajuda.
Obrigado pela atenção
Olha tô com esse código:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Picture.LoadFromFile(ListBox1.Items[contador]);
inc(contador);
if contador = ListBox1.Items.Count then
contador:=0;
end;
Esse código faz com que a cada interlevalo, que no meu o intreval é igual a 100, mude imagem por imagem.
Gostaria de saber se há um jeito de ter um código que tem a mesma função que essa, mas qeu naum fique no procedure TForm1.Timer1Timer(Sender: TObject); e que fique num procedure do tipo procedure imagem(...); e que essa procedure imagem naum seja chamada dentro do timer, quero que seja totalmente independente da procedure Timer1Timer, se houver por favor me avisa... tô precisando muito dessa ajuda.
Obrigado pela atenção
Salvati
Curtidas 0
Respostas
Nildo
28/04/2004
Mas neste caso vai complicar muito sua programação. Há algum motivo especial para isso? Pode ser que eu encontre outra saida para seu problema
GOSTEI 0
Salvati
28/04/2004
tô com um código aqui, que preciso pegar essas imagens, e mostrar, mas pegar as imagens de CADA pasta, e cada pasta tem um arquivo de som, que vai tocar enquanto as imagens da mesma pasta é mostrada, e quando acabar as imagens ai vai pra outra pasta, ai mostra as imagens e toca o som com o anterior e quando acabar as imagens acaba o som e vai novamente par outra pasta e por ai vai....
Como se fizesse uma propaganda, como se fizesse um pequeno filme
tô com esse código do timer, consigo ver tds as imagens, mas naum consigo tocar as músicas, se quiser os códigos é só pedir.
Obrigado pela atenção
Como se fizesse uma propaganda, como se fizesse um pequeno filme
tô com esse código do timer, consigo ver tds as imagens, mas naum consigo tocar as músicas, se quiser os códigos é só pedir.
Obrigado pela atenção
GOSTEI 0
Nildo
28/04/2004
Ta, mas porque não pode ficar dentro do Timer?
GOSTEI 0
Salvati
28/04/2004
Aqui estão os códigos:
PROGRAMA 1)
Cara nos dois códigos tô quebrando a cabeça a um bom tempo... e achei que sem o timer ficaria mais fácil, se vc puder me ajudar vai ser ótimo pq travei nessa parte de tal forma que já naum sei mais pra onde correr
Obrigado pela atenção
PROGRAMA 1)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, MPlayer;
type
TForm1 = class(TForm)
Timer1: TTimer;
ListBox1: TListBox;
Image1: TImage;
Edit1: TEdit;
ListBox2: TListBox;
MediaPlayer1: TMediaPlayer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
contador:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Rec : TSearchRec;
i: integer;
caminho, tparq, tarq1:string;
begin
contador:=0;
tarq1:=´*.mp3´;
tparq:=´*.bmp´;
for i:=0 to 5 do
begin
caminho:=´C:\teste\projetos-0´+IntToStr(i)+´\´;
if SysUtils.FindFirst(caminho+tparq,faAnyFile, Rec) = 0 then
begin
repeat
ListBox1.Items.add(caminho+rec.Name);
until SysUtils.FindNext(Rec) <> 0;
if SysUtils.FindFirst(caminho+tarq1,faAnyFile, Rec) = 0 then
begin
repeat
ListBox2.Items.add(caminho+rec.Name);
until SysUtils.FindNext(Rec) <> 0;
end;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Picture.LoadFromFile(ListBox1.Items[contador]);
inc(contador);
if contador = ListBox1.Items.Count then
contador:=0;
end;
end.
PROGRAMA 2)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FileCtrl, StdCtrls, ExtCtrls, MPlayer;
type
TForm1 = class(TForm)
ListBox1: TListBox;
DirectoryListBox1: TDirectoryListBox;
ListBox2: TListBox;
ListBox3: TListBox;
Label1: TLabel;
Label2: TLabel;
Image1: TImage;
MediaPlayer1: TMediaPlayer;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
procedure pasta(aLista: TStrings);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
contImg: integer;
implementation
{$R *.dfm}
procedure TForm1.pasta(aLista: TStrings);
var
Rec : TSearchRec;
conta, i: integer;
begin
conta:=0;
for i:= 0 to (ListBox1.Count-1) do
begin
if SysUtils.FindFirst(´c:\teste\´+aLista[i]+´\*.bmp´,faAnyFile, Rec) = 0 then
begin
repeat
conta:=conta+1;
ListBox2.Items.add(´´+(inttostr(i))+´ - ´+(inttostr(conta))+´ - ´+rec.Name+´´);
ListBox3.Items.Add(inttostr(conta));
Label2.Caption:=inttostr(i);
until SysUtils.FindNext(Rec) <> 0;
end;
SysUtils.FindClose(Rec);
begin
Label1.Caption:=inttostr(ListBox2.Count);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
x, p, t:Integer;
begin
ListBox1.Clear;
DirectoryListBox1.Directory:=´c:\teste\´;
for x:=0 to DirectoryListBox1.Count - 1 do
begin
p:=Pos(DirectoryListBox1.Directory,DirectoryListBox1.GetItemPath(x));
t:=length(DirectoryListBox1.GetItemPath(x)) - length(DirectoryListBox1.Directory);
if (p > 0) and (t > 0) then
begin
ListBox1.Items.Add(copy(DirectoryListBox1.GetItemPath(x),length(DirectoryListBox1.Directory)+2,t));
end;
contImg:=1;
end;
begin
pasta(ListBox1.Items);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
a:integer;
begin
timer1.Interval:= 100;
//esse for acho que naum tá bem colocado, mas é uma tentativa
for a:=0 to (ListBox1.Items.Count-1) do
Image1.Picture.LoadFromFile(´C:\teste\´+listbox1.items[a]+´\Imagem´+FormatFloat(´000´,contImg)+´.bmp´);
Inc(contImg);
if contImg=4 then
contImg:=1;
end;
end.
Cara nos dois códigos tô quebrando a cabeça a um bom tempo... e achei que sem o timer ficaria mais fácil, se vc puder me ajudar vai ser ótimo pq travei nessa parte de tal forma que já naum sei mais pra onde correr
Obrigado pela atenção
GOSTEI 0
Nigro
28/04/2004
Tente usar 2 Timer´s um para as figuras e outro para os sons, com o mesmo interval, ai, acho que sincroniza.
GOSTEI 0
Salvati
28/04/2004
é interessante, mas a quantidade de imagens são variávels, podendo ser uam ou 999, entaum, naum sei se seria tão conveniente, mas naum tenho tanta experiência pra poder afirmar algo....
qq coisa me diga se estou certo ou naum, e a música depende do término das imagens... se as figuras naum acabam o som naum pode acabar...
se acabar as imagens acaba o som e muda de pasta...
qq coisa me diga se estou certo ou naum, e a música depende do término das imagens... se as figuras naum acabam o som naum pode acabar...
se acabar as imagens acaba o som e muda de pasta...
GOSTEI 0
Salvati
28/04/2004
agora fiqeui curioso, se usar dois timers, tenho 300 imagens, e cada imagem está sendo trocada a cada 100 milésinos de segundos, o meu som deveria ter 30 segundos naum é? entaum deveria ter um número fixo de imagens, é oq eu acho, e esses timersnaum poderiam ter um diferença, mesmo senod mínima, no tempo??
E acabei de pensar, depois de tato tempo pensando, vi que poderia pegar o tempo do som, ai pegar a quantiodade de imagem dividir o tempo de som por imagem, e ai a cada tantos segundos muda a imagem e toca o som e agora quando acaba O SOM acaba a demosntração e muda de pasta.... será que isso é difícil?? alguém tem como me ajudar a iniciar??
Valeu novamente pela atenção
E acabei de pensar, depois de tato tempo pensando, vi que poderia pegar o tempo do som, ai pegar a quantiodade de imagem dividir o tempo de som por imagem, e ai a cada tantos segundos muda a imagem e toca o som e agora quando acaba O SOM acaba a demosntração e muda de pasta.... será que isso é difícil?? alguém tem como me ajudar a iniciar??
Valeu novamente pela atenção
GOSTEI 0
Salvati
28/04/2004
mas nojeito anterior tbm vale pq é o q eu tô brigando a mais tempo..
agora se tbm tiver respostas pro outro jeito é legal tbm, pq tenho qeu arrumar saídas pra terminar, meu prazo tá esgotando....
valeu pessoal
agora se tbm tiver respostas pro outro jeito é legal tbm, pq tenho qeu arrumar saídas pra terminar, meu prazo tá esgotando....
valeu pessoal
GOSTEI 0
Salvati
28/04/2004
naum quero que fique dentro do timer pq quero fazer uma nova procedure (faria o papel, ou melhor teria o código do timer) qeu receberá valores de uma outra procedure.
Obrigado pela atenção
Obrigado pela atenção
GOSTEI 0
Nildo
28/04/2004
Então coloca o código nesta outra procedure e faz a chamada dela dentro do Timer
GOSTEI 0
Salvati
28/04/2004
mas essa minha procedure imagem (a que teria o código do timer) vai estar recebendo valores de uma outra procedure, pq eu naum sei como eu passaria valores de uma procedure qq para dentro da procedure do timer, já que preciso tanto dessa procedure quanto a propriedade do timer de mudar minhas imagens num determinado tempo......
GOSTEI 0
Salvati
28/04/2004
galera me ajuda ai
GOSTEI 0
Tatuweb
28/04/2004
Eu não to pegando muito bem o espirito da coisa mas pelo o que eu entendi vc quer reproduzir um som enquanto as imgens sao exibidas. O problema é fazer as duas coisas ao mesmo tempo. É isso? Se for eu tenho a solução.
GOSTEI 0
Salvati
28/04/2004
Cara é isso mesmo, esse é a sincronia baseada no número de imagens.
Ou até pode ser uma sincronia de imagem dependendo do tempo do som, tipo, que fico sabendo quato tempo demora pra tocar o som divido pelo numero de imagens, ai com o resultado dessa divisão será o tempo qeu a imagem será exibida....
Se conseguir qualquer um dos dois será ótimo, já que travei nos dois caminhos.
Qualquer coisa meu e-mail é itavlas@ubbi.com.br
Agradeço a atenção.
Ou até pode ser uma sincronia de imagem dependendo do tempo do som, tipo, que fico sabendo quato tempo demora pra tocar o som divido pelo numero de imagens, ai com o resultado dessa divisão será o tempo qeu a imagem será exibida....
Se conseguir qualquer um dos dois será ótimo, já que travei nos dois caminhos.
Qualquer coisa meu e-mail é itavlas@ubbi.com.br
Agradeço a atenção.
GOSTEI 0
Tatuweb
28/04/2004
Conforme já comentei no e-mail postei no fórum pq outras pessoas podem precisar da dica. Creio que a melhor forma de fazer isso é utilizando um thread. Eu não analisei o código que faz a animação das imagens porque entendi que o seu problema é fazer a sincronia entre som e imagens e não carregar as imagens ou carregar o som.
Partindo desse ponto, esqueça tudo o que diz respeito a parte do som no seu código pois esse será processado pelo thread. Após a cláusula uses insira o código abaixo.
Declare uma variável global conforme mostrado abaixo:
Em seguida, façamos a implementação das funções declaradas no Thread:
Tudo o que está dentro de execute será executado pelo thread. Já que queremos reproduzir um som usei a função API SndPlaySound. No segundo parametro eu coloquei SND_LOOP que vai tocar o som em loop. Se quiser tocar o som uma única vez use SND_ASYNC. Vc também pode usar uma outra função se quiser.
Agora no final do código informe as seguintes linhas.
As linhas acima têm que ser a última de todas e antes do ´end.´ (último end da unit), senão da erro. Explicando melhor as primeiras linhas do código acima:
[b:aba1262dd8]initialization SndProcess := TSndProcess.Create (TRUE);[/b:aba1262dd8]
indica que vamos criar o Thread e iniciá-lo ´pausado´, ou seja, ele só será executado quando nós o chamarmos (mas a frente eu explico). Se ao invés de TRUE fosse colocado FALSE o thread seria executado logo ao iniciar o programa. Com isso, o som ficaria tocando assim que o programa fosse iniciado.
Bem, queremos tocar o som enquando as imagens são mostradas. Então antes da primeira linha do seu código que faz as animações digite:
que significa reinicie o thread. Assim o som será tocado. Nota: Não é proibido mas tome cuidado se for usar a linha acima dentro de um timer. Se tiver problemas é só me dar um toque.
Ao terminar a exibição das imagens digite o código abaixo:
Fazendo os procedimentos acima vc conseguirá exibir as imagens e tocar o som simultaneamente. Se tiver problemas pode me dar um toque. :wink:
Valeu é isso.
Partindo desse ponto, esqueça tudo o que diz respeito a parte do som no seu código pois esse será processado pelo thread. Após a cláusula uses insira o código abaixo.
type TSndProcess = class (TThread) public constructor Create (CreateSuspended: Boolean); procedure Execute; override; end;
Declare uma variável global conforme mostrado abaixo:
var Form1: TForm1; SndProcess: TSndProcess; // Variavel declarada implementation
Em seguida, façamos a implementação das funções declaradas no Thread:
{$R *.DFM}
constructor TSndProcess.Create (CreateSuspended: Boolean);
begin
inherited Create (CreateSuspended);
end;
procedure TSndProcess.Execute;
begin
SndPlaySound (PChar (´C:\arquivo.wav´), SND_LOOP);
end;
Tudo o que está dentro de execute será executado pelo thread. Já que queremos reproduzir um som usei a função API SndPlaySound. No segundo parametro eu coloquei SND_LOOP que vai tocar o som em loop. Se quiser tocar o som uma única vez use SND_ASYNC. Vc também pode usar uma outra função se quiser.
Agora no final do código informe as seguintes linhas.
initialization SndProcess := TSndProcess.Create (TRUE); finalization SndProcess.Free; end. // Ultimo end da unit
As linhas acima têm que ser a última de todas e antes do ´end.´ (último end da unit), senão da erro. Explicando melhor as primeiras linhas do código acima:
[b:aba1262dd8]initialization SndProcess := TSndProcess.Create (TRUE);[/b:aba1262dd8]
indica que vamos criar o Thread e iniciá-lo ´pausado´, ou seja, ele só será executado quando nós o chamarmos (mas a frente eu explico). Se ao invés de TRUE fosse colocado FALSE o thread seria executado logo ao iniciar o programa. Com isso, o som ficaria tocando assim que o programa fosse iniciado.
Bem, queremos tocar o som enquando as imagens são mostradas. Então antes da primeira linha do seu código que faz as animações digite:
SndProcess.Resume;
que significa reinicie o thread. Assim o som será tocado. Nota: Não é proibido mas tome cuidado se for usar a linha acima dentro de um timer. Se tiver problemas é só me dar um toque.
Ao terminar a exibição das imagens digite o código abaixo:
// Interrompe o som mesmo que este não tenha chegado ao fim SndPlaySound (nil, Snd_ASync or Snd_Memory); // Suspende a exibição do thread SndProcess.Suspend;
Fazendo os procedimentos acima vc conseguirá exibir as imagens e tocar o som simultaneamente. Se tiver problemas pode me dar um toque. :wink:
Valeu é isso.
GOSTEI 0
Salvati
28/04/2004
Vou fazer alguns testes com o código.....
Muito obrigado
Muito obrigado
GOSTEI 0