VbCrLf ou vbTab en .Net ?

Résolu
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 9 avril 2013 à 10:37
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 10 avril 2013 à 01:28
Salut ta tou(te)s

Sous VB6, j'avais l'habitude d'utiliser des raccourcis bien pratiques comme vbCrLf ou vbTab.
Sous .Net, ces raccourcis appartiennent à l'espace de noms .VisualBasic; référence qu'il est préférable d'éviter.

Alors, par quoi sont remplacés ces raccourcis.
J'ai beau farfouiner partout, je ne trouve pas.
J'ai bien vu Environment.NewLine, mais il est tout seul et ne correspond pas à ce que j'utilise couramment; en plus, la syntaxe est bien longue pour pas grand chose.

Faut-il recréer ses propres constantes ?
Comment faites-vous, vous ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)

20 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 avril 2013 à 12:33
Ah !
Utilise alors une variable, plutôt qu'une constante (même si tu ne la fais pas varier). Et elle acceptera la notation que refuse la constante.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 avril 2013 à 12:50
Bonjour,

Une propriété en Lecture seule peut faire l'affaire.

Sinon, une fonction.
Il n'est pas possible de faire une constante avec Tab ou CrLf, car ce sont des caractères qui peuvent être remplacés indûment par l'EDI.

Pour VbCrLf, il y a déjà Environment.NewLine.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 avril 2013 à 10:47
Bonjour,
VBcrlf n'étant jamais que chr(13) & chr(10) tu devrais pouvoir faire ta propre constante sur ces bases


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Salut tatou.

Je vais vous dire comment je fais, mais ne le dites à personne de crainte que les aficionados du vb.net me fassent excommunier. J'ai le module standard suivant
Imports System.IO
Imports System.IO.Path
Module Utilitaires
    Public vbCrLf As String = Environment.NewLine

    Public Sub Bip()
        System.Media.SystemSounds.Beep.Play()
    End Sub

    Public Function FichierExistant(ByVal Chemin As String) As Boolean
        Return File.Exists(Chemin)
    End Function

    Public Function DossierExistant(ByVal Chemin As String) As Boolean
        Return Directory.Exists(Chemin)
    End Function

    Public Function DossierProjet() As String
        Dim Dos As String
        Dos Application.StartupPath : Dos GetDirectoryName(Dos) : Dos = GetDirectoryName(Dos)
        Return Dos
    End Function

    Public Function Emprise(ByVal Frm As Form) As Rectangle
        Dim Rct As Rectangle, Brd As Integer
        With Frm
            If .FormBorderStyle.ToString.Contains("Fixed") Then
                Brd = SystemInformation.SizingBorderWidth
            Else
                Brd = 0
            End If
            Rct.X = .Left - Brd
            Rct.Y = .Top - Brd
            Rct.Width = .Width + 2 * Brd
            Rct.Height = .Height + 2 * Brd
        End With
        Return Rct
    End Function

End Module


que j'adjoins systématiquement à tous mes programmes, et que j'améliore selon mes besoins.


Cordialement.


Étant illettré, je signe d'une croix : ×
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 avril 2013 à 11:08
Oui, sauf que Chr est aussi une fonction du même espace de nom que je voudrais éviter.

En fait, je bute sur les syntaxes du genre de celle-ci que je n'arrive pas à mettre au point
Private Const myCrLf As String = New String(Char({&HD, &HA}))
0
Bonjour ucfoutu.

Chr() est aussi frappé d'ostracisme en vb.net, au motif qu'il appartient à l'espace de noms .VisualBasic

Cordialement.


Étant illettré, je signe d'une croix : ×
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 avril 2013 à 11:20
Ben ... Ce que je voulais mettre en exergue, c'était le principe et non la syntaxe, qu'il faudrait transposer pour VB.Net, bien évidemment ...
Et ce devrait donc donner :
Convert.ToChar(10 + Convert.ToChar(13)
entre autres possibilités.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 avril 2013 à 11:48
Oui dans le cas où l'on fabrique une fonction ou une déclaration.
Je voulais trouver quelque chose qui reste au niveau des constantes (Const) car j'ai d'autres constantes que je peux initialiser avec ces valeurs.

Si je crée une fonction ou une déclaration comme celle-ci
Friend vbCrLf As String = Convert.ToChar(&HA) & Convert.ToChar(&HD)

je ne pourrais pas, par exemple, écrire ceci :
Private Const cstSeparatorToSearch As String = vbCrLf
puisqu'il me dira qu'"une expression constante est requise"
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 avril 2013 à 11:58
Plus généralement, si je veux créer une constante contenant la lettre A, je peux écrire
Friend Const maConst As String = "A"

Comment faire pour écrire une constante d'après son code ASCII, par exemple 9 (pour Tab) ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 avril 2013 à 13:07
Oui, je vais me résigner à utiliser des variables plutôt que des constantes, mais c'est quand même bizarre qu'ils aient prévu le NewLine et qu'aucune autre constante 'classique' n'existe (Tab, c'est quand même vachement courant, non ?).

Merci pour vos idées.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 avril 2013 à 13:16
Bonjour,

Peut être :
http://msdn.microsoft.com/fr-fr/library/microsoft.visualbasic.controlchars.tab%28v=vs.80%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
Mais ça reste dans l'espace de nom Microsoft.VisualBasic.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
9 avril 2013 à 13:21
Bonjour à tous,

J'ai une solution et un problème en même temps

Solution:
Friend Const maConst As String = DirectCast(&HA, Char) & DirectCast(&HD, Char)

Le problème est que le compilateur pète un cable est remonte des erreurs de compilation du type impossible de convertir un Integer en char.

Le plus beau dans l'histoire, c'est que si vous exécutez votre code sans tenir compte des erreurs, la constante fonctionne... No comment...

Pourtant je me suis basé sur la fonction Convert.ToChar() qui fait bien ceci
Public Shared Function ToChar(ByVal value As Integer) As Char
    ...
    Return DirectCast(value, Char)
End Function


Donc ils ont bien fait DirectCast(value, Char) avec value en integer
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
9 avril 2013 à 15:19
J'ai dit une connerie.

Mon exemple ne fonctionne pas. Forcement il m'exécutait mon dernier code compilé correctement... XD

Il va falloir se mettre au C# car les chanceux peuvent faire:
const char monChar = (char)(0xA);

Qui, me semblait pourtant être l'équivalent de
const monChar as Char = DirectCast(&HA, Char)


Ils ont aussi la chance du pouvoir faire
const string monString = "\u0000D\u0000A";


Bref... pas de bol pour le VB
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 avril 2013 à 16:24
Bonjour,

(char)(0xA)
Serait plus proche de : CType(&ha,char)
Car DirectCast ne peut agir que si il s'agit directement d'un type dans l'héritage, CType par contre tente d'adapter
DirectCast(MaVar, Short) échouera si MaVar est de type Integer, mais avec CType, ça passera (tant que la variable ne dépasse pas les limites du type cible).

0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
9 avril 2013 à 17:05
(char)(0xA)
Serait plus proche de : CType(&ha,char)


tout a fait d'accord.

Ce qui est problématique en VB.NET c'est que CType (et DirectCast aussi d'ailleur) sont controlés à la compilation avec une erreur si l'objet casté ne provient pas d'une relation d'héritage ou d'implémentation.
Donc
Dim monChar As Char = CType(&HA, Char)

Provoque une erreur de compilation alors qu'en C#
char monChar = (Char)(0xA);

n'en provoque pas.

C'est ragent. Il il a du favoritisme... =D

J'ai lancé la meute MSDN sur le pourquoi du comment de cette différence. Et pour le moment disons que la réponse à l'air d'être "tampi pour le VB".

Il faudra donc malheureusement se contenter de variables ou utiliser "Microsoft.VisualBasic" pour le moment.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 avril 2013 à 18:46
Et moi qui croyait être mauvais au point de ne pas trouver de solution à une si petite question, me voilà un peu rassuré.

Merci Olivier et Nicolas pour ce complément d’enquête.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 avril 2013 à 19:04
NB : A ma grande surprise, j'ai essayé ceci :
Friend Const CodesSources As String = "   " ' <--- Dedans, c'est une Tab

Et bien, ça marche.
Decimal.op_Implicit(CodesSources.Chars(0))
renvoie bien 9
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
9 avril 2013 à 19:11
De rien Jack.

Par contre je viens de me faire luncher sur le forum MSDN à propos du fameux namespace "Microsoft.VisualBasic".

Je me permet donc d'utiliser ce post, vu que vous en parlez, pour revenir sur le conseil de ne pas l'utiliser (que j'avoue avoir moi-même prodigué dans un autre post).

Il semblerait bien qu'il est absolument inutile de le désactiver.

Je vous renvoi vers un autre post qui en parle longuement avec des liens très intéressant fournis dans la réponse accepté. (par contre full English désolé)
On y explique clairement la différence entre
"Microsoft.VisualBasic" et "Microsoft.VisualBasic.Compatibility".

J'imagine qu'Henry va bondir de sa chaise en lisant ça. D'ailleurs j'aimerai avoir son avis sur le sujet car pour le moment je reste quand même méfiant.

Désolé Jack si vous vous dites "une fois ils me disent de l'enlever, après ils me disent de le mettre". Je vous avoue que pour le moment c'est ce que je me dis aussi...

Mais du coup c'est open barre pour vbCrLf et vbNewLine
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 avril 2013 à 19:35
Bonjour,

Concernant l'espace de nom Microsoft.VisualBasic, je conseille toujours de le désactiver de l'import automatique, car les fonctions que l'on y trouve sont souvent des stubs d'autres fonctions, parfois au mépris d'une certaine flexibilité (Asc, Chr, Mid, ... qui ne prennent pas en compte l'encodage des caractères par exemple) qui sont trop facilement accessible.

Mais je n'interdit pas son utilisation (il m'arrive encore de l'utiliser, par exemple, pour un simple InputBox), juste que son appel soit explicite.

Concernant le VbCrLf et VbNewLine, je trouve que Environment.NewLine est plus claire car il prend en compte le retour chariot de la plateforme (permet une compatibilité Mono par exemple).

Je dirais pour faire simple, tant que l'on peut éviter Microsoft.VisualBasic, on évite.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
10 avril 2013 à 01:28
Oui, je suis d'accord avec Nicolas en ce qui concerne la trop facile possibilité d'utiliser les vieilles fonctions de VB6.
En me consacrant à mon premier projet .Net où la gestion de chaine est quasi permanente, j'ai pu doser de l'étendue des gestions possibles des chaines et je comprends que les fonctions VB6 soient désuètes à présent.

Alors disons que, même si on ne supprime pas cette référence, il peut être intéressant de la supprimer, puis de jeter un oeil sur le nombre de fonctions lui appartenant au travers des erreurs ou avertissements que cette suppression va générer et de juger, alors, si ces choix sont opportuns.
Méthode qui m'a amené à remettre en cause les constantes vbCrLf et vbTab.

Je dois dire que ma précédente approche de .Net avait été entachée d'un IDE (2005) peu convivial et rétrograde par rapport au mode SDI de VB6 (*) et que 2010 est beaucoup plus complet et ergonomique, et que cette évolution est très riche en fonctions dédiées. Je crois que je vais finir par aimer.

(*) SDI : chaque forme graphique ou page de code a sa propre fenêtre, l'IDE se limitant alors à une barre étroite (menu + barre d'outils et barre des composants).
Ça sert de gueuler auprès de MS quand on a les arguments !
Bataille en cours : Les fenêtres d'option resizables. Deux ans que je geule; on va bien finir par les avoir.
0
Rejoignez-nous