Fórum Problema com o Timer #228451

28/04/2004

0

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


Salvati

Salvati

Responder

Posts

28/04/2004

Nildo

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


Responder

Gostei + 0

28/04/2004

Salvati

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


Responder

Gostei + 0

28/04/2004

Nildo

Ta, mas porque não pode ficar dentro do Timer?


Responder

Gostei + 0

28/04/2004

Salvati

Aqui estão os códigos:

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


Responder

Gostei + 0

28/04/2004

Nigro

Tente usar 2 Timer´s um para as figuras e outro para os sons, com o mesmo interval, ai, acho que sincroniza.


Responder

Gostei + 0

28/04/2004

Salvati

é 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...


Responder

Gostei + 0

28/04/2004

Salvati

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


Responder

Gostei + 0

28/04/2004

Salvati

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


Responder

Gostei + 0

29/04/2004

Salvati

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


Responder

Gostei + 0

29/04/2004

Nildo

Então coloca o código nesta outra procedure e faz a chamada dela dentro do Timer


Responder

Gostei + 0

29/04/2004

Salvati

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......


Responder

Gostei + 0

30/04/2004

Salvati

galera me ajuda ai


Responder

Gostei + 0

30/04/2004

Tatuweb

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.


Responder

Gostei + 0

02/05/2004

Salvati

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.


Responder

Gostei + 0

02/05/2004

Tatuweb

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.

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar