OVH Cloud OVH Cloud

Interdire COLLER dans un TextBox

9 réponses
Avatar
Daniel AUBRY
Bonjour à tous,

je souhaite interdire le COLLER dans un TextBox.
J'ai bien essayé la propriété Locked mais là je ne peux
plus saisir.
Ce que je souhaite, c'est obliger l'utilisateur à effectuer sa saisie.

Si quelqu'un a une p'tite idée, elle sera la bienvenue.

D'avance, merci.

Dany

9 réponses

Avatar
jean-marc
"Daniel AUBRY" wrote in message
news:430d84f8$0$2962$
Bonjour à tous,

je souhaite interdire le COLLER dans un TextBox.
J'ai bien essayé la propriété Locked mais là je ne peux
plus saisir.
Ce que je souhaite, c'est obliger l'utilisateur à effectuer sa saisie.

Si quelqu'un a une p'tite idée, elle sera la bienvenue.



Hello,

une idée amusante et qui fonctionne très bien;
On utilise le fait que si tu fais un copy paste
(de plus de 1 caractère), la différence de longueur
entre le nouveau texte dans la textBox et l'ancien texte
sera plus grande que 1, ce qui ne se produit pas quand
on saisi manuellement.

Il ne reste plus qu'à judicieusement disposer une variable
statique dans le change, et le tour est joué.
J'ai testé, cela fonctionne bien, je n'ai pas vu de cas
qui ne marchaient pas.


Private Sub Text1_Change()
Static oldValue As String

If Abs(Len(oldValue) - Len(Text1.Text)) > 1 Then
If Text1.Text <> "" Then
MsgBox "copy paste interdit"
Text1.Text = ""
End If
End If
oldValue = Text1.Text
End Sub

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
scraper
Bonjour jean-marc, dans le message
news:430dac05$0$10959$
tu disais :

une idée amusante et qui fonctionne très bien;
On utilise le fait que si tu fais un copy paste
(de plus de 1 caractère), la différence de longueur
entre le nouveau texte dans la textBox et l'ancien texte
sera plus grande que 1, ce qui ne se produit pas quand
on saisi manuellement.

Il ne reste plus qu'à judicieusement disposer une variable
statique dans le change, et le tour est joué.
J'ai testé, cela fonctionne bien, je n'ai pas vu de cas
qui ne marchaient pas.



et :

Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single,
Y As Single)

If Button = 2 Then Text1.Text=VbNullString

End Sub


c'est pas bon ? :-)


--

Adresse invalide
Merci de répondre sur le forum ...
http://scraper.chez.tiscali.fr

scraper
Avatar
DJ
scraper wrote:
Bonjour jean-marc, dans le message
news:430dac05$0$10959$
tu disais :

une idée amusante et qui fonctionne très bien;
On utilise le fait que si tu fais un copy paste
(de plus de 1 caractère), la différence de longueur
entre le nouveau texte dans la textBox et l'ancien texte
sera plus grande que 1, ce qui ne se produit pas quand
on saisi manuellement.

Il ne reste plus qu'à judicieusement disposer une variable
statique dans le change, et le tour est joué.
J'ai testé, cela fonctionne bien, je n'ai pas vu de cas
qui ne marchaient pas.



et :

Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)

If Button = 2 Then Text1.Text=VbNullString

End Sub


c'est pas bon ? :-)



ben tu crois que ca marche si c'est un ctrl V -C ??
moi je dis-ca , je dis rien ! c'est juste aucas ou il tomberait sur un malin
...
DJ
Avatar
scraper
Bonjour DJ, dans le message
news:
tu disais :


ben tu crois que ca marche si c'est un ctrl V -C ??
moi je dis-ca , je dis rien ! c'est juste aucas ou il tomberait sur
un malin ...
DJ



ah yes ...

je me disais aussi, c'est trop facile :-)

merci



--

Adresse invalide
Merci de répondre sur le forum ...
http://scraper.chez.tiscali.fr

scraper
Avatar
LE TROLL
Lol, ben voui, ça marche pas ça, il y a d'autres façons de copier, le
clavier, mais encore les menus éventuellement...

------------

"DJ" a écrit dans le message de news:

scraper wrote:
Bonjour jean-marc, dans le message
news:430dac05$0$10959$
tu disais :

une idée amusante et qui fonctionne très bien;
On utilise le fait que si tu fais un copy paste
(de plus de 1 caractère), la différence de longueur
entre le nouveau texte dans la textBox et l'ancien texte
sera plus grande que 1, ce qui ne se produit pas quand
on saisi manuellement.

Il ne reste plus qu'à judicieusement disposer une variable
statique dans le change, et le tour est joué.
J'ai testé, cela fonctionne bien, je n'ai pas vu de cas
qui ne marchaient pas.



et :

Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)

If Button = 2 Then Text1.Text=VbNullString

End Sub


c'est pas bon ? :-)



ben tu crois que ca marche si c'est un ctrl V -C ??
moi je dis-ca , je dis rien ! c'est juste aucas ou il tomberait sur un malin
...
DJ




Avatar
Guy DETIENNE
Salut ;O)

La seule façon efficace est de sous-classer le contrôle Textbox.
Pour ce faire, il faut intercepter le message de type WM_PASTE qui est
envoyé au Textbox.
Quand interception il y a, on annule le message qui est envoyé au textbox et
le tour est joué.

Voici un exemple tout prêt ci-dessous. Il faut un module et un formulaire
ayant un TextBox nommé Text1.

Bon amusement !

Guy

'---------------------------------------------------------------------------
---
'DANS UN MODULE :
'---------------------------------------------------------------------------
---
Option Explicit

' Déclaration des API
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
( _
ByVal Hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
( _
ByVal lpPrevWndFunc As Long, _
ByVal Hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Const GWL_WNDPROC = (-4)
Private Const WM_PASTE = &H302

' Variables utilisée par le programme
Private colScControls As New Collection

Public Sub Subclass(hWindow As Long)

Dim OldWndProc As Long

'Si aucun autre contrôle n'est déjà sousclassé
If IsMemberInCollection("hwnd" & hWindow, colScControls) = False Then
'Redéfinit la procédure à laquelle les messages doivent être envoyés
OldWndProc = SetWindowLong(hWindow, GWL_WNDPROC, AddressOf WndProc)
'Ajoute le pointeur vers l'ancienne procédure à la collection
colScControls.Add OldWndProc, "hwnd" & hWindow
End If

End Sub

' Procédure appelé lorsqu'un nouveau message est à traiter
Private Function WndProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long

' Booléen permettant de savoir s'il faut retourner la valeur par défaut
ou non
Dim bReturnOld As Boolean

bReturnOld = True

Select Case uMsg ' Utile pour plusieurs messages
Case WM_PASTE ' Dans le cas où on colle du texte
If Not IsNumeric(Clipboard.GetText) Then ' Si le texte dans le
presse papier n'est pas numérique
WndProc = 0 ' On renvoie une réponse négative: le texte ne
sera pas collé
bReturnOld = False
End If
End Select

' Si on ne veut pas redéfinir la valeur retournée, on retourne la valeur
que retourne la procédure par défaut
If bReturnOld Then WndProc = CallWindowProc(colScControls("hwnd" &
Hwnd), Hwnd, uMsg, wParam, lParam)

End Function

Public Sub UnSubclass(hWindow As Long)

' Si un contrôle a déjà été souclassé
If IsMemberInCollection("hwnd" & hWindow, colScControls) Then
' Redéfinit la procédure à laquelle les messages doivent être
envoyés
SetWindowLong hWindow, GWL_WNDPROC, colScControls("hwnd" & hWindow)
' Supprime la référence à la fenêtre de la collection
colScControls.Remove "hwnd" & hWindow
End If

End Sub

Private Function IsMemberInCollection(Member, Collection As Collection) As
Boolean

Dim TempVal As Variant

On Error Resume Next
TempVal = Collection(Member)
IsMemberInCollection = (Err.Number = 0)
Err.Clear

End Function



'---------------------------------------------------------------------------
---
'DANS UN FORMULAIRE AYANT UN TEXTBOX NOMME Text1
'---------------------------------------------------------------------------
---
Option Explicit

Private Sub Form_Load()
Subclass Text1.Hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnSubclass Text1.Hwnd
End Sub

Private Sub Text1_Change()

End Sub




"Daniel AUBRY" a écrit dans le message de
news:430d84f8$0$2962$
Bonjour à tous,

je souhaite interdire le COLLER dans un TextBox.
J'ai bien essayé la propriété Locked mais là je ne peux
plus saisir.
Ce que je souhaite, c'est obliger l'utilisateur à effectuer sa saisie.

Si quelqu'un a une p'tite idée, elle sera la bienvenue.

D'avance, merci.

Dany




Avatar
Daniel AUBRY
Que de code !!!
Je pensais naïvement qu'on pouvait faire plus simple..............

Merci quand même, je vais mettre tout ceci en pratique dès ce soir.

Dany

"Guy DETIENNE" a écrit dans le message de news:

Salut ;O)

La seule façon efficace est de sous-classer le contrôle Textbox.
Pour ce faire, il faut intercepter le message de type WM_PASTE qui est
envoyé au Textbox.
Quand interception il y a, on annule le message qui est envoyé au textbox
et
le tour est joué.

Voici un exemple tout prêt ci-dessous. Il faut un module et un formulaire
ayant un TextBox nommé Text1.

Bon amusement !

Guy

'---------------------------------------------------------------------------
---
'DANS UN MODULE :
'---------------------------------------------------------------------------
---
Option Explicit

' Déclaration des API
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
( _
ByVal Hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias
"CallWindowProcA"
( _
ByVal lpPrevWndFunc As Long, _
ByVal Hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Const GWL_WNDPROC = (-4)
Private Const WM_PASTE = &H302

' Variables utilisée par le programme
Private colScControls As New Collection

Public Sub Subclass(hWindow As Long)

Dim OldWndProc As Long

'Si aucun autre contrôle n'est déjà sousclassé
If IsMemberInCollection("hwnd" & hWindow, colScControls) = False Then
'Redéfinit la procédure à laquelle les messages doivent être
envoyés
OldWndProc = SetWindowLong(hWindow, GWL_WNDPROC, AddressOf WndProc)
'Ajoute le pointeur vers l'ancienne procédure à la collection
colScControls.Add OldWndProc, "hwnd" & hWindow
End If

End Sub

' Procédure appelé lorsqu'un nouveau message est à traiter
Private Function WndProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long

' Booléen permettant de savoir s'il faut retourner la valeur par défaut
ou non
Dim bReturnOld As Boolean

bReturnOld = True

Select Case uMsg ' Utile pour plusieurs messages
Case WM_PASTE ' Dans le cas où on colle du texte
If Not IsNumeric(Clipboard.GetText) Then ' Si le texte dans le
presse papier n'est pas numérique
WndProc = 0 ' On renvoie une réponse négative: le texte ne
sera pas collé
bReturnOld = False
End If
End Select

' Si on ne veut pas redéfinir la valeur retournée, on retourne la
valeur
que retourne la procédure par défaut
If bReturnOld Then WndProc = CallWindowProc(colScControls("hwnd" &
Hwnd), Hwnd, uMsg, wParam, lParam)

End Function

Public Sub UnSubclass(hWindow As Long)

' Si un contrôle a déjà été souclassé
If IsMemberInCollection("hwnd" & hWindow, colScControls) Then
' Redéfinit la procédure à laquelle les messages doivent être
envoyés
SetWindowLong hWindow, GWL_WNDPROC, colScControls("hwnd" & hWindow)
' Supprime la référence à la fenêtre de la collection
colScControls.Remove "hwnd" & hWindow
End If

End Sub

Private Function IsMemberInCollection(Member, Collection As Collection) As
Boolean

Dim TempVal As Variant

On Error Resume Next
TempVal = Collection(Member)
IsMemberInCollection = (Err.Number = 0)
Err.Clear

End Function



'---------------------------------------------------------------------------
---
'DANS UN FORMULAIRE AYANT UN TEXTBOX NOMME Text1
'---------------------------------------------------------------------------
---
Option Explicit

Private Sub Form_Load()
Subclass Text1.Hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnSubclass Text1.Hwnd
End Sub

Private Sub Text1_Change()

End Sub




"Daniel AUBRY" a écrit dans le message de
news:430d84f8$0$2962$
Bonjour à tous,

je souhaite interdire le COLLER dans un TextBox.
J'ai bien essayé la propriété Locked mais là je ne peux
plus saisir.
Ce que je souhaite, c'est obliger l'utilisateur à effectuer sa saisie.

Si quelqu'un a une p'tite idée, elle sera la bienvenue.

D'avance, merci.

Dany








Avatar
Guy DETIENNE
Salut ;O)

Hélas en VB, faut coder, coder et encore coder pour arriver à des solutions
efficaces.
L'exemple que je t'ai fourni est certes long, mais 100% efficace et fiable
sans devoir passer par du bricolage maison qui ne tient pas toujours la
route.

Ceci dit, sache que le sous-classement en VB est monnaie courrante une fois
que l'on veut aller plus loin avec les contrôles standards.

Guy


"Daniel AUBRY" a écrit dans le message de
news:430df0bd$0$3790$
Que de code !!!
Je pensais naïvement qu'on pouvait faire plus simple..............

Merci quand même, je vais mettre tout ceci en pratique dès ce soir.

Dany

"Guy DETIENNE" a écrit dans le message de news:

> Salut ;O)
>
> La seule façon efficace est de sous-classer le contrôle Textbox.
> Pour ce faire, il faut intercepter le message de type WM_PASTE qui est
> envoyé au Textbox.
> Quand interception il y a, on annule le message qui est envoyé au


textbox
> et
> le tour est joué.
>
> Voici un exemple tout prêt ci-dessous. Il faut un module et un


formulaire
> ayant un TextBox nommé Text1.
>
> Bon amusement !
>
> Guy
>
>


'---------------------------------------------------------------------------
> ---
> 'DANS UN MODULE :
>


'---------------------------------------------------------------------------
> ---
> Option Explicit
>
> ' Déclaration des API
> Private Declare Function SetWindowLong Lib "user32" Alias


"SetWindowLongA"
> ( _
> ByVal Hwnd As Long, _
> ByVal nIndex As Long, _
> ByVal dwNewLong As Long) As Long
> Public Declare Function CallWindowProc Lib "user32" Alias
> "CallWindowProcA"
> ( _
> ByVal lpPrevWndFunc As Long, _
> ByVal Hwnd As Long, _
> ByVal Msg As Long, _
> ByVal wParam As Long, _
> ByVal lParam As Long) As Long
>
> Private Const GWL_WNDPROC = (-4)
> Private Const WM_PASTE = &H302
>
> ' Variables utilisée par le programme
> Private colScControls As New Collection
>
> Public Sub Subclass(hWindow As Long)
>
> Dim OldWndProc As Long
>
> 'Si aucun autre contrôle n'est déjà sousclassé
> If IsMemberInCollection("hwnd" & hWindow, colScControls) = False Then
> 'Redéfinit la procédure à laquelle les messages doivent être
> envoyés
> OldWndProc = SetWindowLong(hWindow, GWL_WNDPROC, AddressOf


WndProc)
> 'Ajoute le pointeur vers l'ancienne procédure à la collection
> colScControls.Add OldWndProc, "hwnd" & hWindow
> End If
>
> End Sub
>
> ' Procédure appelé lorsqu'un nouveau message est à traiter
> Private Function WndProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal
> wParam As Long, ByVal lParam As Long) As Long
>
> ' Booléen permettant de savoir s'il faut retourner la valeur par


défaut
> ou non
> Dim bReturnOld As Boolean
>
> bReturnOld = True
>
> Select Case uMsg ' Utile pour plusieurs messages
> Case WM_PASTE ' Dans le cas où on colle du texte
> If Not IsNumeric(Clipboard.GetText) Then ' Si le texte dans


le
> presse papier n'est pas numérique
> WndProc = 0 ' On renvoie une réponse négative: le texte


ne
> sera pas collé
> bReturnOld = False
> End If
> End Select
>
> ' Si on ne veut pas redéfinir la valeur retournée, on retourne la
> valeur
> que retourne la procédure par défaut
> If bReturnOld Then WndProc = CallWindowProc(colScControls("hwnd" &
> Hwnd), Hwnd, uMsg, wParam, lParam)
>
> End Function
>
> Public Sub UnSubclass(hWindow As Long)
>
> ' Si un contrôle a déjà été souclassé
> If IsMemberInCollection("hwnd" & hWindow, colScControls) Then
> ' Redéfinit la procédure à laquelle les messages doivent être
> envoyés
> SetWindowLong hWindow, GWL_WNDPROC, colScControls("hwnd" &


hWindow)
> ' Supprime la référence à la fenêtre de la collection
> colScControls.Remove "hwnd" & hWindow
> End If
>
> End Sub
>
> Private Function IsMemberInCollection(Member, Collection As Collection)


As
> Boolean
>
> Dim TempVal As Variant
>
> On Error Resume Next
> TempVal = Collection(Member)
> IsMemberInCollection = (Err.Number = 0)
> Err.Clear
>
> End Function
>
>
>
>


'---------------------------------------------------------------------------
> ---
> 'DANS UN FORMULAIRE AYANT UN TEXTBOX NOMME Text1
>


'---------------------------------------------------------------------------
> ---
> Option Explicit
>
> Private Sub Form_Load()
> Subclass Text1.Hwnd
> End Sub
>
> Private Sub Form_Unload(Cancel As Integer)
> UnSubclass Text1.Hwnd
> End Sub
>
> Private Sub Text1_Change()
>
> End Sub
>
>
>
>
> "Daniel AUBRY" a écrit dans le message de
> news:430d84f8$0$2962$
>> Bonjour à tous,
>>
>> je souhaite interdire le COLLER dans un TextBox.
>> J'ai bien essayé la propriété Locked mais là je ne peux
>> plus saisir.
>> Ce que je souhaite, c'est obliger l'utilisateur à effectuer sa saisie.
>>
>> Si quelqu'un a une p'tite idée, elle sera la bienvenue.
>>
>> D'avance, merci.
>>
>> Dany
>>
>>
>
>




Avatar
Jean-Marc
"Guy DETIENNE" a écrit dans le message de
news:
Salut ;O)



Hello,

La seule façon efficace est de sous-classer le contrôle Textbox.
Pour ce faire, il faut intercepter le message de type WM_PASTE qui est
envoyé au Textbox.



Non, ce n'est pas la *seule*. C'est *une* façon. L'utilisation de
l'évènement Change est tout aussi simple, propre et efficace.

Quand interception il y a, on annule le message qui est envoyé au textbox


et
le tour est joué.



Oui, c'est une façon amusante et efficace, un peu overkill à mon goût,
pour un problèmle trivial à résoudre avec un peu de code bien placé.

Ceci dit, il est exact que le subClassing et l'interception et/ou envoi
de messages est une pratique courante et bien utile dans de nombreux
cas :-)

PS: François à donner il y a quelques jours un superbe exemple pour
agrandir la zone de texte visible d'un combobox.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;