Problème pour quitter un tableau dynamique d'images - VB/VBA/VBS - Programmation
Marsh Posté le 18-12-2004 à 15:20:23
pour quitter un "For ... Next" utilise un "Exit For"
Code :
|
Marsh Posté le 18-12-2004 à 15:35:11
Ok merci, ca marche.
Je pensez que ca ne marcher pas car j'avais essayer avec un END FOR comme on fé pour un END SUB, mais ca planter comme ca.
C cool la c'est nickel !
Maintenant je cherche a faire autre chose, gerer le cas ou le nombre de photos dans le repertoire est plus important que le nombre que l'on choisi d'afficher. Dand ce cas la je souhaiterai utiliser 2 boutons que j'ai mis en bas de la feuille qui sont prédésent et suivant. De cette maniere je pourrai créer une 2ème (voir 3,4,5,....) pages qui afficherai la suite des photos.
Marsh Posté le 18-12-2004 à 20:44:56
dans ce cas tu peut utiliser une variable , disons X qui correspond au maximum du nombre de photos affichables dans ta page ( meme si je ne voit pas bien ce que tu entend par "page" ).
Le fait de cliquer sur le bouton suivant incremente du maxi la premire photo, puis la deuxieme etc.. à afficher.
Elle te permettrait d'afficher les photos suivant :
nom_photo = File1.List(f+X)
Marsh Posté le 18-12-2004 à 21:46:54
Ok mais ca ne marche pas aussi facilement que ca car si je recopie ce code dans la propriété click du bouton suivant en remplacant juste nom_photo = File1.List(f+X) par nom_photo = File1.List(f + nb_image), j'obtient une erreur quand je click sur le bouton suivant.
Cette erreur viens de la ligne Load Picture1(i), ce qui me parait évident car l'index i est remis a 1 a la création de ma boucle FOR.
C'est peut être parceque je m'y prend mal.
Marsh Posté le 18-12-2004 à 22:33:20
c'est normal qu'il soit remis a 1 puisque tes controles images ( Picture1(i) ) vont de 1 à .. 10 disons , si 10 est le nombre d'images affichables par pages au maximum.
Par contre ce que tu doit faire uniquement varier c'est la réference , c'est à dire l'index de ta liste d'image par f+X.
tu doit faire la différence entre nb_image ( nombre d'image presentes dans le repertoire ) et le nombre maxi d'images affichables ( X )
Marsh Posté le 18-12-2004 à 22:35:41
PS: si tu obitent une erreur en appuyant sur le bouton suivant c'est que le nombre d'image n'est pas superieur au nombre d'image affichables.
Pour ce faire tu doit mettre le bouton en Enabled=False si le nombre d'images presentes dans le repertoire < nombre d'image affichables
Marsh Posté le 18-12-2004 à 22:51:04
Je suis tout a fait d'accord avec toi, je comprend bien que c'est l'index de ma liste d'image que je dois faire varier. Ce que j'ai voulu dire c'est qu'il y a autre chose a changer car je ne peut pas me permettre de faire un "load picture1(i)" plusieurs fois de suite (par appui sur mon bouton suivant) avec i variant de par exemple 1 à 10.
Car si je fait ca, ca beugue et c'est normal, visual basic ne peut pas créer une picture Box avec un index i qui est déja existant.
Je cherche donc un moyen pour créer une boucle avec un nouvel increment, ou un truc pour contourner mon problème.
Marsh Posté le 18-12-2004 à 23:09:00
En fait il me suffirais de supprimer les picture box deja existante et de recreer les nouvelles juste après.
Un truc du style :
For i = 1 To (nb_image_lig) * (nb_image_col)
Kill Picture1(i)
Next i
Puis le code donner précédement avec biensur le "nom_photo = File1.List(f + nb_image)" au lieu de "nom_photo = File1.List(f)"
Marsh Posté le 18-12-2004 à 23:10:03
Ha j'ai oublier de préciser :
Biensur le Kill Picture1(i) ne marche pas je cherche comment faire un truc équivalent.
Marsh Posté le 18-12-2004 à 23:16:52
Ca y est c'est bon j'ai trouvé :
For i = 1 To (nb_image_lig) * (nb_image_col)
Unload Picture1(i)
Next i
Et il faut rajouter : inc_verti = 200
Afin de me resituer en haut de page, sinon sans ca je créer mes nouvelles images en dessus des précédentes et donc elles n'étaient pas affichées dans un emplacement visible.
Marsh Posté le 19-12-2004 à 00:09:08
Non en fait ca marche pas tip top, car j'ai également fé un bouton précédent mé quans je fé :
For i = 1 To (nb_image_lig) * (nb_image_col)
Unload Picture1(i)
Next i
Marsh Posté le 19-12-2004 à 00:10:03
et que la page n'est pas complète ca beugue aussi.
Evidement on ne peut pas décharger ce qui n'existe pas
Marsh Posté le 19-12-2004 à 18:06:39
tu ne devrait pas refaire un LoadPicture quand tu appuie sur le bouton suivant ou precedent, refait juste des :
Picture1(i).Picture = LoadPicture(App.Path & "\multimedia\images\" & patient & "\" & theme & "\" & nom_photo)
Marsh Posté le 21-12-2004 à 18:47:52
Pour info voici le code complet de ma page.
Code :
|
Marsh Posté le 21-12-2004 à 18:56:19
Maintenant j'ai créé une fonction qui me permet de retailler et centrer mais images dans les TextBox.
Pour cela j'utilise une TextBox "TailleReel" dans la quel je charge au dimension réelle mon image puis par des calculs je la retaille et la centre dans ma Picture1(i).
Le problème est que je n'arrive pas a mettre ce code sous forme de fonction dens module que j'apelle "Retaille" afin de l'utiliser dans le code créé et donné ci dessus.
Voici le code de cette fonction :
Code :
|
J'utilise ensuite dans ma feuille, laquelle j'ais rajouté une pictureBox "TailleReel", la ligne suivante:
Retaille hauteur,largeur
Mais voilà ca ne marche pas et je comprend pas pourquoi.
Quand je VB me renvoie sur cette ligne avec l'erreur suivante :
Erreur de compilation :
Variable ou procédure attendue, et non un module
Marsh Posté le 21-12-2004 à 19:22:16
je ne comprend pas pourquoi tu veut faire ca, mais si tu veut que le controle Picture garde toujours la meme dimension quelque soit la taille de l'image utilise plutot un controle "IMAGE", plutot que "PICTURE" , avec sa propriété strech en "TRUE".
Comme ca, quelque soit la taille de l'image , elle tiendra dans ton controle IMAGE et celui ci aura toujours la meme dimension ( l'image sera automatiquement agrandie ou retrecie )
Marsh Posté le 21-12-2004 à 20:05:09
c'est la meme chose que le controle PICTURE
Form1.Image1(i).Stretch=True
Form1.Image1(i).Picture=LoadPicture("C:\blabla\blabla.jpg" )
si ton controle IMAGE fait 100x100 pixels, que ton image blabla.jpg fasse 32x32 ou 1280x1024 , le controle fera toujours 100x100.
Bien sur les images seront etirés ou retrecies automatiquement pour faire la taille 100x100
Marsh Posté le 21-12-2004 à 20:17:24
Ok c'est ce que je pensé et également ce que je veus évité. c'est pour ca que j'ai écrit la fonction que je t'ai donné ci dessus, elle permet également de faire ce que tu me dit mais sans étirer l'image, il y a un coeff de multiplication qui permet de tailler et centrer dans la PictureBox.
En fait j'ai écrit ce code dans une feuille a part et il marche nickel mais le prob c'est que je n'arive pas a le mettre sous forme de fonction dans un module.
J'ai du mal a voir ce que ma fonction doit renvoyer et comment ca marche. J'ai pas trop l'habitude de faire ce genre de chose
Marsh Posté le 22-12-2004 à 00:33:24
en gros c'est comme ca :
Code :
|
Marsh Posté le 22-12-2004 à 12:45:40
Ok bein je fé un peu près ca.
J'arrive a runner mais le programme ne marche pas. Mon image se charge dans la TailleReel mais ne va pas dans ma Picture1.
Alors que ce programme en dehors d'une fonction d'un module (juste dans une feuille) fonctionne très bien.
Voici exactement mon code :
Dans le module:
Code :
|
Dans la feuille :
Code :
|
Marsh Posté le 22-12-2004 à 12:47:53
Excuse je viens de me relire et les commentaires de mes if son foireux, mais je pense que tu en a pas besoin.
Marsh Posté le 22-12-2004 à 17:18:15
le premier code marche chez moi, je pense que l'erreur provient de l'appel dans la feuille.
Essaye avec un chemin fixé du style
Code :
|
evite aussi les mélange du style "y" ( string ) pour le chemin d'accés qui est repris ensuite dans le module en y en tant que taille (numérique)
Marsh Posté le 25-12-2004 à 22:55:02
Ok merci je viens de faire ton exemple sans changer mon module puisque tu dit que ca marche chez toi, mais pour moi c'est tjs pas ok.
L'application ce lance bien sans erreur, mais ma PictureBox de taille fixe appellé "Picture1" n'affiche aucune image.
Seul la pictureBox "TailleReel" affiche l'image, ce qui m'avance pas beaucoup.
Marsh Posté le 25-12-2004 à 23:59:51
Je comprend vraiment pas :
Ca , ca marche :
Code :
|
Mais ca, ca ne marche pas:
Code :
|
La seul difference est donc que le 1er code s'execute dans un bouton et le 2ème au form load.
Précision : Pour ces 2 exemples je n'ai biensur pas utilisé de module, j'ai uniquement mis ces codes dans une form.
Alors quel est le pourquoi du comment?
Marsh Posté le 26-12-2004 à 01:32:23
Bon je confirme apparement mon problème vient bien de la, j'ai fait la même manip en utilisant cette fois mon module, et effectivement quand j'y fait appel depuis le formload de ma feuille ca ne marche pas mais a partir d'un click sur un bouton ou encore une ListBox ca marche.
Je ne comprend pas pourquoi et ca ne m'arrange pas du tout, car dans mon cas j'ai besoin de l'utiliser depuis un form load.
Voilà j'espere que vous aurez une idée.
Je vous rappel le code de mon module (dernière version)
Code :
|
Et appel depuis une feuille : Resize nom, album, Picture1(i)
Marsh Posté le 26-12-2004 à 11:36:59
En mettant la propriété AUTOREDRAW en TRUE de tes controle PICTURE ca regle le probléme pour le Form_load
Marsh Posté le 26-12-2004 à 13:08:05
C'est cool, merci beaucoup, effectivement ca venais bien de la. Tu me sauve de longue heure de recherche.
Bon maintenant que tout marche pour cet exemple je vais enfin pouvoir l'appliquer a mon projet d'album photos.
Marsh Posté le 26-12-2004 à 14:58:27
Voilà c'est fait je l'ais mis dans mon projet et ca marche.
Je suis content merci, c'était cool de m'avoir aidé.
Marsh Posté le 26-12-2004 à 18:41:15
Allez me revoilà a la charge, je me dis que sinon tu risque de t'ennuyer. lol
J'ai maintenant créé une autre feuilles qui elle m'affiche la totalité des photos d'un thèmes sur la même page (tableau de 6*6 miniatures).
Cette page va me servir pour supprimer des photos j'ai donc remplacer mes bouton precedent et suivant par "supprimer" et "supprimer tout".
Mon priblème est que pour pouvoir ce servir du bouton supprimer, il me faudrait deja pouvoir selectionner une "PictureBox" (pour l'instant elle ne sont pas selectionable), je cherche donc comment selectionner une PictureBox par simple click dessus (et la rendre par la même ocasion en surbrillance ou en encadré comme dans l'explorateur de windows koi).
Pour cela il me semble que c'est un truc du style ositionner le focus sur ma pictureBox
Marsh Posté le 27-12-2004 à 00:52:10
Tu ne peut pas faire un focus visible directement, faudra ruser en utilisant l'evenement Picture_click qui se met en route quand on clique sur le controle picture:
1 - Tu peut faire des rectangles ,disons rouge pour chaque picture box.
Ce rectangle sera legerement plus grand et dérriere chaques picture box.
Invisible au depart, en cliquant sur une picturebox le rectangle est mis en visible s'il ne l'etait pas est inversement.
2 - Tu peut jouer aussi sur l'apparence de la Picturebox ( avec ou sans bord, apparence "3D" ou "Flat" )
Marsh Posté le 27-12-2004 à 22:06:58
C'est bon j'ai ajouté a mon code ce qu'il faut pour que je puisse entourrer d'un cadre rouge (ou désentourer) mes pictures par simple click sur celle-ci.
J'ai choisi la solution de créer en même temps que mes PictureBox un cadre rouge invible derrière chacune, qui me permet donc de les rendre visible par la suite par simple click dessus :
Code :
|
Ca ca marche !
Je cherhce maintenant comment supprimer les photos que j'ai selectionnées(par click sur le bouton supprimer).
Je pense qu'il faut faire un truc du style, une boucle qui verifie qu'elle sont les pictureBox qui sont encandré ( contour(i).visible =true) et a chaque fois qu'il y en une récuperer le nom de la photo afin de la supprimer.
Je voudrai aussi que les photos ne soit pas réellement supprimer mais envoyé vers un dossier poubelle rajouté a la racine de l'application.
Je suis un peu perdu pour savoir comment m'y prendre.
Voila j'attend tes précieux conseils.
Marsh Posté le 28-12-2004 à 00:22:10
le plus pratique serait d'emmagasiner les chemins ( et noms de fichiers ) de tes photos ,juste avant ou apres avoir un LoadPicture, dans un tableau CHEMIN(100),ainsi que le nom du fichier patient PATIENT(100) par exemple.
Puis comme tu le dit, une boucle :
Code :
|
Marsh Posté le 28-12-2004 à 23:29:22
Bon alors dans mon programme juste apres la ligne:
Code :
|
j'ai rajouté :
Code :
|
Et dans mon bouton supprimer tout (j'ai commencer par celui, il me parrait plus simple car j'ai pas besoin de prendre en compte les picturebox sélectionné puisque je supprime tout) j'ai mis le code suivant :
Code :
|
Bon voila j'ai un problème ligne 4 quand je click sur le bouton supprimer tout, Vb me dit "chemin introuvable".
Mais j'ai vérifié les chemins source et destination sont correct.
Marsh Posté le 18-12-2004 à 13:24:01
Voila mon problème :
J'ai créé, dans le cadre d'un projet scolaire un album photo dynamique pour une entreprise s'occupant d'handicapés, celui ci permet de choisir dans une liste le nom de l'handicapé puis dans une autre le thème des photos qu'il veut visualiser. Ces noms d'handicapé correspondent a des répertoire puis ceux des thèmes a des sous répertoires, dans lesquels figurent les photos.
Je permet également par des option bouton de choisir le nombre de photos souhaité par lignes et par colonnes. On arrive ensuite a la page qui nous interesse celle qui visualise les photos.
Or mon problème est que je n'arrive pas a charger celle ci si le nombre de photos présente dans le répertoire et inférieur a celui qui est choisi avec les options boutons.
Ce que je voudrai faire c'est pouvoir ouvrir cette page même si le tableau n'est pas entierement rempli?
exemple: Si je choisi une page ou le tableau sera constitué de 2 lignes et 2 colonnes (choix des options bouton), je voudrai pouvoir afficher que 1,2 ou 3 photos et non 4(le maximum) sans que mon code face une.erreur :
Voici mon code commenté :
Je pense que comme je l'ai préparé il faudrai mettre quelque a la ligne 12, mais je ne sais pas quoi. Ou autre part !
Qu'en penssez vous ?
P.S.: Biensur si il y a assez de photo la page s'affiche correctement