IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

mise à jour d'une progressbar à partir d'une fonction de callback dans des classes differentes


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut mise à jour d'une progressbar à partir d'une fonction de callback dans des classes differentes
    Bonjour,
    Voici mon problème, j'ai une application windowsform dans laquelle j'ai une userform avec une progressbar créé à partir du mode design de sharpdevelop:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    Partial Class MainForm
    	Inherits System.Windows.Forms.Form
     
    	''' <summary>
    	''' Designer variable used to keep track of non-visual components.
    	''' </summary>
    	Private components As System.ComponentModel.IContainer
     
    	''' <summary>
    	''' Disposes resources used by the form.
    	''' </summary>
    	''' <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    	Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    		If disposing Then
    			If components IsNot Nothing Then
    				components.Dispose()
    			End If
    		End If
    		MyBase.Dispose(disposing)
    	End Sub
     
    	''' <summary>
    	''' This method is required for Windows Forms designer support.
    	''' Do not change the method contents inside the source code editor. The Forms designer might
    	''' not be able to load this method if it was changed manually.
    	''' </summary>
    	Private Sub InitializeComponent()
    		Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainForm))
    		...
    		Me.progressBarFirmwareUpdate = New System.Windows.Forms.ProgressBar()
    		...
    		'
    		'progressBarFirmwareUpdate
    		'
    		Me.progressBarFirmwareUpdate.Location = New System.Drawing.Point(143, 177)
    		Me.progressBarFirmwareUpdate.Name = "progressBarFirmwareUpdate"
    		Me.progressBarFirmwareUpdate.Size = New System.Drawing.Size(300, 15)
    		Me.progressBarFirmwareUpdate.Step = 1
    		Me.progressBarFirmwareUpdate.TabIndex = 0
    		'
    		'MainForm
    		'
    		Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!)
    		Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    		Me.ClientSize = New System.Drawing.Size(489, 262)
    		Me.Controls.Add(Me.tabControl1)
    		Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D
    		Me.Icon = CType(resources.GetObject("$this.Icon"),System.Drawing.Icon)
    		Me.MaximizeBox = false
    		Me.Name = "MainForm"
    		Me.Text = "Thales Reader V4 Tools"
    		AddHandler Load, AddressOf Me.MainFormLoad
    		Me.tabControl1.ResumeLayout(false)
    		Me.tabPage1.ResumeLayout(false)
    		Me.tabPage1.PerformLayout
    		Me.ResumeLayout(false)
    	End Sub
     
    	...
    	Private progressBarFirmwareUpdate As System.Windows.Forms.ProgressBar
    	...
     
    	Sub ButtonUpdateClick(sender As Object, e As EventArgs)
    		MyReader.CSCReaderFirmwareUpdate()		
    	End Sub
     
     
     
    End Class
    J'ai créé une classe dans laquelle j'ai une fonction de callback qui est appelée par une dll CscApi.dll qui permet de voir la progression de mise à jour d'un firmware sur un periphereique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class CscApi
    ...
    <UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)>
    Private Delegate Sub fHookInstall (ByVal hCsc As System.UInt32, ByVal ratio As System.uint32, ByVal pArg As System.IntPtr)
    ...
    'fonction FirmwareUpdateCallback 
    Public Sub ProcfHookInstallFunc (ByVal hCsc As System.UInt32, ByVal ratio As System.uint32, ByVal pArg As System.IntPtr)
    	....
    	....
    End Sub
     
    End Class
    Dans cette fonction de callback , ratio correspond au pourcentage d'avancement de mise à jour du firmware, hCsc correspond au handle du peripherique, et pArg est un paramètre laissé libre à l'utilisateur.
    J'aurai souhaité faire quelquechose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub ProcfHookInstallFunc (ByVal hCsc As System.UInt32, ByVal ratio As System.uint32, ByVal pArg As System.IntPtr)
     
              progressBarFirmwareUpdate.value = ratio
    End Sub
    Mais ca ne fonctionne pas car progressBarFirmwareUpdate ne fait pas partie ma class CscApi

    J'ai tenté en déclarant progressBarFirmwareUpdate en public shared, mais j'ai le warning suivant:

    Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated. (BC42025)
    Du coup je ne vois vraiment pas comment faire pour mettre à jour la progressbar de maniere propre.

    Merci pour votre aide ou vos pistes.

    Cdt,
    yaume91

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut
    Je me répond à moi meme, finalement c'était pas si compliqué, il suffisait de créer une fonction ProgressbarUpdate dans la class Mainform comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Partial Class MainForm
     
    ....
    Public shared Sub ProgressBarUpdate(ByVal pourcent As Integer)
    		MainForm.progressBarFirmwareUpdate.Value = pourcent
    	End Sub
    ...
    End Class
    A laquelle on fait appel dans la fonction de callback de la class CscApi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Class CscApi
    ...
    <UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)>
    Private Delegate Sub fHookInstall (ByVal hCsc As System.UInt32, ByVal ratio As System.uint32, ByVal pArg As System.IntPtr)
    ...
    'fonction FirmwareUpdateCallback 
    Public Sub ProcfHookInstallFunc (ByVal hCsc As System.UInt32, ByVal ratio As System.uint32, ByVal pArg As System.IntPtr)
    	MainForm.ProgressBarUpdate(Convert.ToInt16(ratio))
    End Sub
     
    End Class

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/10/2010, 14h55
  2. [AC-2003] Mise à jour d'une liste sur saisie dans une textbox
    Par tarnx dans le forum IHM
    Réponses: 2
    Dernier message: 30/03/2010, 19h05
  3. Réponses: 1
    Dernier message: 02/05/2008, 20h34
  4. mise à jour d'une fenetre apres selection dans une combo
    Par mnssylvain dans le forum WinDev
    Réponses: 51
    Dernier message: 06/03/2008, 11h10
  5. Mise à jour d'une variable après choix dans une combobox
    Par ~Brouette~ dans le forum Langage
    Réponses: 1
    Dernier message: 21/12/2007, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo