Plusieurs actions pour un meme bouton

la-foudre870 Messages postés 18 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 25 décembre 2015 - Modifié par Whismeril le 15/05/2015 à 21:17
jerlo11 Messages postés 109 Date d'inscription mardi 19 mai 2015 Statut Membre Dernière intervention 17 novembre 2022 - 19 mai 2015 à 15:08
Bonjour,
j'essai depuis plusieurs jour de trouver une solution à mon problème.
je vous explique

J'ai une forme avec 3 boutons faisant appel à des fichiers excel sur un serveur,
je les copies et les ouvrent en fonction du bouton.
Jusque la pas de problème en revanche ces fichiers étant long à charger et à ouvrir j'aimerai ajouter une barre de chargement qui doit s'activer dès que le click à été fait sur un bouton et la je sèche le timer, ne ce lance pas
Voici un bout de mon code, pourriez vous m'aider
Merci D'avance
*

Imports System.IO.File

Public Class Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ProgressBar1.Increment(1)
        If ProgressBar1.Value = ProgressBar1.Maximum Then

        End If
    End Sub


    'BOUTON BLANC
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Start()
        System.IO.File.Delete("C:\Temp\BLANC.xlsx")
        My.Computer.FileSystem.CopyFile("\\vol1\PRIVATE\BLANC 2015.xlsx", "C:\Temp\BLANC 2015.xlsx")
        Dim Xl 'as Excel.Application\par
        Dim wk 'as Excel.workbook\par
        Xl = CreateObject("Excel.application")
        Xl.Visible = True
        Xl.enableevents = False
        wk = Xl.workbooks.open("C:\Temp\BLANC 2015.xlsx")
        Me.Close()


EDIT: Ajout de la coloration syntaxique.

11 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
15 mai 2015 à 21:57
Bonsoir, quel est l'intervalle du timer?
Est il enabled?
En mode pas à pas est ce que tu passes dans la méthode liée?
0
la-foudre870 Messages postés 18 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 25 décembre 2015
15 mai 2015 à 22:54
Bonsoir, merci pour ta réponse effectivement il n'était pas enabled mais maintenant la progress bar démarre sans action sur mon bouton, 'interval de 300 est correct
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
Modifié par Whismeril le 15/05/2015 à 23:09
Je viens de relire l'aide en ligne.
Start() met enabled à true.

Donc le problème ne venait pas de là.
Essaye en mettant enabled = true à la place de start(), et exécute en pas à pas.

Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 16/05/2015 à 07:15
Bonjour,
C'est dans la procédure click, qu'il faut mettre la propriété enabled du timer à True (pas avant)
On ne sait pas quelle valeur a été donnée à la propriété Maximum de la propgressbar
Le timer continue-t-il à "vivre" sous VB.Net en dépit du Me.close (à la fin du clic sur le bouton) ?

PS : je ne cesserai jamais d'être étonné de ces constatations de progression qui ne constatent finalement pas la progression d'une tâche, mais celle d'une durée écoulée !

Edit :
1) et pourquoi "tuer" le fichier de destination avant de le recréer par la copie ?
Ceci ne marche pas ? :
My.Computer.FileSystem.CopyFile("\\vol1\PRIVATE\BLANC 2015.xlsx", "C:\Temp\BLANC 2015.xlsx", overwrite:= True)

2) et pourquoi une (fausse, en plus) progressbar et non l'utilisation de ce que je vois ici ===>
https://msdn.microsoft.com/fr-fr/library/microsoft.visualbasic.fileio.uioption%28v=vs.110%29.aspx

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
la-foudre870 Messages postés 18 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 25 décembre 2015
16 mai 2015 à 09:53
Bonjour, merci pour ton aide,
J'ai besoin de tuer le fichier avant de commencer car celui-ci étant présent avant dans le répertoire temp (suite à une copie antérieure) la copie ne fonctionne pas, effectivement je n'ai pas essaie ta méthode
par contre je veux bien un exemple sur ton point 2 car l'aide microsoft n'ai pas illustrée
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
16 mai 2015 à 08:41
Bonjour a tous,

Pour faire patienter l'utilisateur pour une tache dont on ne connaît pas la durée.

voici un exemple:

Public Class Form1
    'http://plasserre.developpez.com/cours/vb-net/?page=ui-winforms5#LVIII-R-2
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Button1.Text = "Start"
        Button2.Text = "Stop"
        ProgressBar1.Style = ProgressBarStyle.Blocks   'indique d'avancer par block
        ProgressBar1.Style = ProgressBarStyle.Continuous 'indique d'avancer progressivement
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        ProgressBar1.Style = ProgressBarStyle.Marquee
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        ProgressBar1.Style = ProgressBarStyle.Continuous
    End Sub
End Class

0
la-foudre870 Messages postés 18 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 25 décembre 2015
16 mai 2015 à 09:54
Merci pour ton aide je vais voir si cela fonctionne
0

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

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
16 mai 2015 à 08:49
Mais je ne pense pas que les 2 actions (copie et progressbar) puissent fonctionner ensemble!

il te faudra utiliser un thread:

http://plasserre.developpez.com/cours/vb-net/?page=windows-forms5#LX-R-1
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 16/05/2015 à 12:20
par contre je veux bien un exemple sur ton point 2 car l'aide microsoft n'ai pas illustrée

Je ne suis pas vbnettiste (je n'ai même pas vb.net) et ne sais pas ce que tu veux dire par "n'ai pas illustré".
Je me contente de suggérer ce que je déduis de la lecture de MSDN (sur le Net)
Essaye donc ceci :
My.Computer.FileSystem.CopyFile("\\vol1\PRIVATE\BLANC 2015.xlsx", "C:\Temp\BLANC 2015.xlsx", FileIO.UIOption.AllDialogs) 

Il doit toutefois être clair que si le fichier à copier est petit, il sera copié avant même que la progression de la copie n'ait le temps d'apparaître.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
16 mai 2015 à 12:51
ucfoutu,

FileIO.UIOption.AllDialogs


Veut simplement dire qu'une boite de dialogue s'affiche pour t'indiquer que le fichier est déjà présent, si tu veux l'écraser!

Mais comme tu le dis si justement, si la copie est rapide, la progressBar n'aura même pas le temps de s'afficher.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
Modifié par Whismeril le 16/05/2015 à 14:06
Bonjour les deux remarques d'Uc et Le Pivert sont justes, chacune dans leur contexte:
  • fichier rapidement copié, pas le temps de voir la progresserbar
  • fichier long, le programme peut figer, et ne lancer le timer qu'après la copie => Thread, le backgroundworker est une piste à suivre. J'en ai utilisé un pour une source issue d'une collaboration avec entre autre Uc, c'est en C#, mais le principe est le même http://codes-sources.commentcamarche.net/source/100423-le-jeu-du-boogle


Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 mai 2015 à 22:55
Je ne sais pas pourquoi, mais plus je lis ce qu'en dit MSDN, plus je suis persuadé de ce que l'utilisation de FileIO.UIOption est ce qui convient et ne nécessite aucune progressbar (déjà incluse).
Mais bon ...

Pour la petite histoire, voilà ce que je ferais personnellement en VB6 (doit pouvoir être facilement transposé en VB.Net) :
une Hscrollbar hscroll1 (avec un max de 100 et un pas de 1) , un bouton de commande Command1 et un label (optionnel) Label1
Aucun Timer ===>>
Code d'un Form :
Private Sub Form_Activate()
Set F = HScroll1
Set L = Label1
HScroll1.Visible = False
End Sub

Private Sub Command1_Click()
Dim Ret As Long
Me.AutoRedraw = True
HScroll1.Visible = True
Ret = CopyFileEx("d:\ucfoutu.txt", "d:\la_bas.txt", AddressOf allons, ByVal 0&, bCancel, COPY_FILE_RESTARTABLE)
HScroll1.Visible = False
Me.Print "Ayé ===>> " + IIf(Ret = 0, "(E C H E C DE LA C O P I E)", "copie réussie")
End Sub


et dans un module .bas
Public Const PROGRESS_CANCEL = 1
Public Const PROGRESS_CONTINUE = 0
Public Const PROGRESS_QUIET = 3
Public Const PROGRESS_STOP = 2
Public Const COPY_FILE_FAIL_IF_EXISTS = &H1
Public Const COPY_FILE_RESTARTABLE = &H2
Public Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As Long
Public bCancel As Long, F As Control, L As Control
Public Function allons(ByVal TotalFileSize As Currency, ByVal TotalBytesTransferred As Currency, ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
L.Caption = CStr(Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)) + "% complete..."
F.Value = Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)
DoEvents
allons = PROGRESS_CONTINUE
End Function

Voilà ... (et cela constate la progression de la copie et pas celle de la durée).
Te reste plus qu'à trouver un fichier assez lourd (sinon, tu n'auras même pas le temps de voir la progression).
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
18 mai 2015 à 08:11
Erreur de ma part ucfoutu.

Tu as tout à fait raison FileIO.UIOption affiche une barre de progression en plus de t'indiquer que le fichier est déjà présent, si tu veux l'écraser!

je me suis servi souvent de ce code sans voir la barre de progression!

Il a fallu que je fasse un essai avec un fichier de 100Mo pour la voir apparaître une fraction de seconde.

Bonne journée

0
jerlo11 Messages postés 109 Date d'inscription mardi 19 mai 2015 Statut Membre Dernière intervention 17 novembre 2022
19 mai 2015 à 15:08
Si l'opération est longue à traiter je passerai par un background Worker.
A priori l'idée à déjà été donné par Wishmeri.
Perso j'utilise cela pour le traitement d'opération longue et c'est très simple à mettre en place.
0
Rejoignez-nous