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 :

[D10.2] TListBox sur fond de fenêtre MDI non masqué automatiquement à l'exécution par les fenêtres filles ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 102
    Points : 87
    Points
    87
    Par défaut [D10.2] TListBox sur fond de fenêtre MDI non masqué automatiquement à l'exécution par les fenêtres filles ?
    Bonjour à tous

    ( sous Delphi 10.2 & windows 10 pro )

    sur mon fond de fenêtre MDI, j'affiche la version de mon logiciel, + les 3 derniers fichiers et dossiers utilisés.

    Je veux ajouter une TListBox avec les 20 derniers fichiers utilisés.

    Problème : Alors que mes TLabels + TImage sont automatiquement masqués à l'exécution, la TListBox ne l'est pas ?

    Je sèche...malgré mes recherches sur le net...

    à noter qu'un TButton fait pareil...pourquoi les fenêtres filles ne cachent elles pas ces contrôles VCL ?

    Voir les 2 PJ de ce post = images de ce problème

    Merci - Pascal 07300

    Nom : 1.PNG
Affichages : 211
Taille : 104,0 KoNom : 2.png
Affichages : 213
Taille : 114,8 Ko

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    MDI/SDI sont là our des raisons de compatibilité ascendante des projets dans Delphi, mais si ça fait appel à des API Windows, peut-être que Microsoft a zappé certains trucs sous Windows 10 par rapport à d'autres composants.

    TButton et TListbox sont en effet des éléments provenant de Windows directement, descendants de TWinControl en VCL.

    As-tu activé les apparences personnalisées sur le projet ? Utilises-tu un style ou rien de spécifique sur ce projet ?

    C'est récent que ça déconne ou tu viens de porter un projet vers Delphi 10.2 Tokyo ?

    (suis allé voir ce qui concerne "MDI" sur quality.embarcadero.com, rien ne ressort avec ce problème sur mes recherches rapides)

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est la différence TWinControl (Handle sur un control réel de Windows) et un TGraphicControl qui dessine sur son Parent

    Utilise une TDrawGrid (ou TStringGrid), tu vas devoir dessiné la liste dans son intégralité


    Et c'est un comportement normal, tous les TWinControl présents réduisent la région de la zone client ... En D5, suffit de se rappeler comme les TSplitter déconnait (ça doit être encore le cas) pour redimensionner panneaux autour de la zone client et avec des Panel on pouvait reproduire des splitters.


    Pour un fond de la zone client

    En D5-D7, j'utilise WndProc GWL_WNDPROC
    En DXE2, je passe par un TFormStyleHook si il y a un thème VCL actif et par WndProc si style OS
    Voir https://www.developpez.net/forums/d1...s/#post7886805

    Et je dessine tout dans un Bitmap tampon où tu es présent dans une seule image, ainsi le fond peut être calculé dans un thread, le double-tampon est protégé, cela permet d'avoir un monitoring qui tourne en fond réduisant l'impact sur le CPU du MainThread
    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

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 102
    Points : 87
    Points
    87
    Par défaut
    Bonjour,
    Non aucun style personnel ou autre.
    Je vais tester avec un TStringGrid pour voir...
    Sinon, j ai une solution, mettre visible a false des qu’une fenêtre fille est ouverte...

    Merci, cordialement, Pascal

  5. #5
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par pascal07 Voir le message
    Sinon, j ai une solution, mettre visible a false des qu’une fenêtre fille est ouverte...
    ça ne devrait pas être nécessaire

    si tu peux faire un projet de démo reproduisant le problème, soumets le sur quality.embarcadero.com

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est pourtant le comportement normal, les TWinControl sont affichés par-dessus dans la zone client .
    Il n'y a pas de bug !

    D'ailleurs, contrairement à son nom la TDrawGrid est un TWinControl donc il sera aussi une réduction de la zone client.
    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
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    la gestion MDI est antique et considère que les enfants de la fiche parent sont des MDIChild...donc c'est assez logique que la gestion des TWinControl soit perturbée. Les TGraphicControl qui n'ont pas de Handle Windows sont dessinés sur le Canvas de leur parent, ici la fiche, donc ils ne peuvent matériellement pas s'afficher par dessus les fiche filles.

    Si tu veux conserver cet affichage (car en le masquant tu le perds si aucune fiche mdi n'est au dessus), tu dois gérer l'ordre des fiches, peut-être avec un SendToBack sur ta ListBox histoire qu'elle soit toujours en bas de la pile.

    autre approche, tu remplaces ta ListBox par un TPaintBox dans lequel tu prends le temps de faire des Canvas.TextRect() pour afficher tes infos...tu retombes alors sur un TGraphicControl qui ne sortira pas du canvas de son parent.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 102
    Points : 87
    Points
    87
    Par défaut
    Bonjour

    1 - je viens de tester , TStringGrid descend aussi de TWinControl, donc même ( mauvais ) comportement.

    SendToBack masque définitivement la listbox ( ?? ).
    :
    2 - j'ai finalement utiliser une procédure d'actualisation a chaque ouverture/fermeture de fenêtre fille ( TChild ) : si MDI.MDIChildCount = 0 alors j'affiche ma TLIstBox, sinon non.

    car je ne veux pas refaire une liste box descendant de TGraphicControl....et que j'ai déjà une procédure dans ce cas, pour gérer d'autres choses sur la fenêtre parent MDI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListFichier.Visible := MDIChildCount = 0;
    ça fonctionne bien, merci pour votre aide, j'ai appris des choses...

    Pascal

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

Discussions similaires

  1. [WD25] Problème de transparence sur les image de fond de fenêtre
    Par lololebricoleur dans le forum WinDev
    Réponses: 3
    Dernier message: 10/03/2022, 09h28
  2. Réponses: 3
    Dernier message: 19/08/2008, 15h37
  3. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  4. 2 ActiveX identique sur une même fenêtre ?????
    Par cathar_rhythm dans le forum MFC
    Réponses: 3
    Dernier message: 14/11/2005, 20h21
  5. opération sur fermeture de fenêtre
    Par java_math dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2004, 22h52

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