Fórum Problema com o Timer #228451
28/04/2004
0
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
Curtir tópico
+ 0Posts
28/04/2004
Nildo
Gostei + 0
28/04/2004
Salvati
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
28/04/2004
Nildo
Gostei + 0
28/04/2004
Salvati
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
28/04/2004
Nigro
Gostei + 0
28/04/2004
Salvati
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
28/04/2004
Salvati
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
28/04/2004
Salvati
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
29/04/2004
Salvati
Obrigado pela atenção
Gostei + 0
29/04/2004
Nildo
Gostei + 0
29/04/2004
Salvati
Gostei + 0
30/04/2004
Salvati
Gostei + 0
30/04/2004
Tatuweb
Gostei + 0
02/05/2004
Salvati
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
02/05/2004
Tatuweb
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
Clique aqui para fazer login e interagir na Comunidade :)