VbCrLf ou vbTab en .Net ? [Résolu]

cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 10:37 - Dernière réponse : cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention
- 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)
Afficher la suite 

20 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 avril 2013 à 12:33
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 9 avril 2013 à 12:50
+3
Utile
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
---
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 avril 2013 à 10:47
0
Utile
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.
Commenter la réponse de ucfoutu
0
Utile
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 : ×
Commenter la réponse de Zermelo
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 11:08
0
Utile
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}))
Commenter la réponse de cs_Jack
0
Utile
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 : ×
Commenter la réponse de Zermelo
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 avril 2013 à 11:20
0
Utile
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.
Commenter la réponse de ucfoutu
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 11:48
0
Utile
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"
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 11:58
0
Utile
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) ?
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 13:07
0
Utile
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.
Commenter la réponse de cs_Jack
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 9 avril 2013 à 13:16
0
Utile
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
---
Commenter la réponse de NHenry
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 9 avril 2013 à 13:21
0
Utile
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
Commenter la réponse de foliv57
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 9 avril 2013 à 15:19
0
Utile
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
Commenter la réponse de foliv57
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 9 avril 2013 à 16:24
0
Utile
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).

Commenter la réponse de NHenry
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 9 avril 2013 à 17:05
0
Utile
(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.
Commenter la réponse de foliv57
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 18:46
0
Utile
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.
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 9 avril 2013 à 19:04
0
Utile
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
Commenter la réponse de cs_Jack
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 9 avril 2013 à 19:11
0
Utile
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
Commenter la réponse de foliv57
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 9 avril 2013 à 19:35
0
Utile
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
---
Commenter la réponse de NHenry
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 10 avril 2013 à 01:28
0
Utile
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.
Commenter la réponse de cs_Jack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.