Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Nouveau Membre du Club
    Inscrit en
    octobre 2004
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 94
    Points : 34
    Points
    34

    Par défaut Premier caractère en majuscule

    Bonjour à tous,

    je cherche simplement à mettre le premier caractère d'un AnsiString en majuscule.

    J'affiche la date avec le code :
    Code :
    String().sprintf("%s, Semaine %d, Jour %d", FormatDateTime("dddd d mmmm yyyy", Now()), WeekOf(Now()), DayOfTheYear(Now()))
    Cela m'affiche bien la date mais j'aurais voulus afficher : Lundi 7 mai... et non lundi 7 mai...

    Merci beaucoup

  2. #2
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 073
    Points : 14 301
    Points
    14 301

    Par défaut

    une solution permanente : DateStringFirstCharUpCase

    Pour les AnsiString avec variable temporaire pour le UpCase de Delphi (voir si équivalent C) comme ceci

    Code :
    1
    2
      AnsiString Chaine = Chaine.sprintf("%s, Semaine %d, Jour %d", FormatDateTime("dddd d mmmm yyyy", Now()), WeekOf(Now()), DayOfTheYear(Now()));
      String Chaine2 = Chaine;
    Code :
    1
    2
    3
      ShowMessage(Chaine);
      Chaine[1] = UpCase(Chaine[1]);
      ShowMessage(Chaine);
    et la version Warrior :

    Code :
    1
    2
    3
      ShowMessage(Chaine2);
      UpAnsiChar(Chaine2[1]); // ou // UpAnsiChar(Chaine2.c_str()[0]);
      ShowMessage(Chaine2);
    et la version Barbare :

    Code :
      ShowMessage(UpCaseFirstLetter(String().sprintf("%s, Semaine %d, Jour %d", FormatDateTime("dddd d mmmm yyyy", Now()), WeekOf(Now()), DayOfTheYear(Now()))));

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    // #pragma inline // Active la compilation ASM !
    void __fastcall UpAnsiChar(char &c)
    {
      asm
      {
               PUSH EBX
               MOV BL, [EAX]
     
               CMP     BL,'a'
               JB      @@exit
               CMP     BL,'z'
               JA      @@exit
               ADD     BL,'A' - 'a'
     
               MOV [EAX], BL
               POP EBX
       @@exit:
      }
    }
    Code :
    1
    2
    3
    4
    5
    AnsiString& UpCaseFirstLetter(AnsiString &S)
    {
      UpAnsiChar(S[1]);
      return S;
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Nouveau Membre du Club
    Inscrit en
    octobre 2004
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 94
    Points : 34
    Points
    34

    Par défaut

    j'aime bien la version barbare ...

    Mais sous builder c'est pas tout à fait la même fonction :

    Code :
    ShowMessage(UpCaseFirst(String().sprintf("%s, Semaine %d, Jour %d", FormatDateTime("dddd d mmmm yyyy", Now()), WeekOf(Now()), DayOfTheYear(Now()))));
    Merci beaucoup je ne connaissais pas ces fonctions.

    Merci encore

  4. #4
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 073
    Points : 14 301
    Points
    14 301

    Par défaut

    UpCaseFirst ce n'est pas vraiment du C++Builder en réalité mais une fonction Indy
    J'évite de les utiliser directement, ils ont la manie de les changer sans préavis aussi bien en fonctionnalité que l'emplacement !

    UpCaseFirst is a String function that returns a string with the first letter capitalized. All other letters in the string AStr are converted to lower case.
    Attention, as-tu remarqué que S de Semaine et J de Jour sont passé en minuscule car IdGlobalProtocols::UpCaseFirst effectue d'abord un LowerCase de toute la Chaine puis UpCase du 1er caracètre

    Citation Envoyé par LoicH Voir le message
    Merci beaucoup je ne connaissais pas ces fonctions.
    Lesquels ? UpCaseFirstLetter et UpAnsiChar ? Normal, j'en suis l'auteur !

    UpCaseFirstLetter n'est pas une fonction standard, c'est du code que je viens juste d'écrire par curiosité en traduisant mes codes Delphi
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    Par défaut

    ah ShaiLeTroll, tu me plonges dans la nostalgie avec ton code en assembleur.

    Question: "Monsieur, c'est quoi un pointeur?

    Réponse en 1992:

    C'est de l'adressage indirect, tu te rappelles quand on faisait ça en assembleur?
    Bin EAX, c'est un pointeur.

    Réponse en 2012:

    C'est un concept abstrait qu'on préfère laisser tomber dans bien des langages.


  6. #6
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 073
    Points : 14 301
    Points
    14 301

    Par défaut

    Figure-toi que j'avais écrit ce code à l'école, et je n'ai pas souvenir de UpCase en D4, en tout pas de LowCase c'est sur, ça n'existe pas !
    Du coup, j'ai fait mes propres UpCase et LowCase avec un Char en paramètre in-out (var sous Delphi, & sous C++)
    Un code qui date de 2000 pour mon Editeur de Base de Registre (qui fut mon projet de 1er année de DUT)

    L'assembleur, je l'évite en général, sauf dans les codes de démos pour le forum comme Conversion hexa avec nombre de byte variables, je n'ai pas dépassé la Page de 88 de Assembleur facile par Philippe Mercier

    Mais, il y a des fonctions comme BSWAP, BT qui sont merveilleuses mais sans équivalent en code de haut niveau en Delphi (cela existe peut-être en C++ mais je ne connais pas assez)
    Pour BT,
    en Delphi, un sef of enum et l'on peut arriver à un résultat très similaire
    en C++, un struct avec des int:1 fonctionnera très bien aussi.
    je peste contre des codes (redondant jamais factorisé en plus) utilisant massivement du décalage et des masques, un code très long pas très lisible alors qu'avec une bonne déclaration c'est le compilateur qui nous le faisait à notre place !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    Par défaut

    Fallait pas dire "hexadécimal", tu me redémarres!

    La dernière fois que j'en faisais avec mes étudiants c'était dans les années 90, avec un microcontrôleur 68HC11. Il fallait qu'ils écrivent un "bootstrap loader", soit un programme qui au "reset" attendait qu'on lui transmettre un fichier "hex" (format intel), mettait les code en mémoire, puis exécutait le programme. Fallait que le "bootstap loader" tienne en 256 bytes, alors pas question de faire ça en C!

    Et puis, on a décidé de laisser tomber l'assembleur dans nos cours, trop de matière à voir qu'on disait.

    Avec du recul, je pense que ce fut une mauvaise décision. Je trouve difficile de passer certains concepts sans pouvoir m'appuyer sur une le fonctionnement interne d'un processeur.

    Quand mes étudiants comprenaient le mécanisme d'appel de sousroutines avec variables locales sur la pile, la récursivité, je te passais ça en deux temps, trois mouvements, j'te dis.

    Bon ça fait la nostalgie Guyt (mon vrai nom), tu commences vraiment à faire vieux pépé (ahh dans mon temps...)

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •