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 :

Modifier des propriétés d'objets visuels créés dynamiquement [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut Modifier des propriétés d'objets visuels créés dynamiquement
    Bonjour,

    je créé dynamiquement un certain nombre de TMemo dans une ScrollBox, et tout se passe bien.
    Ensuite je veux changer la taille du texte, par exemple, et je fais comme ça sur l'événement OnCloseUp d'un comboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i := 0 to compteur2memos -1 do
      if (sb4memos.Controls[i] is TMemo) then 
         (sb4memos.Controls[i] as TMemo).Font.Size := StrToInt(ComboSize.Text);
    Mais je ne vois rien changer.

    À l'heure actuelle et pour simplifier le troubleshooting, je ne crée qu'un seul TMemo donc les trois lignes ci-dessus ne devraient pas se faire des nœuds, et pourtant, il doit bien y avoir une embrouille quelque part...

    Au tout début, j'avais commencé avec une procédure dédiée (parce qu'il y a d'autres paramètres à adapter), mais on dirait que le TMemo que je passe à la proc n'est pas transmis, c'est en tout cas ce que je peux constater en pas-à-pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.AdapteHauteurMemo(FontName: string; Sender: TObject);
    begin
      if FontName = '' then FontName := (Sender as TMemo).Font.Name; // passe un memo de base, on dirait (font Arial)
    end;
    L'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i := 0 to compteur2memos -1 do
      if (sb4memos.Controls[i] is TMemo) then 
        AdapteHauteurMemo((sb4memos.Controls[i] as TMemo).Font.Name, sb4memos.Controls[i]);
    J'en suis là et j'y tourne en rond.
    Merci pour vos pistes,

  2. #2
    Membre émérite

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Par défaut
    Il me semble que si tu veux voir les changements dans un texte déjà affiché dans le memo tu dois le recharger en entier ou faire un truc du genre refresh.

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Yop !
    Citation Envoyé par mm_71 Voir le message
    ou faire un truc du genre refresh.
    J'ai rajouté des .Update par ci par là sans aucun effet...

  4. #4
    Membre émérite

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Par défaut
    J'ai rajouté des .Update par ci par là sans aucun effet...
    Difficile de répondre sans avoir le code complet mais si tu fais un truc du genre après avoir changé la taille de la police:

    memo.clear
    memo.recharger le texte

    ça fait quoi ?

    Edit: ERREUR Pas besoin de rafraîchir quoique ce soit.

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Citation Envoyé par mm_71 Voir le message
    Difficile de répondre sans avoir le code complet mais si tu fais un truc du genre après avoir changé la taille de la police:

    memo.clear
    memo.recharger le texte

    ça fait quoi ?
    Rien.

    Comme je le disais dans mon 1er post (// passe un memo de base, on dirait (font Arial)), on dirait que les mémos créés ne sont pas pris en compte, puisque lorsque je mets la souris sur Fontname en pas-à-pas après exécution de la ligne (point d'arrêt sur ligne suivante), ça m'affiche Arial alors qu'il y a autre chose, j'en suis sûr,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure TForm1.AdapteHauteurMemo(FontName: string; aMemo: TObject);
    begin
      if FontName = '' then FontName := (aMemo as TMemo).Font.Name; // passe un memo de base, on dirait (font Arial)
    Appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.ComboSizeCloseUp(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to compteur2memos -1 do
        if (sb4memos.Controls[i] is TMemo) then begin
          AdapteHauteurMemo((sb4memos.Controls[i] as TMemo).Font.Name, sb4memos.Controls[i]);
    Je ne mets pas plus de code car ça ne présente aucun intérêt, pas la peine d'embrouiller,

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to compteur2memos -1 do
      if (sb4memos.Controls[i] is TMemo) then
    Soit sb4memos est une ScrollBox qui ne contient que des Memo dont on lui a attribué la parenté (pour les afficher) [et la possession (je ne sais pas si le Parent d'un Memo est automatiquement attribué comme Owner) ?], auquel cas balayer ses Controls ne doit retrouver que des Memo...

    Soit cette ScrollBox contient d'autres types de Controls, et pour peu qu'ils aient des indices supérieurs à compteur2memos -1, la boucle ne les trouvera pas, sauf à aller jusqu'à ControlCount !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Bougez pas, je crois que j'ai trouvé, il y a un autre composant TMemo planqué dans un coin et que j'ai complètement zappé, tests en cours, je reviens !

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    C'était bien ça, saleté de machin que je mettais à Visible := False et qu'ensuite, obnubilé par le code en cours, j'ai complètement oublié...

    Chuis qu'un !

    Bon, faut dire aussi que je vis des trucs... Au run un memo m'affiche du texte sur 1 ligne quand il lui en faudrait 2. Un coup de Combobox pour changer la taille SANS la changer et c'est bon, il se redessine sur 2 lignes.
    Sauf que la procédure de redessin est aussi appelée lors de la création du mémo, un truc à bouffer son chapeau

    Merci à tous et y a pas besoin d'update pour que ça fonctionne (sauf cette histoire de nombre de lignes, nombre validé par un ShowMessage mais pas pris en compte comme je l'ai décrit)...

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Allez, une belle image valant mieux qu'un long discours, hop ! :
    (ne pas tenir compte de la zone en haut appelée "Dossiers chargés" qui me sert à autre chose pour le moment)

    Nom : img1.png
Affichages : 468
Taille : 36,2 Ko

    en 1 je clique sur le dossier contenant des fichiers .ttf et .otf (1 de chaque pour le moment), ils s'affichent en 2, et les fonts incluses sont chargées par AddFontResource et affichées en 3 dans autant de TMemo créés dynamiquement.

    Sauf que dans le mémo du haut la police s'appelle "Segoe Print" et on ne voit pas le mot "Print"
    Alors je clique en 4 sur la flèche du Combo pour le dérouler et je reclique pour le refermer, ça génère un événement CloseUp et bingo !, le 1er mémo s'est agrandi en 5.

    Nom : img2.png
Affichages : 481
Taille : 36,7 Ko

    La solution que j'ai trouvée consiste à ne pas appeler AdapteHauteurMemo dans la boucle de création des mémos mais plutôt après, et plutôt ComboSizeCloseUp (qui va appeler la proc AHM).
    Et là c'est tout bon.
    C'est magique l'informatique...

    Bon, faut encore que j'enlève la bordure des mémos, bien pratique pour voir où on campe !

    Merci encore, bonne soirée,

  10. #10
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Bonsoir,
    je sais que t'as coché résolu mais c'est drôle mais dans ton screen n°1 on voit pas "Print" comme tu le dis . Alors que dans le 2 c'est bon.
    Du coup petite question : Est ce que tu configures la propriété WordWrap des TMemos par hasard ? celle ci ne semble pas être prise en compte sur la capture 1 alors que oui avec la capture 2. Je dis ça car les tailles des polices sont les mêmes ? non ?

    Bonne fin de soirée A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    je sais que t'as coché résolu
    No problémo en ce qui me concerne, on peut discuter jusqu'à la fin des temps,
    Et on va d'ailleurs bientôt discuter du problème de certains fichiers dont la police se charge sans erreur mais est inaccesssible (et donc non affichée dans l'outil : j'ai des copies d'écran, à venir, mais je ne sais pas si je mets ça à la suite ici, ou si j'ouvre une nouvelle discussion, ici, dans Delphi, ou plutôt dans Windows. À suivre...)

    Citation Envoyé par BeanzMaster Voir le message
    Du coup petite question : Est-ce que tu configures la propriété WordWrap des TMemos par hasard ? celle-ci ne semble pas être prise en compte sur la capture 1 alors que oui avec la capture 2.
    WordWrap positionné à True à la création du mémo.

    Citation Envoyé par BeanzMaster Voir le message
    Je dis ça car les tailles des polices sont les mêmes ? non ?
    Yes yes, tous les mémos ont la même taille, c'est pour les comparer rapidement (tiens, d'ailleurs il faudrait que je rajoute un TEdit permettant de changer le texte, l'idée m'en vient maintenant ! Tout sert à tout )

  12. #12
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    No problémo en ce qui me concerne, on peut discuter jusqu'à la fin des temps,
    Et on va d'ailleurs bientôt discuter du problème de certains fichiers dont la police se charge sans erreur mais est inaccesssible (et donc non affichée dans l'outil : j'ai des copies d'écran, à venir, mais je ne sais pas si je mets ça à la suite ici, ou si j'ouvre une nouvelle discussion, ici, dans Delphi, ou plutôt dans Windows. À suivre...)
    C'est drôle, Cela me fait penser que j'ai toujours ce truc avec freetype à régler. Sous Win pas de soucis et sous Linux, le code de la LCL ne fonctionne pas (plus) pour charger certaines polices ttf.
    Mais je suis plutôt dans la rédaction d'aide en ce moment pour ma librairie vectorielle. Verrai tout ça dans très longtemps....

    Citation Envoyé par Jipété Voir le message
    WordWrap positionné à True à la création du mémo.
    Essayes, de le déplacer après l'assignation du texte. Car c'est comme si c'était les paramètres internes pour l'affichage qui ne semblent pas être mis à jour

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Yop !
    Citation Envoyé par BeanzMaster Voir le message
    Sous Win pas de soucis et sous Linux, le code de la LCL ne fonctionne pas (plus) pour charger certaines polices ttf.
    Explique comment tu fais, car il me semble bien que sous Linux il n'y a d'installeur à proprement parler : il suffit de recopier le fichier quelque part dans /usr/share/fonts/ et c'est tout, la police est aussitôt disponible et opérationnelle.
    En tout cas c'est comme ça que je le vis.

    Citation Envoyé par BeanzMaster Voir le message
    Essayes, de le déplacer après l'assignation du texte. Car c'est comme si c'était les paramètres internes pour l'affichage qui ne semblent pas être mis à jour
    Et pourquoi donc ? C'est une propriété de l'objet, configurable depuis l'EDI, aucune raison pour que sa position dans l'ordre de création intervienne dans son comportement, il me semble.
    Mais je reconnais qu'il y a des comportements bizarres, je sens que je vais tout reprendre à zéro...
    Et tant qu'à être logique, le mécanisme qui calcule et dessine l'affichage dans l'ihm a besoin de savoir ce que vaut WordWrap pour afficher correctement le texte, qui peut varier au gré de l'utilisateur. Non ?

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 146
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 146
    Par défaut
    Bon, allez, maintenant, le mystère !

    La procédure ComboSizeCloseUp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.ComboSizeCloseUp(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to compteur2memos -1 do
        if (sb4memos.Controls[i] is TMemo) then 
          AdapteHauteurMemo((sb4memos.Controls[i] as TMemo).Font.Name, sb4memos.Controls[i] as TMemo);
    end;
    Donc je lance mon logiciel, je clique sur un dossier contenant des .ttf qui se retrouvent chargés, disponibles et affichés en taille 12, vous avez vu l'image.

    Si je clique sur cette ComboBox de taille pour choisir 24 par exemple, les fonts dans les mémos s'agrandissent, ainsi que les mémos, mais eux pas assez !
    Nom : 1er_clic.png
Affichages : 206
Taille : 8,5 Ko

    Il me faut réouvrir et refermer la combo pour que les mémos passent à la bonne taille !
    Nom : 2e_clic.png
Affichages : 205
Taille : 12,6 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AdapteHauteurMemo(FontName: string; Sender: TObject);
    begin
      TMemo(Sender).Font.Size := StrToInt(ComboSize.Text);
      TMemo(Sender).Update;
      nbrelignes := TMemo(Sender).Lines.Count;
      TMemo(Sender).Height := hcar * nbrelignes; // hcar calculé (juste ! J'ai un indicateur) au-dessus, pas mis pour ne pas alourdir
    end;
    C'est bien le Lines.Count qui n'est pas bon au 1er passage.

    Si quelqu'un a une idée pour ça, parce que dans l'autre sens (réduction), ça fonctionne bien !
    Je n'y comprends rien...

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

Discussions similaires

  1. Exporter des propriétés d'objets dans Excel
    Par chancelier eric dans le forum Visio
    Réponses: 1
    Dernier message: 12/06/2008, 09h40
  2. modifier des propriétés dans vba
    Par 4rocky4 dans le forum VBA Access
    Réponses: 12
    Dernier message: 05/02/2008, 11h42
  3. [Réflection] Lister et modifier des propriétés
    Par s.n.a.f.u dans le forum VB.NET
    Réponses: 12
    Dernier message: 26/04/2007, 10h01
  4. Réponses: 1
    Dernier message: 28/03/2007, 15h12
  5. Comment appliquer des propriétés à mes objets ?
    Par Alexino2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/02/2007, 17h20

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