cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 2019
-
13 juin 2004 à 21:36
automlm
Messages postés1Date d'inscriptionjeudi 29 avril 2004StatutMembreDernière intervention 7 juillet 2004
-
7 juil. 2004 à 15:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
automlm
Messages postés1Date d'inscriptionjeudi 29 avril 2004StatutMembreDernière intervention 7 juillet 2004 7 juil. 2004 à 15:01
REPONSE POUR HUUGOOO :
JE PENSE QUE C'EST PLUTOT DU JAPONAIS
JoePatent
Messages postés171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 juillet 2008 15 juin 2004 à 03:24
Private = Seulement disponible dans le module/classe en cours
Public = Disponible partout dans le programme
Friend = ???
J'imagine que tu fait reference a vb.net ou 2003.
Pour les regles de visibilité maintenant. .Net et 2003 on travaillle une solution. Une solution peut incorporer plusieurs projets a la fois.
private = module en cours
public = visible de tous les projets.
friend = pour le projet en cours
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008 15 juin 2004 à 02:04
C'est vraiment stupide. être oubligé de faire du sous-classing parce que TimeSetEvent est mal fait et en plus, il va falloir utiliser des TBLs...
J'ai une grosse question à propos de mots clées :
Private = Seulement disponible dans le module/classe en cours
Public = Disponible partout dans le programme
Friend = ???
Désolé pour cette question peut-être stupide
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008 14 juin 2004 à 13:59
EB:
Mais pourquoi dans ce callback c'est juste PostMessage qui est autorisé? Pourquoi faut-il que microsoft complique tout? Toi qui a commencer à faire du c++ : Est-ce que le c++ en vaut la peine?
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 13 juin 2004 à 23:51
a... joubliais de dire que l'utilisation de postmessage tel quel entraine la plantage immediat de vb en mode compilé pour cela declare ta fonction dans une tlb !
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 13 juin 2004 à 23:48
Ok j'ai la reponse a ta question :
"La seul fonction autorisé dans le callback TimerProc est PostMessage"
A partir de la ça nous laisse pas bcp de possibilité, mon ami Afyn aurais surement mieu repondu que moi mais voici une reponse possible. Dans un premier temp tu crée une fenetre lambda a l'initialisation de ta classe VBTimer. Puis dans un deuxieme temp tu appel la fonction winmSetTimer avec le handle de la fenetre en paramettre. Il en resulte un code completement batard mais le fait est que la fonction ne permet pas autre chose (c'est decevant pour une fonction soit disant de haute precision mais c'est comme cela).
J'ai deja un projet complet et fonctionnel en mode compilé et IDE si tu le souhaite je peut le poster ou te l'envoyer. Voici le code :
Classe (nomé dans cette exemple cTimer) :
Option Explicit
Public Event Timer()
Private mInterval As Long
Private mHandle As Long
Private mhWnd As Long
Private mWndProc As Long
Private Sub Class_Terminate()
Enabled = False
SetWindowLong mhWnd, GWL_WNDPROC, mWndProc
DestroyWindow mhWnd
End Sub
Friend Sub CallEvent()
RaiseEvent Timer
End Sub
Public Property Get Interval() As Long
Interval = mInterval
End Property
Public Property Let Interval(ByVal vNewValue As Long)
If (vNewValue <> mInterval) Then
mInterval = vNewValue
If (mHandle) Then
Enabled = False
Enabled = True
End If
End If
End Property
Public Property Get Enabled() As Boolean
Enabled = (mHandle <> 0)
End Property
Public Property Let Enabled(ByVal vNewValue As Boolean)
If vNewValue Then
If (mHandle = 0) Then
mHandle = timeSetEvent(mInterval, 0, AddressOf TimerProc, mhWnd, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
End If
Else
If (mHandle <> 0) Then
timeKillEvent mHandle
mHandle = 0
End If
End If
End Property
Module :
Option Explicit
Sub TimerProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
PostMessage dwUser, WM_VBTIMER, 0, 0
End Sub
Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim vTemp As cTimer
Dim vEmpty As Long
Dim vPtr As Long
Select Case uMsg
Case WM_VBTIMER
vPtr = GetProp(hWnd, "Timer")
CopyMemory vTemp, vPtr, 4
vTemp.CallEvent
CopyMemory vTemp, vEmpty, 4
7 juil. 2004 à 15:01
JE PENSE QUE C'EST PLUTOT DU JAPONAIS
15 juin 2004 à 03:24
Public = Disponible partout dans le programme
Friend = ???
J'imagine que tu fait reference a vb.net ou 2003.
Pour les regles de visibilité maintenant. .Net et 2003 on travaillle une solution. Une solution peut incorporer plusieurs projets a la fois.
private = module en cours
public = visible de tous les projets.
friend = pour le projet en cours
15 juin 2004 à 02:04
J'ai une grosse question à propos de mots clées :
Private = Seulement disponible dans le module/classe en cours
Public = Disponible partout dans le programme
Friend = ???
Désolé pour cette question peut-être stupide
14 juin 2004 à 13:59
Mais pourquoi dans ce callback c'est juste PostMessage qui est autorisé? Pourquoi faut-il que microsoft complique tout? Toi qui a commencer à faire du c++ : Est-ce que le c++ en vaut la peine?
14 juin 2004 à 01:40
13 juin 2004 à 23:51
13 juin 2004 à 23:48
"La seul fonction autorisé dans le callback TimerProc est PostMessage"
A partir de la ça nous laisse pas bcp de possibilité, mon ami Afyn aurais surement mieu repondu que moi mais voici une reponse possible. Dans un premier temp tu crée une fenetre lambda a l'initialisation de ta classe VBTimer. Puis dans un deuxieme temp tu appel la fonction winmSetTimer avec le handle de la fenetre en paramettre. Il en resulte un code completement batard mais le fait est que la fonction ne permet pas autre chose (c'est decevant pour une fonction soit disant de haute precision mais c'est comme cela).
J'ai deja un projet complet et fonctionnel en mode compilé et IDE si tu le souhaite je peut le poster ou te l'envoyer. Voici le code :
Classe (nomé dans cette exemple cTimer) :
Option Explicit
Public Event Timer()
Private mInterval As Long
Private mHandle As Long
Private mhWnd As Long
Private mWndProc As Long
Private Sub Class_Initialize()
mhWnd = CreateWindowEx(0, "Static", vbNullString, 0, 0, 0, 0, 0, 0, 0, App.hInstance, ByVal 0&)
mWndProc = GetWindowLong(mhWnd, GWL_WNDPROC)
SetProp mhWnd, "Timer", ObjPtr(Me)
SetProp mhWnd, "WindowProc", mWndProc
SetWindowLong mhWnd, GWL_WNDPROC, AddressOf WindowProc
End Sub
Private Sub Class_Terminate()
Enabled = False
SetWindowLong mhWnd, GWL_WNDPROC, mWndProc
DestroyWindow mhWnd
End Sub
Friend Sub CallEvent()
RaiseEvent Timer
End Sub
Public Property Get Interval() As Long
Interval = mInterval
End Property
Public Property Let Interval(ByVal vNewValue As Long)
If (vNewValue <> mInterval) Then
mInterval = vNewValue
If (mHandle) Then
Enabled = False
Enabled = True
End If
End If
End Property
Public Property Get Enabled() As Boolean
Enabled = (mHandle <> 0)
End Property
Public Property Let Enabled(ByVal vNewValue As Boolean)
If vNewValue Then
If (mHandle = 0) Then
mHandle = timeSetEvent(mInterval, 0, AddressOf TimerProc, mhWnd, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
End If
Else
If (mHandle <> 0) Then
timeKillEvent mHandle
mHandle = 0
End If
End If
End Property
Module :
Option Explicit
Sub TimerProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
PostMessage dwUser, WM_VBTIMER, 0, 0
End Sub
Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim vTemp As cTimer
Dim vEmpty As Long
Dim vPtr As Long
Select Case uMsg
Case WM_VBTIMER
vPtr = GetProp(hWnd, "Timer")
CopyMemory vTemp, vPtr, 4
vTemp.CallEvent
CopyMemory vTemp, vEmpty, 4
Case Else
vPtr = GetProp(hWnd, "WindowProc")
WindowProc = CallWindowProc(vPtr, hWnd, uMsg, wParam, lParam)
End Select
End Function
@+