TEXTEBOX MULTIFONCTIONS

Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015 - 8 juil. 2010 à 17:39
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015 - 10 juil. 2010 à 13:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52000-textebox-multifonctions

Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
10 juil. 2010 à 13:45
J'ai réglé le problème mais lors du lost focus. Ce n'est pas esthétique mais si y a mieux je dirai pas non.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2010 à 13:12
tu peux faire le changent de caractere a a la volee, lors de la pression sur les touches
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
10 juil. 2010 à 12:18
Voilà, il ne reste qu'un bogues et une option à régler.

'Le ProperCase à des erreurs lors de l'édition au milieu du mot.
'Ne mets pas les formats de date et heure en dur, utilises les paramètres régionaux du poste.

Quelqu'un à une solution pour résoudre le problème du ProperCase svp ?
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
9 juil. 2010 à 20:46
Punaise... dire que c'était si simple que ça -_-"

Source mise à jour...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2010 à 20:38
une fois le panneau 'Avances' deplie, mettre

(Par défaut)

dams l'ID de la procedure
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
9 juil. 2010 à 17:41
Dsl pour le nom Renfield :D

Outils > Attributs de procedure
J'ai cocher une par une et sélectionné Text, décoché une par une, enfin, je penses n'avoir pas oublié un point... mais en vain toujours pareil.
Quand je fais effectivement
MsgBox TextBox
il me fait une erreur 438
Mais quand je met
MsgBox TextBox.Text
là il fonctionne

J'ai téléchargé aussi tes deux exemples qui parlent de texbox et toi non plus tu n'a pas mis ces options en place.
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
9 juil. 2010 à 17:10
Salut, j'ai pas pu ouvrir
ta source car j'ai vb2008 mais je crois avoir saisi le principe.
Pourquoi utiliser les api ?
En vb.net on peut
tout à fait faire ce genre de programme
sans utiliser les apis et avec la fonction copier-coller aussi.

@+
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2010 à 14:29
Rendfield => 'Renfield', merci, un seul 'd'...

Pas de copier-coller dans le 'NeContientQue'
- Exprès pour ne pas mettre de caractères différents que ceux imposés
Discutable... si le texte en cours de collage est valide, autant permettre de le coller...
je ne sais plus si le copier fonctionne (il devrait)

pour la propriété par default, il suffit d'aller dans le menu
Outils > Attributs de procedure

pour les regionnal settings, voir l'API GetLocaleInfo et sa doc.
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
9 juil. 2010 à 14:24
Rendfield,

On peut coller du texte dans le textbox numerique
- c'est réglé

Pas de copier-coller dans le 'NeContientQue'
- Exprès pour ne pas mettre de caractères différents que ceux imposés

Dans le propercase, j'ai presse entree => 70 - Permission refusee
- Bizare ça fonctionne chez moi tu peux vérifier encore stp ?

La propriete Text de tes controles n'est pas celle par defaut
- Je sais pas le faire

Le curseur de saisie fais n'importe quoi pour le propercase quand on presse retour arriere au milieu du mot
- Ben c'était pour ça que j'ai posté ce sujet

Pourquoi mettre le code avec SetWindowLong dans un Timer ? Utilises le Property Let
- J'ai géré la majorité je penses que le problème est résolu

Ne mets pas les formats de date et heure en dur, utilises les parametres regionnaux du poste
- Je sais pas le faire
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
9 juil. 2010 à 13:00
sorry, voir correction ci-dessous

Private Sub ManageTextFormat()
Dim lTextBoxStyle As Long

lTextBoxStyle = GetWindowLong(Txt_TextBox.hwnd, GWL_STYLE)
Select Case meStatus
Case meTextNormal:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_NAROW) And Not (ES_UPPERCASE Or ES_LOWERCASE)
Txt_TextBox.Text = StrConv(Txt_TextBox.Text, vbProperCase)
meStatus = meTextProperCase
Case meTextProperCase:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_LOWERCASE) And Not (ES_UPPERCASE Or ES_NAROW)
Txt_TextBox.Text = LCase(Txt_TextBox.Text)
meStatus = meTextLowerCase
Case meTextLowerCase:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_UPPERCASE) And Not (ES_LOWERCASE Or ES_NAROW)
Txt_TextBox.Text = UCase(Txt_TextBox.Text)
meStatus = meTextUpperCase
Case meTextUpperCase:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_NAROW) And Not (ES_UPPERCASE Or ES_LOWERCASE)
Txt_TextBox.Text = StrConv(Txt_TextBox.Text, vbProperCase)
meStatus = meTextProperCase
End Select
End Sub

précipitation je dois aller m'alimenter, bon ap à vous.
A+
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
9 juil. 2010 à 12:56
c'est moi qui vous remercie à tous les deux.

Finalement dans mon composant, j'ai ramené meTextNormal, meTextUpperCase dans le meme "Case". La première fois ce sera toujours Propercase en premier et après on boucle sur 3 possibilité. Le mode ProperCase étant en fait le mode Normal. J'ai volontaire pas voulu gérer l'évènement Change pour le cas ProperCase parce que pas d'intérêt pour moi, sinon 2 actions apparemment identique pour sortir du mode Normal.

Private Sub ManageTextFormat()
Dim lTextBoxStyle As Long

lTextBoxStyle = GetWindowLong(Txt_TextBox.hwnd, GWL_STYLE)
Select Case meStatus
Case meTextNormal, meTextUpperCase:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_NAROW) And Not (ES_UPPERCASE Or ES_LOWERCASE)
Txt_TextBox.Text = StrConv(Txt_TextBox.Text, vbProperCase)
meStatus = meTextProperCase
Case meTextProperCase:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_LOWERCASE) And Not (ES_UPPERCASE Or ES_NAROW)
Txt_TextBox.Text = LCase(Txt_TextBox.Text)
meStatus = meTextLowerCase
Case meTextLowerCase:
SetWindowLong Txt_TextBox.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_UPPERCASE) And Not (ES_LOWERCASE Or ES_NAROW)
Txt_TextBox.Text = UCase(Txt_TextBox.Text)
meStatus = meTextUpperCase
End Select
End Sub
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
9 juil. 2010 à 12:39
Merci asimengo et à toi aussi Rendfield.

Je suis encore dessus et grâce à votre aide et à vos bouts de codes on aura peut-être quelque chose de "beau" ^^
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
9 juil. 2010 à 12:21
Super,Sinitrus je m'en suis servi pour rajouter la fonction "Shift+F3" de MS Word dans mon composant TextBox. Avec la particularité que le mode de saisie change aussi en conséquence.

Ci-dessous un exemple de code:
Option Explicit
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Enum EnumTextStatus
meTextNormal = 0
meTextProperCase = 1
meTextLowerCase = 2
meTextUpperCase = 3
End Enum

Private Const ES_NAROW As Long = &H3& 'Normal
Private Const ES_UPPERCASE As Long = &H8& 'Majuscule
Private Const ES_LOWERCASE As Long = &H10& 'Minuscule
'Private Const ES_NUMERIC As Long = &H2000& 'Numerique

Private Const GWL_STYLE As Long = -16
Private meStatus As EnumTextStatus

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim lTextBoxStyle As Long

If KeyCode = vbKeyF3 And Shift Then
lTextBoxStyle = GetWindowLong(Text1.hwnd, GWL_STYLE)
Select Case meStatus
Case meTextNormal:
SetWindowLong Text1.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_NAROW) And Not (ES_UPPERCASE Or ES_LOWERCASE)
Text1.Text = StrConv(Text1.Text, vbProperCase)
meStatus = meTextProperCase
Label1.Caption = "ProperCase"
Case meTextProperCase:
SetWindowLong Text1.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_LOWERCASE) And Not (ES_UPPERCASE Or ES_NAROW)
Text1.Text = LCase(Text1.Text)
meStatus = meTextLowerCase
Label1.Caption = "LowerCase"
Case meTextLowerCase:
SetWindowLong Text1.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_UPPERCASE) And Not (ES_LOWERCASE Or ES_NAROW)
Text1.Text = UCase(Text1.Text)
meStatus = meTextUpperCase
Label1.Caption = "UpperCase"
Case meTextUpperCase:
SetWindowLong Text1.hwnd, GWL_STYLE, (lTextBoxStyle Or ES_NAROW) And Not (ES_UPPERCASE Or ES_LOWERCASE)
meStatus = meTextNormal
Label1.Caption = "Normal"
End Select
End If
End Sub

En bref, à chaque action "Shift+F3" (en réalité "F12" dans mon composant) je lit le style courant, et je mets à jour les seuls bits activant/désactivant Miniscule et Majuscule en fonction des cas. L'algo est intéressant peut servir pour extrapolation du principe ...

A+
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2010 à 07:13
ne mets pas ces formats en dur, utilises les parametres regionnaux du poste.
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
8 juil. 2010 à 22:32
Merci Renfield, je m'y met dès demain matin ^^
Je compte aussi mettre un MaskEdit dedans.

J'ai réussi les :
DateHeure au format dd/mm/yyyy hh:nn:ss
DateComple au format dddd, dd mmmm yyyy
DateSimple au format dd/mm/yyyy
HeureComple au format hh:nn:ss
HeureSimple au format hh:nn

Il y a encore du travail à faire en tout cas...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2010 à 21:08
Quelques tests rapides:

on peut coller du texte dans le textbox numerique
Le curseur de saisie fais n'importe quoi pour le propercase quand on presse retour arriere
dans le propercase, j'ai presse entree => 70 - Permission refusee
pas de copier-coller dans le 'NeContientQue'

La propriete Text de tes controles n'est pas celle par defaut

Pourquoi mettre le code avec SetWindowLong dans un Timer ?
Utilises le Property Let
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
8 juil. 2010 à 17:39
Merci de ne pas oublier de noter ^^
Rejoignez-nous