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

Lazarus Pascal Discussion :

StringGrid : ajustement automatique de RowHeights sur des contenus multilignes [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut StringGrid : ajustement automatique de RowHeights sur des contenus multilignes
    Bonjour,

    Je cherche à ajuster automatiquement la hauteur et le contenu des cellules d'une colonne de mes StringGrids en fonction de la largeur de celle-ci (la colonne), les contenus des cellules étant multilignes (moins de 255 caractères). Pour l"instant, j'ai une "piste" qui fonctionne sous Win et Nux en utilisant des TMemos "externes" (cf petite vidéo).

    C'est correct pour une cellule de la colonne, mais comment généraliser cette solution à l'ensemble des lignes ? Cela serait assez facile si FPC permettait les indirections. Mais tel ne semble pas être le cas. J'ai déjà étudié un peu la question aux dernières grandes vacances et cela me semble être une vraie faiblesse du Pascal.

    Première solution "idéale" : je voudrais me passer des TMemos. Directement avec les TCanvas ? Cela semble faisable sous Windows -on trouve des codes en Delphi- mais le code ne me semble pas transposable sous Nux de prime abord. Et évidemment, cela ne m'intéresse pas si je n'ai pas le code équivalent en Nux.

    Deuxième solution : je suis en train de me demander s'il est possible
    1. d'intégrer des TMemos à des cellules. Je pense que c'est jouable puisque je l'ai fait avec des ProgressBars pour threader des ftp...à la grande différence près que je connaissais le nombre de lignes (8 threads max en //).. Mais comment créer n TMemos différents, n n'étant pas connu à l'avance et surtout comment les créer puis les traiter sans indirections ?
    2. En supposant ce premier problème réglé, comment gère-t-on les interactions ? Mon source actuel me permet de calculer et d'adapter la hauteur nécessaire du TMemo à partir d'une largeur donnée [celle de la colonne], de la fonte (celle de la colonne) et d'un contenu Texte (celle de la cellule). Le TMemo fait alors le "WordWrap" puis renvoie son image (ie la disposition des mots) à la cellule. Mais comment et à quel moment communique-t-il ces renseignements (Taille et "disposition") à la cellule qui le contient ? OnDrawCell ?

    A moins qu'il n'y ait beaucoup plus simple ?
    Merci.
    Cordialement. Gilles
    Dernière modification par Invité ; 13/07/2011 à 18h24.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je me réponds : oui, il y a beaucoup plus simple, sans "sortir" de la StringGrid :
    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
    procedure TForm1.SG1DrawCell(Sender: TObject; aCol, aRow: Integer;
      aRect: TRect; aState: TGridDrawState);
    //Uses  LCLIntf {DrawText}, LCLType {DT_CALCRECT or DT_WORDBREAK},
    var
      bRect : TRect;
      sTmp  : String;
    begin
    if Arow > 0 then
      if Acol = 1 then //C'est dans mon cas le N° de ma colonne multiligne
       with (Sender as TStringGrid) do begin
        sTmp := Cells[aCol,Arow];
        Canvas.FillRect(aRect);
        Canvas.FillRect(bRect);
        bRect := aRect;
        DrawText(Canvas.Handle, PChar(sTmp), length(sTmp), bRect,
                 DT_CALCRECT or DT_WORDBREAK);
        if (bRect.Bottom - bRect.Top) > DefaultRowHeight then
         RowHeights[aRow] := bRect.Bottom - bRect.Top;
        DrawText(Canvas.Handle, PChar(sTmp), length(sTmp), aRect, DT_WORDBREAK);
       end;
     end;
    J'ai testé ce code sur la SVN Windows et Linux de ce jour
    - svn co http://svn.freepascal.org/svn/fpc/branches/fixes_2_4
    - svn co http://svn.freepascal.org/svn/lazarus/trunk

    Le principe est le suivant : on crée un TRect temporaire (bRect) en mode DT_CALCRECT or DT_WORDBREAK. Il n'est pas affichable mais on dispose des caractéristiques voulues (grâce à DT_CALCRECT) : on peut récupérer sa hauteur que l'on affecte ensuite par l'intermédiaire de RowHeights[aRow]. Il ne reste plus qu'à afficher le aRect de la même manière que le TRect temporaire mais sans le DT_CALCRECT.

    Cordialement. Gilles

    PS : Ne pas oublier de déclarer la StringGrid en mode multiligne :
    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
    procedure TForm1.FormCreate(Sender: TObject);
    var
      aStyle: TTextStyle;
    begin
    //Modification du style de la StringGrid
       with SG1 as TStringGrid do begin
         aStyle := DefaultTextStyle;
         aStyle.SingleLine := False;
         DefaultTextStyle  := aStyle;
       end;
       SG1.Cells[1,2] := 'Je cherche à ajuster automatiquement la hauteur et le contenu des cellules d''une colonne de mes StringGrids en fonction de la largeur de celle-ci (la colonne), les contenus des cellules étant multilignes.';
       SG1.Cells[1,3] := 'Deuxième solution : je suis en train de me demander s''il est possible'+#13+
    '1. d''intégrer des TMemos à des cellules. Je pense que c''est jouable puisque je l''ai fait avec des ProgressBars pour threader des ftp...'+#13+
    '2. En supposant ce premier problème réglé, comment gère-t-on les interactions ? Mon source actuel me permet de calculer et d''adapter la hauteur nécessaire du TMemo.';
    end;
    J'aurais bien fait une petite vidéo sous Ubuntu 10.04 mais mon paquet vlc ne fonctionne pas... Bizarre. Si quelqu'un peut me recommander un autre paquet... Merci.
    Dernière modification par Invité ; 14/07/2011 à 18h44.

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

Discussions similaires

  1. Désactiver l'ajustement automatique du texte sur mobile
    Par titipucca1 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 14/06/2014, 14h06
  2. [XL-2010] Filtrer sur des contenus de cellules en vba
    Par drabmol dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/03/2013, 13h38
  3. Réponses: 4
    Dernier message: 09/05/2012, 10h24
  4. [AC-2007] Ajuster automatiquement une impression sur 1 page
    Par Lionel69260 dans le forum IHM
    Réponses: 1
    Dernier message: 19/10/2010, 21h09
  5. Réponses: 2
    Dernier message: 24/02/2010, 09h26

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