Aide, Delphi6, Cmt faire tourner en boucle l'affichage et défile

810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014 - Modifié par 810mcu le 26/01/2014 à 19:38
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014 - 30 janv. 2014 à 23:52
Bonjour à tous, et merci d'avance,
Voilà j ai fait ce bout de code dont je mets disponible sur ce même message,
le soucis et de faire tourner en boucle l'affichage et défilement des images du répertoire sélectionner et à la fin de l'affichage de la dernière image relancer à nouveau. La je bloque qq peut m'aider de comment faire je n'est aucune idée.
Je l'est fait en Delphi6.


var
x: word;
Imagem: TImage;
i, y: integer;
espaco, TotImagens: integer;
begin
// Limpar as imagens do ScrollBox1
for y := ScrollBox1.ControlCount -1 downto 0 do
if Scrollbox1.Controls[y] is Timage then
begin
TImage(Scrollbox1.Controls[y]).Picture := nil;
Timage(Scrollbox1.Controls[y]).Free;
end;

Timer4.Enabled := True;

x := Random(FileListBox1.Count-1);
espaco:=10;
for i := 0 to FileListBox1.Items.Count-1 do
begin

Imagem := TImage.Create(Self);
Imagem.Parent := Form1.ScrollBox1;
//Imagem.Parent := Form1; //isto é outra opcao que se pode usar
Imagem.Width:=100;
Imagem.Height:=100;
Imagem.Stretch:=true;
Imagem.Top := 10;
Imagem.Left := espaco;
Imagem.Picture.LoadFromFile(FileListBox1.Items[i]);
espaco:=espaco+Imagem.Width+10;
end;

Merci.

810mcu

12 réponses

cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
30 janv. 2014 à 08:34
Salut,
petite remarque pour commencer, évite le langage SMS !!!
Alors ensuite un petit bout de code rapide en reprenant ton code pour ton exemple , il peut être améliorer bien entendu, j'ai mis 2 Bouton, 1 Timer et 1 CheckBox pour tester deux méthodes...
J'ai mis peu de commentaires par manque de temps mais le bout de code n'est pas trop compliqué à comprendre. ;-)
@+
const
Espace = 10;
...
procedure TForm1.Button1Click(Sender: TObject); //Bouton charger fichier
var
MyImage : TImage;
I : Integer;
MemSP : Integer;
begin
for I := ScrollBox1.ControlCount -1 downto 0 do
if ScrollBox1.Controls[I] is TImage then
TImage(ScrollBox1.Controls[I]).Free;
MemSP := Espace;
for I := 0 to FileListBox1.Items.Count-1 do
begin
MyImage := TImage.Create(ScrollBox1);
MyImage.Parent := ScrollBox1;
MyImage.Width := 100;
MyImage.Height := 100;
MyImage.Stretch := True;
MyImage.Top := Espace;
MyImage.Left := MemSP;
MyImage.Picture.LoadFromFile(FileListBox1.Items[I]);
MemSP := MemSP + MyImage.Width + Espace;
end;
ScrollBox1.Height := MyImage.Width + (Espace * 2) + 20;
end;

procedure TForm1.Button2Click(Sender: TObject); //Bouton Start / Stop
begin
Timer1.Enabled := not Timer1.Enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
Value : Integer;
I : Integer;
ReloadImage : TImage;
begin
if ScrollBox1.ControlCount < 2 then
Exit;
if not CheckBox1.Checked then //Choix méthode
begin
//Méthode 1
ScrollBox1.HorzScrollBar.Increment := ScrollBox1.Controls[ScrollBox1.Tag].Width +10;
Value := ScrollBox1.HorzScrollBar.ScrollPos;
SendMessage(ScrollBox1.Handle, WM_HSCROLL, SB_LINEDOWN, 0);
ScrollBox1.Tag := ScrollBox1.Tag +1;
if ScrollBox1.HorzScrollBar.ScrollPos = Value then
begin
SendMessage(ScrollBox1.Handle, WM_HSCROLL, SB_TOP, 0);
ScrollBox1.Tag := 0;
end;
end
else
begin
//Méthode 2
ReloadImage := TImage.Create(ScrollBox1);
ReloadImage.Parent := ScrollBox1;
ReloadImage.Width := 100;
ReloadImage.Height := 100;
ReloadImage.Stretch := True;
ReloadImage.Top := Espace;
ReloadImage.Picture := TImage(ScrollBox1.Controls[0]).Picture;
ScrollBox1.Components[0].Free;
ScrollBox1.Controls[0].Left := Espace;
for I := 1 to ScrollBox1.ControlCount -1 do
ScrollBox1.Controls[I].Left := ScrollBox1.Controls[I-1].Left + ScrollBox1.Controls[I-1].Width + Espace;
end;
end;
1
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
Modifié par denisbertin le 26/01/2014 à 22:51
Pour cela tu doit explorer le contenu de ton répertoire avec les fonctions

if FindFirst('c:\repertoire\*.bmp', faAnyFile, sr) = 0 then
begin
repeat
if sr.Name[1]<>'.' then
begin
strpcopy(nom_de_ce_fichier,sr.Name);
Self.List.AddString(nom_de_ce_fichier);
end;
until FindNext(sr) <> 0;
FindClose(sr);

Puis utiliser un timer qui va incrémenter un indice dans la liste et redessiner ta fenêtre : exemple

indice:=(indice + 1) mod Self.List.count;

avec la fonction modulo pour revenir au début de la liste.

avec bien sur la structure var sr: SysUtils.TSearchRec;

il te suffit alors de créer un élément ontimer avec un temps de mise à jour régulier 333 millisecondes par exemple qui va actualiser l'image à afficher que tu auras mis dans une liste à la création de ta fiche.
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
26 janv. 2014 à 23:58
Bonsoir denisbertin,

Le programme tourne est bien, j'arrive a charger toutes les images est tout et tout,
le seul truc qui ne marche pas c'est comment faire que après l'affichage et défilement de la dernière image relancer à nouveau,
un genre
repeat
comme tu l'as dit.

--
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
27 janv. 2014 à 01:05
Oui,

donc répéter l'affichage et défilement de ces images...

Merci.

--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
28 janv. 2014 à 10:10
Salut,
Le code que tu nous présentes (commentaires en portugais, "made by Mauricio ?" que je salue au passage ;-) ne fait qu'afficher des images récupérées dans une FileListBox dans des vignettes de 100x100 (donc certainement déformées).
Or si j'ai bien compris, tu veux afficher ces images les unes après les autres...
En reprenant l'utilisation de la FileListBox et d'un Timer, je te conseilles de faire ainsi :

1) A la création de la fiche (ou dans l'inspecteur d'objet) :

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer4.Enabled := False;
end;

2) Dans l'évènement OnTimer du Timer :

procedure TForm1.Timer4Timer(Sender: TObject);
begin
  with Timer4 do
  begin
    Image1.Picture.LoadFromFile(FileListBox1.Items[Tag]);
    Tag := Tag + 1;
    if Tag = FileListBox1.Items.Count then
      Tag := 0;
  end;
end;

3) Pour activer/désactiver le défilement des images :

procedure TForm1.btnStartStopClick(Sender: TObject);
begin
  Timer4.Enabled := not Timer4.Enabled;
end;


On se sert ici du Tag du Timer qui est incrémenté jusqu'à la valeur "Count" de la FileListBox, puis repart à 0...
Tu peux faire varier la vitesse du défilement avec la propriété "Interval" du Timer.

Avec Delphi, tout devient possible.
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
28 janv. 2014 à 14:44
Bonjour korgis,

et merci pour ton aide, effectivement j'ai récupérer du code de ce site, surement de Mauricio que je remercie et autres sites aussi.

Mon soucis et d'afficher les images sélectionner dans 1 ScrollBox
les unes à côtes des autres jusqu'à remplir la page (ScrollBox horizontalement) et puis faire défiler de droite à gauche pour avoir un genre de BANNER quoi.

Arriver a la dernière image revenir a la 1er, une boucle `infinie' du genre

Merci.
--
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
28 janv. 2014 à 17:38
Ok, je comprend.
Pourquoi pas les déplacer en diminuant les propriétés "left" des TImage dans l'évènement OnTimer d'un Timer, par exemple ?
Et quand l'image a disparu sur la gauche, tu la fais réapparaitre sur la droite pour donner l'impression d'un défilement ininterrompu.
Tu calcules en prenant en compte la largeur de la Scrollbox, la largeur des Images, l'espace entre elles, le nombre d'images.
Trop amusant à programmer :-)
Sinon, je ne vois pas de difficulté particulière.
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
28 janv. 2014 à 18:06
justement bien dit défilement ininterrompu
c'est ce que je recherche, a savoir que je peux avoir plusieurs images a faire défiler...
et là mon ic je n'est aucune idée de comment le faire

Le code que tu m'as donné marche en partie,Je m'explique
et j'ai bidouillé le suivant,

procedure TForm1.Timer6Timer(Sender: TObject);
var
x: word;
Imagem: TImage;
i, y: integer;
espaco{, TotImagens}: integer;
begin

// RAZ des images du ScrollBox1
for y := ScrollBox1.ControlCount -1 downto 0 do
if Scrollbox1.Controls[y] is Timage then
begin
TImage(Scrollbox1.Controls[y]).Picture := nil;
Timage(Scrollbox1.Controls[y]).Free;
end;

With Timer6 do
begin
espaco:=10;

for i := Tag to FileListBox1.Items.Count do
begin
Imagem := TImage.Create(Self);
Imagem.Parent := Form1.ScrollBox1;
Imagem.Width:=100;
Imagem.Height:=100;
Imagem.Stretch:=true;
Imagem.Top := 10;
Imagem.Left := espaco;
Imagem.Picture.LoadFromFile(FileListBox1.Items[Tag]);
espaco:=espaco+Imagem.Width+10;
Tag := Tag + 1;
if (Tag = FileListBox1.Items.Count) then
Tag := 0;
end;
end;
end;

Il commence a affichés les images jusqu'au bout du ScrollBox (visible)
Puis recommence, donc efface tout
et va recréer à nouveau les mêmes images (il arrive à créer toutes les images, non visible)
mais ne fait pas le scroll...

intéressant serait qu'il fasse le scroll jusqu'à la dernière image
et recommencer a la 1er image... mais là je rame franchement.



--
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
28 janv. 2014 à 18:26
en bidouillant ça, çà marche mais ça reste bidouillage quoi


procedure TForm1.Button6Click(Sender: TObject);
var
x: word;
Imagem: TImage;
i, y: integer;
espaco, TotImagens: integer;
begin
TotImagens := 0;
TotImagens := FileListBox1.Items.Count;
Button3.Caption := IntToStr(TotImagens);

// RAZ images contenues ds ScrollBox1
for y := ScrollBox1.ControlCount -1 downto 0 do
if Scrollbox1.Controls[y] is Timage then
begin
TImage(Scrollbox1.Controls[y]).Picture := nil;
Timage(Scrollbox1.Controls[y]).Free;
end;

Timer4.Enabled := True;

x := Random(FileListBox1.Count-1);
espaco:=10;
for i := 0 to FileListBox1.Items.Count-1 do
begin

Imagem := TImage.Create(Self);
Imagem.Parent := Form1.ScrollBox1;
Imagem.Width:=100;
Imagem.Height:=100;
Imagem.Stretch:=true;
Imagem.Top := 10;
Imagem.Left := espaco;
Imagem.Picture.LoadFromFile(FileListBox1.Items[i]);

espaco:=espaco+Imagem.Width+10;
end;

Timer3.Interval := TotImagens * 905;
Timer3.Enabled := True;
end;


le code Timer4

procedure TForm1.Timer4Timer(Sender: TObject);
begin
ScrollBox1.ScrollBy(-8, 0);
end;

le code du Timer3

procedure TForm1.Timer3Timer(Sender: TObject);
begin
Button6Click(Sender);
end;

ce ci marche, mais reste du bidouillage...

--
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
29 janv. 2014 à 12:22
Bonjour à tous,
pour ma part ScrollBy bofbof je remplacerai par SendMessage, et quand ScrollPos ne s'incrémente plus je fais un SB_TOP par exemple, ensuite on peut aussi regarder du coté de l'incrément du ScroolBar pour charger la dimension voulue.
après pourquoi ne pas faire une boucle du style
1,2,3,4,5 devient 2,3,4,5,1 ensuite 3,4,5,1,2 etc...en jouant sur le left du Control ou carrément supprimer et recréer ;-)
Bah il y a pas mal de possibilités :-P
@+
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
29 janv. 2014 à 17:58
Bonjour cs_yanb et a tous,

après pourquoi ne pas faire une boucle du style
1,2,3,4,5 devient 2,3,4,5,1 ensuite 3,4,5,1,2 etc...en jouant sur le left du Control ou carrément supprimer et recréer

C'est 1 bonne idée,
cs_yanb, vous pouvez
me faire svp un bout de code pour voir cmt c'est ou ce que cela donnerait, merci, pcq là je n'est pas d'idée
et je rame...

je n'est pas compris SB_TOP !!!

Merci.

--
0
810mcu Messages postés 86 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 30 janvier 2014
Modifié par 810mcu le 30/01/2014 à 23:55
cs_yanb,
je prends bonne note pour les remarques,
et te remercie, ton code marche nickel grand merci a toi,
et a tous ceux qui on bien voulut jeter un coup d'oeil.

Merci a vous tous.
--
0
Rejoignez-nous