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

Composants VCL Delphi Discussion :

Taille ListBoxItem.ItemData.Detail


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Taille ListBoxItem.ItemData.Detail
    Bonjour !
    Je réalise donc un lecteur RSS avec Delphi pour mon projet d'ISN et je rencontre un petit problème. Pour la petite histoire, ce lecteur est lié au flux du Lycée, et permettra donc aux élèves d’accéder à leur devoirs depuis leur smartphone. J'utilise donc une boucle qui, pour chaque article, crée un item dans un liste. Le "texte" de la liste correspond à la matière et le professeur concerné, et j'utilise l'attribut "détail" pour le corps du message.



    Ce screen illustre l'application :


    Nom : CapturePEz5p.jpg
Affichages : 482
Taille : 98,8 Ko




    Mon problème consiste donc en l'affichage du ListBoxItem.ItemData.Detail qui est coupé. Même en augmentant la taille de la "fenêtre", la totalité du texte n'est pas restituée :


    Nom : CapturefFXcW.jpg
Affichages : 573
Taille : 65,6 Ko



    Au début je pensais que :
    1. Le texte reviendrait à la ligne en fonction de la taille de l'écran
    2. Tout le texte d'origine serait restitué


    Or ce n'est pas le cas. Serait-il donc possible, par je ne sais quelle manipulation, de remédier à mon problème ?
    Sinon, pouvez-vous me suggérer un autre mode d'affichage que les Lisbox ?

    J'attend vos réponses avec impatience ! Merci d'avance !

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut une réponse possible
    Peut être passer pour chaque objet TListBoxItem la propriété WordWrap à true

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Malheureusement, ça ne change rien :/

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Afficher un "hint" contenant le texte au complet si la ligne est plus longue que x caractères.

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut Autre voie
    Citation Envoyé par Kamel38 Voir le message
    Malheureusement, ça ne change rien :/
    Peut tu nous préciser quelle version de Delphi tu utilises et quelle cible tu vises. J'ai testé sur XE5 Windows 32 et cela avait l'air de marcher

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Une erreur s'affiche lorsque je passe la propriété à true : [dcc32 Erreur] Unit1.pas(119): E2233 La propriété 'WordWrap' est inaccessible ici

    J'utilise Delphi XE7 (W.64), et il s'agit d'une app Android.

    Concernant le Hint, sgmsg, je ne pense pas qu'il soit approprié pour la plateforme ciblé :/

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Serait-il possible d'utiliser la fonction WrapText(chaine,X) ? Elle permet de faire revenir à la ligne à partir du Xième caractère. Mais je ne sais pas si cela fonctionnerait car comme il s'agit d'une App, elle est destinée à plusieurs tailles d'écran différents...

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 1
    Points : 4
    Points
    4
    Par défaut
    J'ai également répondu à cette même question sur Stack Overflow (lien), mais :
    - je ne suis pas sûr que Kamel38 reçoive la notification
    - comme je suis avant tout francophone, autant la poster ici en français, ce qui pourrait servir à d'autres

    Durant l'exécution de l'appli, les ListBoxItems ont un style déjà calculé et appliqué : aListBoxItem.StyledSettings.
    Pour le changer à ce moment-là, on doit d'abord retirer la propriété visée de la liste des StyledSettings.

    La propriété WordWrap est définie dans TStyledSetting.Other.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Pour la changer, on retire la définition de TStyledSetting.Other: 
    aListboxItem.StyledSettings := aListboxItem.StyledSettings - [TStyledSetting.Other];
    //Puis on applique notre valeur à cette propriété:
    aListboxItem.WordWrap := True;
    Pour une correspondance entre les constantes TStyledSetting et les propriétés TTextSettings voir la doc Delphi.

    A noter, la propriété ListBox.Items[i] donne accès au contenu de l'objet, pas l'objet lui-même.
    Pour manipuler un ListboxItem et ses propriétés on doit utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aListboxItem := theListBox.ListItems[i];
    //ou
    aListboxItem := theListBox.ItemByIndex(i);
    Les deux donnent le même résultat, je ne sais pas où se situe la différence.

    Une fois que le texte revient à la ligne comme on le souhaite, on doit redimensionner le ListBoxItem pour voir le texte en entier.
    On peut le faire dans l'évènement OnApplyStyleLookup, en utilisant un TTextLayout :
    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
    uses 
    ... ,FMX.TextLayout;
     
    procedure TfrmForm1.ListBoxItem1ApplyStyleLookup(Sender: TObject);
    var
      myLayout: TTextLayout;
      i: integer;
      aPoint: TPointF;
    begin
     
      myLayout := TTextLayoutManager.DefaultTextLayout.Create;
      myLayout.BeginUpdate;
     
      // paramétrer layout MaxSize
      aPoint.X := ListBoxItem1.Width;
      aPoint.Y := TfrmForm1.Height;
      myLayout.MaxSize := aPoint;
     
      myLayout.Text := ListBoxItem1.Text;
      myLayout.WordWrap := True ;
      myLayout.Font := ListBoxItem1.Font;
      myLayout.HorizontalAlign := ListBoxItem1.TextSettings.HorzAlign;
      myLayout.VerticalAlign := ListBoxItem1.TextSettings.VertAlign;
      myLayout.Padding := ListBoxItem1.Padding;
      // paramétrer les propriétés nécessaires
     
      myLayout.EndUpdate;
     
      ListBoxItem1.Height := Trunc(myLayout.TextHeight) + 3 ; // ajuster la taille pour bien voir le texte en entier
     
    end;
    A noter : MaxSize est limitante. Si myLayout.TextHeight est supérieur à myLayout.MaxSize.Y c'est myLayout.MaxSize.Y qui sera pris en compte, quel que soit la valeur de TextHeight.
    Il faut donc prévoir un aPoint.Y suffisamment grand pour ne pas être limité.

    N.B.: Il peut être nécessaire de redimensionner le texte avant d'effectuer le calcul du Layout.
    Dans mon cas (Samsung Note 2), la lecture de la propriété ListBoxItem1.Font.Size = 14 mais le rendu à l'écran est 18.
    Pour ce faire on peut appliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ListBoxItem1.StyledSettings := ListBoxItem1.StyledSettings - [TStyledSetting.Size] ;
    ListBoxItem1.Font.Size := ListBoxItem1.Font.Size ;
    Il est également possible d'utiliser un composant TListView à la place d'un TListBox.
    TListView est plus à l'aise avec les grandes listes d'éléments et la propriété WordWrap est accessible dans l'inspecteur d'objets.
    ListView1 > ItemAppearanceObjects > ItemObjects > Text > WordWrap

Discussions similaires

  1. Connaitre la taille de la RAM
    Par dway dans le forum Assembleur
    Réponses: 23
    Dernier message: 15/09/2004, 10h05
  2. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  3. Réponses: 3
    Dernier message: 22/07/2002, 14h19
  4. taille du texte dans un viewport
    Par pitounette dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/07/2002, 12h06
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

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