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

Signaler
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014
-
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014
-
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

Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
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;
Messages postés
234
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
21 juillet 2021
1
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.
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

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.

--
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

Oui,

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

Merci.

--
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
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.
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

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.
--
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
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.
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

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.



--
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

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

--
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
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
@+
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

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.

--
Messages postés
86
Date d'inscription
samedi 28 août 2004
Statut
Membre
Dernière intervention
30 janvier 2014

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