Problème pour quitter un tableau dynamique d'images

Problème pour quitter un tableau dynamique d'images - VB/VBA/VBS - Programmation

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

Code :
  1. 'Chemin des images
  2.     File1.Path = App.Path & "\multimedia\images\" & patient & "\" & theme
  3.          
  4.     'Positionnement et chargement des images
  5.     For i = 1 To (nb_image_lig) * (nb_image_col)
  6.    
  7.         Load Picture1(i)
  8.         'On charge le nom de la photo
  9.         nom_photo = File1.List(f)
  10.         If nom_photo = "" Then
  11.             'Si il n'y a plus de photo on sort de la boucle
  12.             'Je ne sais pas quoi mettre ici afin de pouvoir quitter ma boucle FOR qui charge mes photos
  13.         Else
  14.             'On affiche cette photo dans la PictureBox
  15.             Picture1(i).Picture = LoadPicture(App.Path & "\multimedia\images\" & patient & "\" & theme & "\" & nom_photo)
  16.         End If
  17.         'On positionne la photo sur la feuille
  18.         Picture1(i).Top = inc_verti
  19.         Picture1(i).Width = largeur
  20.         Picture1(i).Height = hauteur
  21.         Picture1(i).Left = inc_hori
  22.         inc_hori = inc_hori + Picture1(i).Width + esp_hori
  23.         'On test si on a fini une ligne de photo
  24.         If (i Mod nb_image_col = 0) Then
  25.             inc_verti = inc_verti + ((Picture1(i).Height + esp_verti))
  26.             inc_hori = esp_hori
  27.         End If
  28.         'On incremente le pointeur d'images
  29.         f = f + 1
  30.        
  31.     Next i
  32.        
  33.         For i = 1 To (nb_image_lig) * (nb_image_col)
  34.             'On rend visible les images
  35.             Picture1(i).Visible = True
  36.         Next i
  37.         DoEvents
  38.        
  39.     DoEvents


 
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

Reply

Marsh Posté le 18-12-2004 à 13:24:01   

Reply

Marsh Posté le 18-12-2004 à 15:20:23    

pour quitter un "For ... Next" utilise un "Exit For"
 
 

Code :
  1. If nom_photo = "" Then
  2.            Exit For
  3. Else
  4. ....


Message édité par Profil supprimé le 18-12-2004 à 15:21:58
Reply

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.

Reply

Marsh Posté le 18-12-2004 à 17:56:05    

tu es sur VB ou VBA ( Excel ? )
 

Reply

Marsh Posté le 18-12-2004 à 19:13:53    

Je suis en VB pur, pas de VBA.

Reply

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)  
 

Reply

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.

Reply

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 )


Message édité par Profil supprimé le 18-12-2004 à 22:33:50
Reply

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

Reply

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.

Reply

Marsh Posté le 18-12-2004 à 22:51:04   

Reply

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)"

Reply

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.

Reply

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.

Reply

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  

Reply

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

Reply

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)  

Reply

Marsh Posté le 21-12-2004 à 18:45:33    

C'est bon ca marche maintenant, merci.

Reply

Marsh Posté le 21-12-2004 à 18:47:52    

Pour info voici le code complet de ma page.
 

Code :
  1. Option Explicit
  2.     Dim taille_hori_btn_bas, taille_verti_btn_bas, ecart_btn_bas As Double
  3.     Dim hauteur_reelle, largeur_reelle As Double
  4.     Dim largeur_client, hauteur_client As Double
  5.     Dim largeur, hauteur As Double
  6.     Dim inc_hori, inc_verti, inc_verti_depart, esp_hori, esp_verti As Integer
  7.     Dim nb_image, nb_image_col, nb_image_lig, nb_image_total As Integer
  8.     Dim i, f As Integer
  9.     Dim nom_photo As String
  10.    
  11.     Private Type RECT
  12.         Left As Long
  13.         Top As Long
  14.         Right As Long
  15.         Bottom As Long
  16.     End Type
  17.    
  18.     Dim MyRect As RECT
  19.     Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  20. Private Sub Form_Load()
  21.        
  22.     'Lecture dans fichier ini du nombre d'images par page du patient
  23.     fichier = patient & ".ini"
  24.     nb_image = GetPrivateProfileInt("nb_image", "nb", 1, chemin & "Fichiers_ini\" & fichier)
  25.            
  26.             Select Case nb_image
  27.             Case 1
  28.                 nb_image_col = 1
  29.                 nb_image_lig = 1
  30.             Case 2
  31.                 nb_image_col = 2
  32.                 nb_image_lig = 1
  33.             Case 4
  34.                 nb_image_col = 2
  35.                 nb_image_lig = 2
  36.             Case 6
  37.                 nb_image_col = 3
  38.                 nb_image_lig = 2
  39.             Case 9
  40.                 nb_image_col = 3
  41.                 nb_image_lig = 3
  42.             Case 12
  43.                 nb_image_col = 4
  44.                 nb_image_lig = 3
  45.             Case 16
  46.                 nb_image_col = 4
  47.                 nb_image_lig = 4
  48.             Case 20
  49.                 nb_image_col = 5
  50.                 nb_image_lig = 4
  51.             End Select
  52.        
  53.     'Espace entre photos
  54.     esp_verti = 200
  55.     esp_hori = 200
  56.     inc_hori = esp_hori
  57.     inc_verti = esp_verti
  58.    
  59.     Me.Width = Screen.Width
  60.     Me.Height = Screen.Height
  61.     'API qui calcule la zone taille exacte de la zone client
  62.     GetClientRect Me.hwnd, MyRect
  63.    
  64.     'Hauteur de la zone client sans la barre de titre
  65.     hauteur_reelle = MyRect.Bottom * Screen.TwipsPerPixelY
  66.     largeur_reelle = MyRect.Right * Screen.TwipsPerPixelX
  67.    
  68.     'Taille des boutons du bas
  69.     taille_hori_btn_bas = cmd_precedent.Width
  70.     taille_verti_btn_bas = cmd_precedent.Height
  71.     ecart_btn_bas = (largeur_reelle - (4 * taille_hori_btn_bas)) / 5
  72.    
  73.     'Calcul de l'espace non occupé par les images
  74.     largeur_client = largeur_reelle - (nb_image_col + 1) * esp_hori
  75.     hauteur_client = hauteur_reelle - (1.5 * taille_verti_btn_bas) - ((nb_image_lig + 1) * esp_verti) - nom_patient.Height
  76.    
  77.     'Calcul de la taille d'une image en fonction du nombre d'image par page
  78.     largeur = largeur_client / nb_image_col
  79.     hauteur = hauteur_client / nb_image_lig
  80.    
  81.     'Positionement du nom patient
  82.     nom_patient.Caption = patient & " : " & theme
  83.     nom_patient.Left = (largeur_reelle - nom_patient.Width) / 2
  84.    
  85.     'Positionnement des boutons du bas
  86.     cmd_theme.Left = largeur_reelle - 4 * (ecart_btn_bas + taille_hori_btn_bas)
  87.     cmd_precedent.Left = largeur_reelle - 3 * (ecart_btn_bas + taille_hori_btn_bas)
  88.     cmd_suivant.Left = largeur_reelle - 2 * (ecart_btn_bas + taille_hori_btn_bas)
  89.     cmd_quitter.Left = largeur_reelle - (ecart_btn_bas + taille_hori_btn_bas)
  90.    
  91.     cmd_theme.Top = hauteur_reelle - (1.5 * taille_verti_btn_bas)
  92.     cmd_precedent.Top = hauteur_reelle - (1.5 * taille_verti_btn_bas)
  93.     cmd_suivant.Top = hauteur_reelle - (1.5 * taille_verti_btn_bas)
  94.     cmd_quitter.Top = hauteur_reelle - (1.5 * taille_verti_btn_bas)
  95.            
  96.     'Chemin des images
  97.     File1.Path = App.Path & "\multimedia\images\" & patient & "\" & theme
  98.    
  99.     'On calcul si il reste des photos a afficher et si oui on affiche le bouton suivant
  100.     nb_image_total = File1.ListCount
  101.     If (nb_image_total > nb_image) Then cmd_suivant.Visible = True
  102.          
  103.     'Positionnement et chargement des images
  104.     For i = 1 To (nb_image_lig) * (nb_image_col)
  105.            
  106.         'On charge le nom de la photo
  107.         nom_photo = File1.List(f)
  108.        
  109.         If nom_photo = "" And i = 1 Then
  110.             'Si il n'y a pas de photo on affiche un message
  111.             txt_no_photo.Visible = True
  112.             txt_no_photo.Left = (largeur_reelle - txt_no_photo.Width) / 2
  113.             txt_no_photo.Top = nom_patient.Height * 3
  114.             Exit For
  115.         ElseIf nom_photo = "" Then
  116.             'Si il n'y a plus de photo on sort de la boucle
  117.             Exit For
  118.         Else
  119.             'On affiche cette photo dans la PictureBox
  120.             Load Picture1(i)
  121.             Picture1(i).Picture = LoadPicture(App.Path & "\multimedia\images\" & patient & "\" & theme & "\" & nom_photo)
  122.             Picture1(i).Visible = True
  123.             'On positionne la photo sur la feuille
  124.             Picture1(i).Top = inc_verti + nom_patient.Height
  125.             Picture1(i).Width = largeur
  126.             Picture1(i).Height = hauteur
  127.             Picture1(i).Left = inc_hori
  128.             inc_hori = inc_hori + Picture1(i).Width + esp_hori
  129.             'On test si on a fini une ligne de photo
  130.             If (i Mod nb_image_col = 0) Then
  131.                 inc_verti = inc_verti + Picture1(i).Height + esp_verti
  132.                 inc_hori = esp_hori
  133.             End If
  134.             'On incremente le pointeur d'images
  135.             f = f + 1
  136.         End If
  137.      
  138.     Next i
  139.        
  140.     DoEvents
  141.            
  142. End Sub
  143. Private Sub cmd_suivant_Click()
  144.    
  145.     inc_verti = esp_verti
  146.     inc_hori = esp_hori
  147.     cmd_precedent.Visible = True
  148.        
  149.     'On efface les images déjà présentent sur la page
  150.     For i = 1 To (nb_image_lig) * (nb_image_col)
  151.         Unload Picture1(i)
  152.     Next i
  153.    
  154.     DoEvents
  155.    
  156.     'Positionnement et chargement des images
  157.     For i = 1 To (nb_image_lig) * (nb_image_col)
  158.            
  159.         'On charge le nom de la photo
  160.         nom_photo = File1.List(f)
  161.        
  162.         If nom_photo = "" Then
  163.             'Si il n'y a plus de photo on sort de la boucle
  164.             Exit For
  165.         Else
  166.             'On affiche cette photo dans la PictureBox
  167.             Load Picture1(i)
  168.             Picture1(i).Picture = LoadPicture(App.Path & "\multimedia\images\" & patient & "\" & theme & "\" & nom_photo)
  169.             Picture1(i).Visible = True
  170.             'On positionne la photo sur la feuille
  171.             Picture1(i).Top = inc_verti + nom_patient.Height
  172.             Picture1(i).Width = largeur
  173.             Picture1(i).Height = hauteur
  174.             Picture1(i).Left = inc_hori
  175.             inc_hori = inc_hori + Picture1(i).Width + esp_hori
  176.             'On test si on a fini une ligne de photo
  177.             If (i Mod nb_image_col = 0) Then
  178.                 inc_verti = inc_verti + Picture1(i).Height + esp_verti
  179.                 inc_hori = esp_hori
  180.             End If
  181.             'On incremente le pointeur d'images
  182.             f = f + 1
  183.         End If
  184.      
  185.     Next i
  186.        
  187.     DoEvents
  188.    
  189.     'On calcul si il reste encore des photos a afficher et si oui on affiche le bouton suivant
  190.     If nb_image_total = f Then
  191.         cmd_suivant.Visible = False
  192.     Else
  193.         cmd_suivant.Visible = True
  194.     End If
  195.    
  196. End Sub
  197. Private Sub cmd_precedent_Click()
  198.    
  199.     inc_verti = esp_verti
  200.     inc_hori = esp_hori
  201.     cmd_suivant.Visible = True
  202.    
  203.     'On efface les images déjà présentent sur la page et on repositionne en arrière le pointeur de fichier
  204.     If (f Mod nb_image) = 0 Then
  205.         For i = 1 To (nb_image_lig) * (nb_image_col)
  206.             Unload Picture1(i)
  207.         Next i
  208.         f = f - (nb_image * 2)
  209.     ElseIf (f Mod nb_image) <> 0 Then
  210.         For i = 1 To (f Mod nb_image)
  211.             Unload Picture1(i)
  212.         Next i
  213.         f = f - (f Mod nb_image) - nb_image
  214.     End If
  215.    
  216.     DoEvents
  217.      
  218.     'Positionnement et chargement des images
  219.     For i = 1 To (nb_image_lig) * (nb_image_col)
  220.            
  221.         'On charge le nom de la photo
  222.         nom_photo = File1.List(f)
  223.        'On affiche cette photo dans la PictureBox
  224.         Load Picture1(i)
  225.         Picture1(i).Picture = LoadPicture(App.Path & "\multimedia\images\" & patient & "\" & theme & "\" & nom_photo)
  226.         Picture1(i).Visible = True
  227.         'On positionne la photo sur la feuille
  228.         Picture1(i).Top = inc_verti + nom_patient.Height
  229.         Picture1(i).Width = largeur
  230.         Picture1(i).Height = hauteur
  231.         Picture1(i).Left = inc_hori
  232.         inc_hori = inc_hori + Picture1(i).Width + esp_hori
  233.         'On test si on a fini une ligne de photo
  234.         If (i Mod nb_image_col = 0) Then
  235.             inc_verti = inc_verti + Picture1(i).Height + esp_verti
  236.             inc_hori = esp_hori
  237.         End If
  238.         'On incremente le pointeur d'images
  239.         f = f + 1
  240.              
  241.     Next i
  242.        
  243.     DoEvents
  244.    
  245.     'On calcul si on est retourné en premiere page et si oui on n'affiche plus le bouton précédent
  246.     If f = nb_image Then
  247.         cmd_precedent.Visible = False
  248.     Else
  249.         cmd_precedent.Visible = True
  250.     End If
  251.    
  252. End Sub

Reply

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 :
  1. Option Explicit
  2.     Dim NewLargeur As Single
  3.     Dim NewHauteur As Single
  4.     Dim Coeff, coeff_x, coeff_y As Single
  5.     Dim x As Single
  6.     Dim y As Single
  7.    
  8. Public Sub Resize(hauteur, largeur As Single)
  9.    
  10.     TailleReel.AutoSize = True
  11.        
  12.     'Si la taille réelle est plus petite que la picturebox
  13.     If TailleReel.Width < largeur And TailleReel.Height < hauteur Then
  14.         Coeff = 1
  15.         x = (largeur - TailleReel.Width) / 2
  16.         y = (hauteur - TailleReel.Height) / 2
  17.         NewLargeur = TailleReel.Width / Coeff
  18.         NewHauteur = TailleReel.Height / Coeff
  19.         Picture1.PaintPicture TailleReel.Picture, x, y, NewLargeur, NewHauteur
  20.    
  21.      'Sinon quand la taille réelle n'est plus petite que la picturebox dans les 2 axes
  22.      Else:
  23.        
  24.         coeff_x = largeur / TailleReel.Width
  25.         coeff_y = hauteur / TailleReel.Height
  26.        
  27.         If coeff_x > coeff_y Then
  28.             Coeff = coeff_y
  29.         Else:
  30.             Coeff = coeff_x
  31.         End If
  32.        
  33.         NewLargeur = TailleReel.Width * Coeff
  34.         NewHauteur = TailleReel.Height * Coeff
  35.        
  36.         x = (largeur - NewLargeur) / 2
  37.         y = (hauteur - NewHauteur) / 2
  38.        
  39.         Picture1.PaintPicture TailleReel.Picture, x, y, NewLargeur, NewHauteur
  40.    
  41.     End If
  42. End Sub


 
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

Reply

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 )

Reply

Marsh Posté le 21-12-2004 à 19:36:53    

Tu peus me filer un exemple STP.

Reply

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

Reply

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

Reply

Marsh Posté le 22-12-2004 à 00:33:24    

en gros c'est comme ca :
 
 

Code :
  1. Sub test()
  2. Ancienne_Taille = 2
  3. Nouvelle_Taille = retaille(Ancienne_Taille)
  4. MsgBox Nouvelle_Taille
  5. End Sub
  6. Function retaille(X)
  7. retaille = X * 1000
  8. End Function

Reply

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 :
  1. Option Explicit
  2.     Dim largeur, hauteur As Single
  3.     Dim NewLargeur As Single
  4.     Dim NewHauteur As Single
  5.     Dim Coeff, coeff_x, coeff_y As Single
  6.     Dim x As Single
  7.     Dim y As Single
  8.    
  9. Public Sub Resize(nom As String, feuille As Form, Picture1 As PictureBox)
  10.    
  11.     largeur = feuille.Picture1.Width
  12.     hauteur = feuille.Picture1.Height
  13.     feuille.TailleReel.Picture = LoadPicture(nom)
  14.        
  15.     'Si la taille réelle est plus petite que la picturebox
  16.     If feuille.TailleReel.Width < largeur And feuille.TailleReel.Height < hauteur Then
  17.        
  18.         Coeff = 1
  19.         x = (largeur - feuille.TailleReel.Width) / 2
  20.         y = (hauteur - feuille.TailleReel.Height) / 2
  21.         NewLargeur = feuille.TailleReel.Width
  22.         NewHauteur = feuille.TailleReel.Height
  23.         feuille.Picture1.PaintPicture feuille.TailleReel.Picture, x, y, NewLargeur, NewHauteur
  24.    
  25.     'Si la taille réelle est plus petite que la picturebox
  26.     ElseIf feuille.TailleReel.Width = largeur And feuille.TailleReel.Height = hauteur Then
  27.        
  28.         feuille.Picture1.Picture = feuille.TailleReel.Picture
  29.    
  30.      'Sinon quand la taille réelle n'est plus petite que la picturebox dans les 2 axes
  31.      Else:
  32.        
  33.         coeff_x = largeur / feuille.TailleReel.Width
  34.         coeff_y = hauteur / feuille.TailleReel.Height
  35.        
  36.         If coeff_x > coeff_y Then
  37.             Coeff = coeff_y
  38.         Else:
  39.             Coeff = coeff_x
  40.         End If
  41.        
  42.         NewLargeur = feuille.TailleReel.Width * Coeff
  43.         NewHauteur = feuille.TailleReel.Height * Coeff
  44.        
  45.         x = (largeur - NewLargeur) / 2
  46.         y = (hauteur - NewHauteur) / 2
  47.         feuille.Picture1.PaintPicture feuille.TailleReel.Picture, x, y, NewLargeur, NewHauteur
  48.    
  49.     End If
  50. End Sub


Dans la feuille :

Code :
  1. Dim y As String
  2. Private Sub Form_Load()
  3.    
  4.     y = App.Path & "\" & "x.jpg"
  5.     Resize y, form1, Picture1
  6.        
  7. End Sub


Reply

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.

Reply

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 :
  1. Private Sub Command1_Click()
  2. Dim f As String
  3. f = "c:\911.bmp"
  4. Resize f, Form1, Picture1
  5. End Sub


 
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)


Message édité par Profil supprimé le 22-12-2004 à 17:21:03
Reply

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.

Reply

Marsh Posté le 25-12-2004 à 23:59:51    

Je comprend vraiment pas :
Ca , ca marche :

Code :
  1. Private Sub Command1_Click()
  2.     Dim largeur, hauteur As Single
  3.     Dim NewLargeur As Single
  4.     Dim NewHauteur As Single
  5.     Dim Coeff, coeff_x, coeff_y As Single
  6.     Dim x As Single
  7.     Dim y As Single
  8.     Dim f As String
  9.    
  10.     f = "c:\x.jpg"
  11.     TailleReel.Picture = LoadPicture(f)
  12.     largeur = Picture1.Width
  13.     hauteur = Picture1.Height
  14.        
  15.     'Si la taille réelle est plus petite que la picturebox sur les 2 axes :
  16.     If TailleReel.Width < largeur And TailleReel.Height < hauteur Then
  17.        
  18.         x = (largeur - TailleReel.Width) / 2
  19.         y = (hauteur - TailleReel.Height) / 2
  20.         NewLargeur = TailleReel.Width
  21.         NewHauteur = TailleReel.Height
  22.         Picture1.PaintPicture TailleReel.Picture, x, y, NewLargeur, NewHauteur
  23.        
  24.     'Sinon pour les autres cas :
  25.     Else:
  26.         coeff_x = largeur / TailleReel.Width
  27.         coeff_y = hauteur / TailleReel.Height
  28.        
  29.         If coeff_x > coeff_y Then
  30.             Coeff = coeff_y
  31.         Else:
  32.             Coeff = coeff_x
  33.         End If
  34.        
  35.         NewLargeur = TailleReel.Width * Coeff
  36.         NewHauteur = TailleReel.Height * Coeff
  37.         x = (largeur - NewLargeur) / 2
  38.         y = (hauteur - NewHauteur) / 2
  39.         Picture1.PaintPicture TailleReel.Picture, x, y, NewLargeur, NewHauteur
  40.    
  41.     End If   
  42. End Sub


Mais ca, ca ne marche pas:

Code :
  1. Private Sub Form_Load()
  2.     Dim largeur, hauteur As Single
  3.     Dim NewLargeur As Single
  4.     Dim NewHauteur As Single
  5.     Dim Coeff, coeff_x, coeff_y As Single
  6.     Dim x As Single
  7.     Dim y As Single
  8.     Dim f As String
  9.    
  10.     f = "c:\x.jpg"
  11.     TailleReel.Picture = LoadPicture(f)
  12.     largeur = Picture1.Width
  13.     hauteur = Picture1.Height
  14.        
  15.     'Si la taille réelle est plus petite que la picturebox sur les 2 axes :
  16.     If TailleReel.Width < largeur And TailleReel.Height < hauteur Then
  17.         x = (largeur - TailleReel.Width) / 2
  18.         y = (hauteur - TailleReel.Height) / 2
  19.         NewLargeur = TailleReel.Width
  20.         NewHauteur = TailleReel.Height
  21.         Picture1.PaintPicture TailleReel.Picture, x, y, NewLargeur, NewHauteur
  22.        
  23.     'Sinon pour les autres cas :
  24.     Else:
  25.         coeff_x = largeur / TailleReel.Width
  26.         coeff_y = hauteur / TailleReel.Height
  27.        
  28.         If coeff_x > coeff_y Then
  29.             Coeff = coeff_y
  30.         Else:
  31.             Coeff = coeff_x
  32.         End If
  33.        
  34.         NewLargeur = TailleReel.Width * Coeff
  35.         NewHauteur = TailleReel.Height * Coeff
  36.         x = (largeur - NewLargeur) / 2
  37.         y = (hauteur - NewHauteur) / 2
  38.         Picture1.PaintPicture TailleReel.Picture, x, y, NewLargeur, NewHauteur
  39.    
  40.     End If
  41. End Sub


 
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?

Reply

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 :
  1. Option Explicit
  2.     Dim largeur, hauteur As Single
  3.     Dim NewLargeur As Single
  4.     Dim NewHauteur As Single
  5.     Dim Coeff, coeff_x, coeff_y As Single
  6.     Dim x As Single
  7.     Dim y As Single
  8.    
  9. Public Sub Resize(nom As String, Form As Form, pict As PictureBox)
  10.        
  11.     largeur = pict.Width
  12.     hauteur = pict.Height
  13.     Form.TailleReel.Picture = LoadPicture(nom)
  14.     Form.TailleReel.Visible = False
  15.    
  16.     'Si la taille réelle est plus petite que la picturebox sur les 2 axes :
  17.     If Form.TailleReel.Width < largeur And Form.TailleReel.Height < hauteur Then
  18.        
  19.         x = (largeur - Form.TailleReel.Width) / 2
  20.         y = (hauteur - Form.TailleReel.Height) / 2
  21.         NewLargeur = Form.TailleReel.Width
  22.         NewHauteur = Form.TailleReel.Height
  23.         pict.PaintPicture Form.TailleReel.Picture, x, y, NewLargeur, NewHauteur
  24.        
  25.     'Sinon pour les autres cas :
  26.     Else:
  27.        
  28.         coeff_x = largeur / Form.TailleReel.Width
  29.         coeff_y = hauteur / Form.TailleReel.Height
  30.        
  31.         If coeff_x > coeff_y Then
  32.             Coeff = coeff_y
  33.         Else:
  34.             Coeff = coeff_x
  35.         End If
  36.        
  37.         NewLargeur = Form.TailleReel.Width * Coeff
  38.         NewHauteur = Form.TailleReel.Height * Coeff
  39.        
  40.         x = (largeur - NewLargeur) / 2
  41.         y = (hauteur - NewHauteur) / 2
  42.         pict.PaintPicture Form.TailleReel.Picture, x, y, NewLargeur, NewHauteur
  43.    
  44.     End If
  45. End Sub


 
Et appel depuis une feuille : Resize nom, album, Picture1(i)

Reply

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 ;)


Message édité par Profil supprimé le 26-12-2004 à 11:37:27
Reply

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.

Reply

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

Reply

Marsh Posté le 26-12-2004 à 16:59:46    

:jap:

Reply

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 :positionner le focus sur ma pictureBox

Reply

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" )


Message édité par Profil supprimé le 27-12-2004 à 00:53:31
Reply

Marsh Posté le 27-12-2004 à 10:52:30    

Ok merci je vais essayer ca !

Reply

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 :
  1. Private Sub Picture1_Click(Index As Integer)
  2. Dim x As Integer
  3.     x = Index
  4.     If contour(x).Visible = True Then 
  5.         'contour étant mon cadre rouge (rectangle)
  6.         contour(x).Visible = False
  7.     Else:
  8.         contour(x).Visible = True
  9. End Sub


 
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.

Reply

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 :
  1. REPCORBEILLE="C:\SAUVEGARDE\"
  2. For t=0 to NombredeControlePicture
  3. If Shape1(t).visible=True then
  4. FileCopy CHEMIN(t),REPCORBEILLE & PATIENT(t)
  5. Kill CHEMIN(t)
  6. Next t


Message édité par Profil supprimé le 28-12-2004 à 00:23:08
Reply

Marsh Posté le 28-12-2004 à 23:29:22    

Bon alors dans mon programme juste apres la ligne:

Code :
  1. nom_photo = File1.List(f)


j'ai rajouté :

Code :
  1. nom_img(i) = nom_photo    'avec dim nom_img(100) as string


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 :
  1. poubelle = App.Path & "\mulitimedia\poubelle\" & patient & "\"
  2. For t = 1 To i
  3.    chemin_img = App.Path & "\multimedia\images\" & patient & "\" & theme & "\" & nom_img(t)
  4.    FileCopy chemin_img, poubelle & nom_img(t)
  5.    Kill chemin_img
  6. Next t


 
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.


Message édité par olivier857 le 28-12-2004 à 23:40:43
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed