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 :

Position d'objet dans un autre objet


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 Position d'objet dans un autre objet
    Bonjour,
    J'ai créé un objet (TCustomControl) dans lequel je place d'autres "petits" objets, ils ont une place bien définit par rapport au parent. C'est à dire qu'un "petit" objet peut ce trouver à 1/8 du début, l'autre à 1/2 l'autre au 1/10 leur nombre et leur place sont fonction de l'utilisateur.

    Mes objets ce placent comme il faut mais quand je redimentionne le parent tout fonctionne correctement mais le positionnement de tous les petits objet est long, trop long
    Voici mon code (je place dans un tableau la liste des composants créés) :
    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
    var y : integer;
    begin
     
      y:=1;
      while (Sous_periodes.cells[9,y]<>'') and (Sous_periodes.cells[6,y]='Visible') do
      begin
        with (components[strtoint(Sous_periodes.cells[9,y])] as TSousPeriode) do
        begin
          left:=Position_sur_ligne(Sous_periodes.cells[2,y]);
          width:=Position_sur_ligne(Sous_periodes.cells[3,y])-Position_sur_ligne(Sous_periodes.cells[2,y]);
        end;
     
        inc(y);
      end;
    end;

    La question est : Y a t'il une méthode pour que le repostionnement des sous objets se fasse plus rapidement.

    J'espère avoir été claire et je vous remerci pour vos conseils

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je suppose que le code fourni est celui du positionnement de tes objets (au début ou à chaque redimmensionnement du parent)?
    Tu peux d'abord essayer, à chaque redimmensionnement :
    *Rendre visible:=false tous les objets.
    *Les positionner.
    *Les rendre tous visible:=true
    Il est possible que ça aille plus vite (sans que je sache pourquoi) mais surtout ça va plus vite subjectivement pour le client.
    Et en plus ce n'est pas long à faire.

  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
    Citation Envoyé par philnext
    Je suppose que le code fourni est celui du positionnement de tes objets (au début ou à chaque redimmensionnement du parent)?
    Heu oui biensur, j'avais oublié de le préciser.

    Bien je viens de tester visible:=false et mouvenet puis visible=true, et bien j'ai gagné en rapidité mais c'est pas encore ça.

    Je te remerci, je vais tester de tout cacher puis déplacer puis tout rafficher pour voir si ça ira encore plus rapidement

    merci encore

  4. #4
    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
    Citation Envoyé par Speed41
    je vais tester de tout cacher puis déplacer puis tout rafficher pour voir si ça ira encore plus rapidement
    et ben c'est pas encore ça

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Peut-être que la propriété components[<component_name>] prend du temps.

    Il faudrait essayer de faire qqchose du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //initialisation
    Sous_periodes.objects[x,y]:=components[strtoint(Sous_periodes.cells[9,y])] ;
    ...
    // utilisation Sous_periodes.objects[x,y] 
    TsousPeriode(Sous_periodes.objects[x,y]).left:=...
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    essaie peut-être de désactiver la rafraichissement auto du canvas avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DisableAlign;
    try
    finally
      EnableAlign;
    end;

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Utilise aussi SetBounds au lieu de Left/Width.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Et avec les propriétés Anchors de tes objets, ce ne serait pas plus simple?

  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
    Citation Envoyé par Gaadek
    Et avec les propriétés Anchors de tes objets, ce ne serait pas plus simple?
    Désolé je ne connais pas

    Je vais tester toutes vos solutions

    Merci de votre aide

  10. #10
    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
    Masquer avant le mouvement et rendre visible après m'a permis de gager un peu de vitesse, l'utilisation de Setbounds ma donné de la vitesse et de l'agrément à l'affichage.

    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //initialisation
    Sous_periodes.objects[x,y]:=components[strtoint(Sous_periodes.cells[9,y])] ;
    ...
    // utilisation Sous_periodes.objects[x,y] 
    TsousPeriode(Sous_periodes.objects[x,y]).left:=...
    ne semble pas avoir apporté beaucoup tout du moins rien de visible, mais je le garde

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DisableAlign;
    try
    finally
      EnableAlign;
    end;
    je pense voir un peu mieux.

    Ne soyont peut être pas plus royaliste que le roi.

    Je pense que c'est ma liste (while) qui me prend du temps car même quand je ne gére pas leur affichage (ils sont masqué) cela prends autent de temps. N'est il pas possible d'avoir une action sur tous les enfants en même temps (comme avec la propriété Align) et c'est là que je gagnerais de la rapidité.

    De toute manière je vous remerci pour votre aide et du temps que vous m'avez fait gagné.

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Essayer aussi de n'affecter les propriétés left et top que quand c'est necessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if mycompo.left<>newleft then mycompo.left:=newleft ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  12. #12
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Ca c'est probablement vérifié en interne, par contre.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  13. #13
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Ca c'est probablement vérifié en interne, par contre.
    En fait non, parce qu'on gagne réellement des performances en faisant le test.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  14. #14
    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 vais tester quand même le test

    Mais si on regarde le code initiale, je ne gère ques les objets avec "visible" dans la colone 6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (Sous_periodes.cells[9,y]<>'') and (Sous_periodes.cells[6,y]='Visible') ...
    Si je masque tous les objets le simple fait de tester toutes les lignes pour savoir si l'objet doit être déplacé ou pas, prend à quelque ms près le même temps. Tout ce que vous m'avez apporté a accéléré l'affichage de façon non néglieable mais le plus à gagné est dans cette boucle (je pense)

    merci

  15. #15
    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 m'appercevoir que c'est tout mon programme qui vien de ce ralentir et je ne sais pas pourquoi mais ce n'est plus le problème des objets (je les ai enlevé)

    Merci de votre aide

Discussions similaires

  1. [PHP 5.3] Un objet dans un autre objet
    Par nakk01 dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2009, 14h38
  2. Réponses: 9
    Dernier message: 08/01/2009, 18h08
  3. Réponses: 2
    Dernier message: 28/06/2008, 23h08
  4. Réponses: 5
    Dernier message: 22/04/2008, 10h41
  5. Réponses: 7
    Dernier message: 10/02/2007, 05h41

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