IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

[TStringGrid] Contenu d'une cellule sur plusieurs lignes


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 17
    Points : 13
    Points
    13
    Par défaut [TStringGrid] Contenu d'une cellule sur plusieurs lignes
    Je cherche une solution pour écrire le contenu d'une cellule d'un StringGrid sur plusieurs lignes (2) en Delphi 6 PE.
    J'ai regardé dans la FAQ et aussi ce sujet, mais je n'arrive pas au résultat escompté.

    Je voudrais écrire le contenu de la première ligne de mon tableau sur 2 lignes, sachant que ce contenu sera écrit par l'application et non par l'utilisateur. Le soucis que j'ai en utilisant le code fournis sur le forum est que je n'arrive pas à imposer l'emplacement du retour à la ligne dans la chaine. D'autre part, je n'arrive pas à formatter ma cellule verticalement (contenu sur 2 lignes) et horizontalement (contenu centré ou aligné à gauche) en même temps.

    Ci joint un extrait de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
      procedure WriteText(StringGrid: TStringGrid; ACanvas: TCanvas; const ARect: TRect;
        const Text: string; Format: Word);
      const
        DX = 2;
        DY = 2;
      var
        S: array[0..255] of Char;
      begin
        with Stringgrid, ACanvas, ARect do
        begin
          case Format of
            DT_LEFT: ExtTextOut(Handle, Left + DX, Top + DY,
                ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Text), Length(Text), nil);
            DT_RIGHT: ExtTextOut(Handle, Right - TextWidth(Text) - 3, Top + DY,
                ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Text),
                Length(Text), nil);
            DT_CENTER: ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2,
                Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,
                StrPCopy(S, Text), Length(Text), nil);
          end;
        end;
      end;
     
      procedure Display(StringGrid: TStringGrid; const S: string; Alignment: TAlignment);
      const
        Formats: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
      begin
        WriteText(StringGrid, StringGrid.Canvas, Rect, S, Formats[Alignment]);
      end;
     
    // Définit les conditions d'alignement pour chaque colonne
    begin
      // Ecrit le contenu des cellules d'entête sur 2 lignes
      with StringGrid2, Canvas do
      if ACol in [1..4] then
        DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect, DT_NOPREFIX or DT_WORDBREAK );
      // Les colonnes 0, 2, 3 et 4 ont leur contenu centrée
      if ACol in [0, 2, 3, 4] then
        Display(StringGrid2, StringGrid2.Cells[ACol, ARow], taCenter);
      // La colonne 1 a son contenu aligné à gauche
      if ACol in [1] then
        Display(StringGrid2, StringGrid2.Cells[ACol, ARow], taLeftJustify);
    end;
    Merci d'avance pour l'aide.

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 131
    Points : 106
    Points
    106
    Par défaut
    pour le retour a la ligne tu peux peut-etre utiliser #13 qui est le code hexa de la touche Entrée, tu concatene tout simplement le caractère dans ta chaine.

    Kevin

  3. #3
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Dans la démo de Delphp, je dessine ma propre grille de données. J'utilise une TDrawGrid, mais c'est pareil avec une TStringGrid... J'ai justement prévu de pouvoir justifier le contenu des cellules, ainsi qu'une fonction de wrapping du texte (mis sur plusieurs lignes). Par défaut, le texte est centré dans la cellule, mais si la largeur du texte dépasse la largeur de la cellule, il est alors justifié à gauche. Ensuite, concernant le wrapping, c'est toute la ligne qui double de hauteur et pas seulement la cellule...
    Voici une capture du résultat :



    Voici le code qui t'intérresse, si tu as des questions, n'hésite pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
      If (Donnees.Count > 0) And (ARow > 0) And (ACol > 0) Then Begin
     
        { Dessine la cellule et sa bordure }
        InflateRect(R, Integer(ACol < DrawGrid1.ColCount), 1);
        DrawGrid1.Canvas.Rectangle(R);
     
        { Ajuste le position du texte dans la cellule }
        index := ((ARow - 1) * (DrawGrid1.ColCount - 1)) + (ACol - 1);
        stdata := Donnees[index];
        sw := DrawGrid1.Canvas.TextWidth(stdata);
        sh := DrawGrid1.Canvas.TextHeight(stdata);
        R.Top := R.Top + Max(Round(sh * CoefMarge) Div 2, 0);
        If (JustifS.Left = JustifL.Left) Then R.Left := R.Left + 2;
        If (JustifS.Left = JustifR.Left) Then R.Right := R.Right - 1;
        With R Do R := Rect(Left + 1, Top + 1, Right - 1, Bottom - 1);
     
        { Affichage du texte. Gère les sauts de lignes et wordwrap }
        mode := DT_NOPREFIX;
        If (CWordtype.Checked) Then mode := mode Or DT_EDITCONTROL;
        If (CWordwrap.Checked) Then mode := mode Or DT_WORDBREAK;
        If (JustifS.Left = JustifR.Left) Then mode := mode Or DT_RIGHT Else
        If (JustifS.Left = JustifC.Left) Then mode := mode Or DT_CENTER;
        DrawText(DrawGrid1.Canvas.Handle, PChar(stdata), -1, R, mode);
      End;
    Les sources de la démo

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    @kevinou55
    Désolé, j'avais essayé avant de poster, cette méthode ne marche pas (ou alors je n'ai pas je n'ai pas essayé la bonne manière). Si tu as la bonne méthode, merci de m'en faire part.

    @Sub0
    Je vais me pencher sur ton code plus en avant.

    A tous les deux, merci

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 131
    Points : 106
    Points
    106
    Par défaut
    non non je n'avais pas testé. je pensais que ca pouvait marcher...
    qui ne tente rien n'a rien...
    J'espere que le code de Sub0 t'aideras plus

Discussions similaires

  1. Répartir le contenu d'une cellule sur plusieurs lignes
    Par Sandrineboubou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/02/2019, 09h45
  2. Séparer le contenu d'une cellule en plusieurs lignes
    Par CrasherSEP dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/06/2014, 13h32
  3. [XL-2003] Répartir le contenu d'une cellule sur plusieurs lignes
    Par Leehan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/10/2012, 15h06
  4. [XL-2007] Séparer le contenu d'une cellule en plusieurs lignes
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/12/2011, 17h36
  5. [TStringGrid] Une cellule sur plusieurs lignes.
    Par Caine dans le forum Delphi
    Réponses: 15
    Dernier message: 28/03/2007, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo