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 :

déplacer des objets en grand nombre


Sujet :

Delphi

  1. #1
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut déplacer des objets en grand nombre
    Bonjour,

    Je fait un petit soft qui doit déplacer des objets (TImage) en fonction de certains paramètres
    Un soft d'histoire, il fait une ligne de temps et en fonction du zoom utilisé les objets (points historiques) ne se trouvent pas à la même place et n'ont pas la même taille. (sur une ligne de temps de [-5000 à + 2015] un objet placé de [1500 à 1600] n'aura pas la même taille que si la ligne va de [1400 à 1650] et ne sera pas placé à la même place.)

    En tout cas je dois pouvoir replacer un certain nombre d'objet de manière fluide
    J'ai 168 objets à déplacer (sans compter ceux déjà créé dans le programme panel, menu ...), c'est relativement fluide bien que limite. Mais quand je passe à 250 la c'est plus très fluide et bien sur plus j'augmente moins c'est fluide (voir lamentable)

    J'utilise SetBounds(x,y,w,h);
    Mais ce n'est pas suffisant

    Auriez vous des pistes à suivre pour améliorer mon programme

    (Chaque point historique que je place est un objet, est déjà une bonne idée ? Je dois pouvoir le déplacer verticalement, cliquer pour le corriger et avoir la fonction hint)

    Merci de votre aide

  2. #2
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir,

    Peux-tu faire un printscreen de ta form (avec un grand nombre d'images) et poster ici l'image ?

    Cordialement
    Thierry

  3. #3
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Nom : chronologie.jpg
Affichages : 197
Taille : 128,3 Ko

    Voici donc une image de mon programme, seul les graduations sont dessinés dans un TImage
    Quand je met à jour l'affichage des objets
    1. Je masque le panel parent
    2. Je calcul la nouvel position de tous les objets
    3. Je masque ceux en dehors de l'affichage
    4. J'affiche ceux dans la zone d'affichage
    5. Je change la position de ceux dans la zone affichée avec un setbounds(..,..,..,..);
    6. J'affiche le Panel


    Merci

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salut,

    rien à voir avec ta problématique de déplacement d'objets, juste pour te signaler que


    • mégalite s'écrit avec un « h », soit mégalithe (de lithos, pierre)
    • moyen age s'écrit en général avec deux majuscules et un accent circonflexe, soit Moyen Âge
    • Age --> Âge
    • Aborde étant un simple verbe conjugué dans une phrase ne prend pas de majuscule
    • dans le premier rectangle vertical vert, tu as écrit un degré bateau à voile, ce qui ne veut rien dire... Je suppose que tu voulais écrire premier bateau à voile, soit 1er, mais ça tu ne pourras pas le faire facilement, rabats-toi alors sur 1er (moche, mais toujours mieux que 1°)

  5. #5
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir,

    Au vu de ton printscreen, je constate que tu affiches aussi des périodes "compressées" (voir la renaissance qui à mon avis, une fois sélectionnée, va s'agrandrir).
    Est-ce le cas ?
    Si oui, cela complique le problème.

    Si ce n'est pas le cas , il y a 2 solutions simples :

    1) un TScrollBox aux dimensions de ta fenêtre avec un enfant Tpanel aux dimensions de tout ce qui est à montrer. Tu positionnes une fois pour toutes tes composants sur le panel (en mode dynamique, ce sera plus facile). Si tu travailles avec des boutons pour les différentes périodes, tu masques la scrollbar horizontale, et par sa propriété Position, tu déplaces ton panel.

    2) Tu demandais si c'était une bonne idée d'utiliser des composants. Si l'utilisateur ne peut pas interagir en cliquant, ce n'est évidemment pas nécessaire. Dans ce cas je travaillerais avec un TBitmap à afficher sur le Canvas d'un TPaintBox. Soit un bitmap à la taille de ta fenêtre, mais dans ce cas, il faudra le reconstituer en fonction des périodes. Soit un seul grand bitmap (que tu peux réaliser par code ou avec un programme du genre photoshop) dont tu n'affiches évidemment que la partie voulue par la procedure Canvas.CopyRect.

    Je suis conscient de ne pas avoir répondu directement à ta question...

    Cordialement
    Thierry

  6. #6
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Merci Jipété pour ces précisions, je vais les corriger, par contre je n'utilise pas de un majuscule accentuée mes cours de dactylographie me le dictent. Ce n'est qu'un détail

    ThWilliam,
    J'ai besoin que l'utilisateur puisse interagir sur les données pour les placer au mieux pour une meilleur lisibilité et quand un passe dessus les commentaires doivent s'afficher.
    Utiliser un un TImage et dessiner dessus c'était ma première idée et j'avais aussi des problèmes de lenteur.


    Pour choisir dans une liste d'objet à afficher j'utilise un case ... of, est ce moins rapide qu'une suite de If ... then ?

    Il semble que mon problème soit déjà dans le calcul de la position de toutes les dates avant de les afficher soit 176 + 176 * 1/2 = 264 dates (176 dates pour chaque objet et j'estime que la moitié d'eux en on deux, la deuxième pour la fin comme l'antiqué par exemple)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par Speed41 Voir le message
    Merci Jipété pour ces précisions, je vais les corriger, par contre je n'utilise pas de un majuscule accentuée mes cours de dactylographie me le dictent. Ce n'est qu'un détail
    Non, ce n'est pas un détail : tu fais comment la différence entre RETRAITE et RETRAITÉ si tu fais sauter l'accent ? Fais des recherches, tu verras qu'il est obligatoire puisqu'il participe à l'orthographe : MODELE ou MODÈLE ou MODELÉ, mmmh ?
    TACHE (sur le pantalon) ou TÂCHE (à exécuter) ?
    Tes cours t'induisent en erreur...

    Désolé pour le HS, mais je ne peux pas laisser passer ça (déjà que la culture fout le camp à toute allure...)

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par Jipété Voir le message
    Désolé pour le HS, mais je ne peux pas laisser passer ça (déjà que la culture fout le camp à toute allure...)
    Surtout qu'il s'agit d'un soft relatif à l'Histoire, donc avec une portée culturelle certaine...

    http://www.academie-francaise.fr/la-...ules-em-strong

  9. #9
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Vu l'insistance je vais me plier et corrigerais

    Merci pour votre implication

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 507
    Points : 2 779
    Points
    2 779
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Tu peux remplacer tes objets TImage par des objets dérivés de TShape en surchargeant la méthode OnPaint

  11. #11
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Ils prendront moins de ressource ce qui augmentera la vitesse d'affichage ?

    J'ai c'éé des objets dérivé d'un TImage pour la gestion de l'image (plus simple)

  12. #12
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    Concernant le TImage : c'est un composant que je n'aime pas beaucoup, je ne l'utilise que pour agrémenter rapidement une présentation et lorsque je n'ai pas besoin de modifier l'image ou sa taille. De plus son stretch (jusqu'à Delphi7, après je ne sais pas) n'est pas bon contrairement à l'utilisation de StretchBlt par exemple (un rien plus lent, mais qualité largement supérieure).

    Lorsque je te parlais de dessiner le tout sans utiliser de composants, il s'agissait de dessiner sur le Canvas d'un TBitmap et non sur un TImage. Le gros avantage est de n'afficher le bitmap que lorsqu'il est complètement dessiné. Et tu l'affiches sur un composant disposant de la propriété Canvas (un TPanel n'en a pas), comme un TPaintBox, qui prend très peu de ressources puisque c'est un simple dérivé de TGraphicControl. Tout le bitmap est affiché en une fois, ce qui te donne la fluidité maximale. C'est le principe utilisé par la double-bufférisation.

    Comme tu veux utiliser des composants pour que l'utilisateur puisse déplacer les images(...), j'en reviens à te proposer la solution du ScrollBox. C'est très simple, et d'une efficacité à toute épreuve. Je suppose que tu ne vas pas permettre de déplacer une image de la préhistoire en plein 17ème siècle ! Dans ce cas, tu mets bout à bout dans le TScrollbox autant de TPanel que de périodes. L'utilisateur pourra déplacer un élément mais uniquement à l'intérieur de son parent.

    Bien sûr, cette solution ne vaut que si tu ne compresses pas une période non sélectionnée (tu n'as pas répondu à ma question à ce sujet). Mais entre nous, où est l'intérêt de montrer une image de 3 ou 4 pixels ?

    Cordialement
    Thierry

  13. #13
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Merci ThWilliam pour ces commentaires.

    Une période comme renaissance, préhistoire change bien de taille en fonction de l'échelle. Mais les images comme l'ancre, les voiliers heu ne changent pas de taille ainsi que tous les textes écrit verticalement.
    Les objets ne peuvent se déplacer que verticalement pour ne pas mettre la préhistoire au XVII° siècle bien sur

    Prés dessiner le tout et n'afficher que la partie voulue m'oblige à devoir faire une image de très grand taille car je peux zoomer jusqu'au jour près

    Le fait de faire un bitmap est une solution que j'avais utilisé qui donnais de bon résultat mais avec moins de souplesse qu'avec les composants. De plus j'avais quand même le problème d'affichage qui était légèrement moins long mais pas encore suffisament rapide. On m'avais proposé d'installer un composant graphique pour accéléré mais je n'avais pas eu le temps de le tester (PC planté tout perdu même le disque dur)

    Je vais tenter de changer mon objet et utiliser un Tshape à la place de mon TImage et tester. Je vais ajouter aussi un tri sur les dates pour n'afficher que les objets dont la date est présente (avant le calcul de sa position).

    J'ai fais un test sans rien afficher (j'ai mit en commentaire le setbounds et mit visible à false) et j'ai le meme temps d'affichage à quelque chose prêt. Je pense que je dois revoir aussi ma procédure de gestion d'affichage.

    Je vous tiens au courant de la suite de mes tests

    En tout cas merci de votre aide

  14. #14
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Un TPaintBox offre beaucoup plus de souplesse qu'un TShape, car... il ne dessine rien de lui-même, tout est à mettre dans l'événement OnPaint.
    Tandis qu'un TShape dessine la forme voulue (propriété shape) puis appelle l'événement OnPaint.
    Donc inutile pour l'affichage d'un bitmap. Et même si tu voulais l'encadrer, if suffit de 2 petites lignes de code dans le TPaintBox.OnPaint.

    Cordialement
    Thierry

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 507
    Points : 2 779
    Points
    2 779
    Billets dans le blog
    10
    Par défaut Exemple TShape
    Voici un petit exemple qui peut t'aider.
    Tu peux modifier le contenu de
    Fichiers attachés Fichiers attachés

  16. #16
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Je viens de réaliser différents tests
    1. ne pas afficher le dessin de l'échelle
    2. changer le type par ceux proposés
    3. Positionner les objets directement sur le TScrollbox



    Conclusion :
    Très légère amélioration en utilisant l'un des deux objets et en les positionnant sur le Tscrollbox

    Je pense refaire le programme en utilisant un TPaintBox et mettant directement sur le Tscrollbox, en optimisant les calculs.


    Si vous avez d'autres propositions je suis preneur pour faire d'autres tests. En tout cas merci pour votre aide

  17. #17
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    Je viens de refaire un nouveau programme et j'ai placé des TPaintbox dans un TScrollbox.

    J'ai 321 objets placés.

    Quand je demande à les repositionner en fonction de la date je met environs 500 ms avec le calcul de la position en fonction de la date (calcul à complet à chaque objet)
    Si je réalise une partie du calcul au début des déplacement j'arrive à environs 80 ms.

    Mais voilà le problème arrive quand je décide de dessiner la règle de temps et la je passe de 800 à 1000 ms fonction de la précision longueur ...

    La méthode utilisée : un Paintbox ou je dessine toutes les graduations (1 an, 10 ans, 100 ans, 1000 ans) avec un écart de 5 pixel minimum entre chaque graduations.
    On me propose de créer un base d'image de différentes échelle possible et de recopier l'image de la graduation voulue autant de fois que besoin. à tester mais pas sur

    Comment puis je utiliser le processeur de la carte graphique pour séparer les calculs ?

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 507
    Points : 2 779
    Points
    2 779
    Billets dans le blog
    10
    Par défaut En complément
    Sous réserve d'avoir bien compris le sens de ta demande.
    Tu as quatre images statiques correspondant aux graduations 1 an, 10 ans, 100 ans, 1000 ans. Donc 4 x 321 objets. Le mieux est donc de fusionner tes TpaintBox sur l'image de fond en fonction de l'échelle.
    tu construis tes quatre images dont trois seront invisibles. IL te reste à mettre la bonne image en fonction de la graduation choisie.
    Tu peux faire aussi une construction par thread pour amélirer la fluidité.

Discussions similaires

  1. [DX9 - D3D] Déplacer des objets à la souris
    Par SixOfOne dans le forum DirectX
    Réponses: 7
    Dernier message: 21/11/2007, 22h07
  2. Déplacer des objets en temps réel avec la souris.
    Par johnnyjohnny dans le forum MATLAB
    Réponses: 4
    Dernier message: 03/07/2007, 15h54
  3. [AJAX] Déplacer des objets HTML sur une page web
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/06/2007, 13h47
  4. Déplacer des objets 3D
    Par pavicf dans le forum DirectX
    Réponses: 2
    Dernier message: 09/11/2006, 11h41
  5. Déplacer des objets dans un JPanel
    Par hammag dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/03/2006, 12h13

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