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

WinDev Discussion :

Construction d'un rétro-planning


Sujet :

WinDev

  1. #1
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 953
    Points : 766
    Points
    766
    Par défaut Construction d'un rétro-planning
    Bonjour à Tous et à Toutes.....

    On pourrait croire que j'ouvre un nouveau sujet parce qu'il fait beau....mais pas du tout....j'ai un nouveau souci à résoudre...et de fait j'en appel une nouvelle fois à vos connaissances averties.

    Le contexte:
    La réalisation d'un rétro planning d'ordres de fabrication (ici, prêt à porter)

    Les outils utilisés:

    - Une fenêtre
    - Une image (dans laquelle j'affiche un masque)
    - Une table mémoire cachée
    - Une requête interrogative quant aux ordres de fabrication actifs
    - Deux classes : L'une pour afficher et la deuxième pour la création des "événements"
    - Les procédures.....

    Dans l'une des procédures j'ai inclus le code suivant me permettant d'afficher tous les ordres actifs:

    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
    tabEvénements est un tableau de TimelineEvénement dynamique
    pclEvénement  est un TimelineEvénement dynamique
     
    POUR TOUTE LIGNE DE TABLE_CMD
     
    pclEvénement = allouer un Evénement 
    pclEvénement.DateDébut 		= TABLE_CMD.COL_DATE_DEBUT
    pclEvénement.DateFin   		= TABLE_CMD.COL_DATE_FIN
    pclEvénement.Titre     		= TABLE_CMD.COL_NOMAPPEL+"-Qté-"+TABLE_CMD.COL_QTE
    pclEvénement.Description 	= TABLE_CMD.COL_CMD_TIER
    pclEvénement.Couleur	 	= RougeClair
    Ajoute(tabEvénements, pclEvénement)
     
    FIN
     
    // Affecte les événements
    CMOD__DOUBLE.CMOD_.Contrôle.Evénements = tabEvénements
    Dans le code d'initialisation de la fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Période par défaut : 2010-2015
    CMOD__DOUBLE.CMOD.Contrôle.DateHeureMin = "20100101000000000"
    CMOD__DOUBLE.CMOD.Contrôle.DateHeureMax = "20150101000000000"
     
    // Zoom décades
    CMOD__DOUBLE.CMOD.Contrôle.Zoom 		= zoomAnnées
    CMOD_DOUBLE.CMOD.Contrôle.Callback	= "Menu_Principal.SurDoubleClic"
    Jusqu'à là, pas de problème, cela fonctionne....sauf que......

    J'ai effectué les tests avec une dizaine d'ordres avec dans ce cas un affichage instantané.

    Mais lorsque je suis passé à la phase test "de production", j'ai attendu plusieurs minutes que l'ensemble des ordres s'affichent et de fait, il devient quasiment impossible de double cliquer sur un ordre afin d'avoir son détail....

    .....J'ai dû oublié de le signaler dans le contexte:

    Lors d'un double clic sur un ordre, j'ouvre une fenêtre permettant d'avoir le détail de celui ci ainsi que la possibilité de le modifier, une mise à jour s'effectue par un UPDATE, ensuite je rafraichis l'affichage.

    J'ai bien essayé par un thread, sans résultat.
    Non pas que le thread ne fonctionne pas, mais que je n'ai pas réussi à améliorer le fonctionnement.

    Auriez vous une piste à me soumettre sur la question ?

    Si vous aviez besoin de plus amples détails,.......

    Je vous souhaite une excellente journée

    21h19 ......le même jour....
    J'ai réussi à améliorer la performance en sélectionnant une plage de date.
    Cela réduit considérablement le temps de réponse, pour autant l'idée reste d'afficher le planning dans sa globalité sachant que 150 ordres peuvent être actifs en même temps.
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 80
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Une première étape serait, je penses, de procéder à des mesures avec AnalyseurDebut, AnalyseurFin, et ce afin de voir exactement ce qui prends tant de temps

    A première vue je dirais que c'est au niveau SQL que ca se passe, mais dans le doute...

    Finar

  3. #3
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 953
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    Je ne pense pas que cela vienne de la requête SQL car il ne faut que 2 ou 3 secondes au serveur pour lister l'ensemble des ordres.

    Ce qui prend du temps, c'est l'affichage des évènements
    Et vu qu'il me semble difficile de résoudre le problème, j'ai décidé de reprendre entièrement l'analyse et mon mode de réflexion afin de voir si je ne peux pas m'orienter vers une application de type "WD Planning"
    En faisant en sorte que chaque modification d'une date sur notre ERP entraine une modification sur l'application.

    A voir...

    Je suis intéressé par vos commentaires....
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 80
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Raptor92 Voir le message

    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
    tabEvénements est un tableau de TimelineEvénement dynamique
    pclEvénement  est un TimelineEvénement dynamique
     
    POUR TOUTE LIGNE DE TABLE_CMD
     
    pclEvénement = allouer un Evénement 
    pclEvénement.DateDébut 		= TABLE_CMD.COL_DATE_DEBUT
    pclEvénement.DateFin   		= TABLE_CMD.COL_DATE_FIN
    pclEvénement.Titre     		= TABLE_CMD.COL_NOMAPPEL+"-Qté-"+TABLE_CMD.COL_QTE
    pclEvénement.Description 	= TABLE_CMD.COL_CMD_TIER
    pclEvénement.Couleur	 	= RougeClair
    Ajoute(tabEvénements, pclEvénement)
     
    FIN
     
    // Affecte les événements
    CMOD__DOUBLE.CMOD_.Contrôle.Evénements = tabEvénements
    Nous avons donc ici, le parcours de la table temporaire, et la récupération des évènements... Question : Pourquoi une table temporaire ?
    Citation Envoyé par Raptor92 Voir le message
    Dans le code d'initialisation de la fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Période par défaut : 2010-2015
    CMOD__DOUBLE.CMOD.Contrôle.DateHeureMin = "20100101000000000"
    CMOD__DOUBLE.CMOD.Contrôle.DateHeureMax = "20150101000000000"
     
    // Zoom décades
    CMOD__DOUBLE.CMOD.Contrôle.Zoom 		= zoomAnnées
    CMOD_DOUBLE.CMOD.Contrôle.Callback	= "Menu_Principal.SurDoubleClic"
    Bien...
    Nouvelle question : Quel est le code exact qui prends du temps, et comment se fait l'affichage plus précisément ?

    De plus, est ce que la recherche du coté de WD Planning vous à fait avancer ?

    Bonne journée,
    Finar

  5. #5
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 953
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    Avant tout, merci de vous pencher sur mon problème.

    1- La table mémoire est destinée à recevoir les ordres actifs présents dans la période sélectionnée (je développe avec un serveur Sql 2008)

    2- Le temps de blocage est dû à l'affichage du nombre important d'ordre (250 environ)
    J'ai donc fait en sorte que l'utilisateur soit obligé d'affiner la période de recherche.
    Ce n'est pas tout à fait une parade, vu que cette application est destinée à communiquer les arrivées à 15 jours.

    3- Mon dernier problème consiste à faire apparaitre les jours en dates lors du zoom dans une plage:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    	// Pour chaque "date" visible
    	POUR i = nIndice1er _A_ nIndiceDer
     
    		SI PAS (nX + nLargeurElt < 0 _OU_ nX + Décalage > m_nLargeurTimeLine) ALORS
     
    			// Récupère la date de l'élément courant
    			dhDate = PositionVersDate(i - nIndice1er)	
     
    			// En fonction du zoom actuelle
    			SELON Zoom
     
    				// Décades
    				CAS zoomDécades
     
    					// On affiche la décade
    					sTexte = dhDate..Année
     
    				// Années
    				CAS zoomAnnées
     
    					// On affiche l'année
    					sTexte = dhDate..Année
     
    				// Mois
    				CAS zoomMois
     
    					// On affiche le mois et l'année
    					sTexte = DateVersChaîne(dhDate..PartieDate, "MMMM") + RC +  DateVersChaîne(dhDate..PartieDate, "AAAA")
     
    				// Jours
    				CAS zoomJours
    //************************AFFICHAGE JOUR					
    					// On affiche la date
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersJourEnLettre(dhDate..PartieDate) + RC + DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA")
    					SINON
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ") + " " + DateVersJourEnLettre(dhDate..PartieDate)
    					FIN
     
    				// Heures
    				CAS zoomHeures
     
    					// On affiche la date et l'heure entière
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					SINON
    						sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					FIN
     
    				// Dizaines de minutes
    				CAS zoomMinutes10
     
    					// On affiche la date et l'heure à la dizaine de minutes près
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					SINON
    						sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					FIN
     
    				// Minutes
    				CAS zoomMinutes
     
    					// On affiche la date et l'heure
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					SINON
    						sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					FIN
    			FIN
     
    			// Ligne verticale dégradée - DESSINE LES LIGNES VERTICALES DU PLANNING***************************
    			dRectangleDégradé(nX, 0, nX + 1, {m_sChamp, indChamp}..Hauteur, m_nCouleurFond, nCouleur, 90)
    Dés lors que je double clic, je ne fais que zoomer la plage, mais je n'arrive pas à faire apparaitre les dates.

    Une idée peut être ??

    Merci
    ..................Et très bonne journée
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


  6. #6
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Bonjour Dominique.

    J'ai du mal avec ton dernier post. Si j'ai bien compris le code donné est le code executé lors du double-clic et qui servirait a affichier les périodes.

    J'ai quelques remarques :

    1. Le code donné est incomplet je ne sais pas ce qui manque.
    2. Je ne comprend pas la signification des champs
    3. Le début de boucle m'inquiéte :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      POUR i = nIndice1er _A_ nIndiceDer
       
      		SI PAS (nX + nLargeurElt < 0 _OU_ nX + Décalage > m_nLargeurTimeLine) ALORS
      Pourquoi faire ce test ici si aucun des champs du test ne dépend de i ?
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  7. #7
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 953
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    Et surtout à Mogway,

    Je vous joint la partie entière de la class

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    	EXTERNE LIB_TEMPLATE
     
    	nNbEléments			est un entier											// Nombre d'éléments total
    	duDurée				est une Durée											// Durée d'affichage							
    	nLargeurMax			est un entier											// Largeur maximale
    	dhDate				est une DateHeure			
    	nX					est un réel		
    	nY					est un entier	
    	rTxtX				est un réel
    	nLargeurTex			est un entier											// Largeur du texte
    	nLargeurEvt 		est un entier											// Largeur d'un événement
    	sTexte				est une chaîne
    	polPolice			est une Police											// Police du texte
    	nLargeurElt			est un entier											// Largeur d'un élément						
    	tabEvt				est un tableau de TimelineEvénement dynamique			// Evénements affichés
    	pclEvt				est un TimelineEvénement dynamique		
    	nDecalageV			est un entier	
    	stRect				est un RECT
    	stRectComplet		est un RECT
    	nIndice1er			est un entier											// Indice du premier élément affiché
    	nIndiceDer			est un entier											// Indice du dernier élément affiché
    	bAffichageComplet 	est un booléen											// Flag indiquant si on peut afficher des evenements
    	nCouleur			est un entier
    	nCouleurEclaircie 	est un entier
     
    	// Durée d'affichage
    	duDurée = m_dhDateHeureMax - m_dhDateHeureMin
     
    	// En fonction du zoom
    	SELON Zoom
     
    		// Décades
    		CAS zoomDécades
     
    			nNbEléments = (m_dhDateHeureMax..Année - m_dhDateHeureMin..Année) / 10
    			nLargeurElt = 96 * m_rZoomDist
     
    		// Années
    		CAS zoomAnnées
     
    			nNbEléments = m_dhDateHeureMax..Année - m_dhDateHeureMin..Année
    			nLargeurElt = 72 * m_rZoomDist
     
    		// Mois
    		CAS zoomMois
     
    			nNbEléments = m_dhDateHeureMax..Année * 12 + m_dhDateHeureMax..Mois - m_dhDateHeureMin..Année * 12 - m_dhDateHeureMin..Mois
    			nLargeurElt = 72 * m_rZoomDist
     
    		// Jours
    		CAS zoomJours
     
    			nNbEléments = duDurée..EnJours 
    			nLargeurElt = 72 * m_rZoomDist
     
    		// Heures
    		CAS zoomHeures
     
    			nNbEléments = duDurée..EnHeures
    			nLargeurElt = 72 * m_rZoomDist
     
    		// 10x minutes
    		CAS zoomMinutes10
     
    			nNbEléments = duDurée..EnMinutes * 10
    			nLargeurElt = 72 * m_rZoomDist
     
    		// Minutes
    		CAS zoomMinutes
     
    			nNbEléments = duDurée..EnMinutes
    			nLargeurElt = 72 * m_rZoomDist
    	FIN
     
    	// Largeur maximale de la timeline
    	m_nLargeurMax = nLargeurElt * nNbEléments
     
    	// Largeur des intervalles
    	m_nLargeurIntervalles = nLargeurElt
     
    	// Couleur de fond
    	{m_sChamp, indChamp}..CouleurFond = m_nCouleurFond
     
    	// Couleurs du texte
    	nCouleur = m_nCouleur
    	nCouleurEclaircie = TSL(CouleurTeinte(nCouleur), CouleurSaturation(nCouleur), Max(100, CouleurLuminosité(nCouleur) + 25))
     
    	// Début du dessin
    	dDébutDessin(m_sChamp, dSansEffacer)
    	DC = dDébutDessin(m_sChamp, dEffacer)
     
    	dRectangle(0, 0, {m_sChamp, indChamp}..Largeur, {m_sChamp, indChamp}..Hauteur, m_nCouleurFond, m_nCouleurFond)
     
    	// Aucun événement survolé	
    	m_pclEvénementSurvolé = Null
     
    	// Crée la police
    	polPolice = m_polPolice
    	polPolice..Couleur = m_nCouleur
    	LIB_TEMPLATE..Police = polPolice
     
    	// Décalage de départ
    	nX = Arrondi(m_bDéplacementAutorisé ? Décalage SINON 0)
     
    	// Première DateHeure affichée
    	m_dhDateHeureMinVisible = PositionVersDate(Abs(nX) / nLargeurElt)
    	m_dhDateHeureMinAjustée = PositionVersDate(0)
     
    	// Ajustement
    	DateAjuste(m_dhDateHeureMinVisible)
    	DateAjuste(m_dhDateHeureMinAjustée)
     
    	// Dernière DateHeure affichée
    	m_dhDateHeureMaxVisible = PositionVersDate((Abs(nX) + m_nLargeurTimeLine) / nLargeurElt)
     
    	// Ajustement
    	DateAjuste(m_dhDateHeureMaxVisible)
     
    	// Date et heure réelle (bornes)	
    	m_dhDateHeureMinRéel 	= PositionVersDate(0, Vrai)
    	m_dhDateHeureMaxRéel 	= PositionVersDate(m_nLargeurTimeLine, Vrai)
     
    	// Répercute les modifications sur la timeline synchronisée
    	SI m_pclTimelineSynchronisée <> Null ALORS
     
    		// On doit modifier les dates pour qu'elles correspondent
    		m_pclTimelineSynchronisée.DateHeureMin = PositionVersDate(0)
    		m_pclTimelineSynchronisée.DateHeureMax = DateHeureMax
     
    		// Zoom inférieur
    		m_pclTimelineSynchronisée.Zoom = Min(7, Zoom + 1)
    	FIN
     
    	// Si la plage de date est inférieure à la page de date affichable
    	SI m_dhDateHeureMaxRéel > m_dhDateHeureMax ALORS
     
    		// On empêche le déplacement
    		m_bDéplacementAutorisé = Faux
    	SINON
     
    		// Autorise le déplacement
    		m_bDéplacementAutorisé = Vrai
    	FIN
     
    	// Récupère les événements passées entre ces deux dates
    	tabEvt = ListeEvénements(m_dhDateHeureMinVisible, m_dhDateHeureMaxVisible)
     
    	// Premier indice affichable
    	nIndice1er = DateVersPosition(m_dhDateHeureMinVisible)
    	nIndiceDer = DateVersPosition(m_dhDateHeureMaxVisible)
    	nIndiceDer = (nIndice1er + nIndiceDer + 1)
     
    	// Date moyenne
    	m_dhDateHeureMidVisible = PositionVersDate((nIndiceDer - nIndice1er) / 2)
     
    	// Sélectionne la police
    	dPolice(polPolice)
     
    	// Pour chaque "date" visible
    	POUR i = nIndice1er _A_ nIndiceDer
     
    		SI PAS (nX + nLargeurElt < 0 _OU_ nX + Décalage > m_nLargeurTimeLine) ALORS
     
    			// Récupère la date de l'élément courant
    			dhDate = PositionVersDate(i - nIndice1er)	
     
    			// En fonction du zoom actuelle
    			SELON Zoom
     
    				// Décades
    				CAS zoomDécades
     
    					// On affiche la décade
    					sTexte = dhDate..Année
     
    				// Années
    				CAS zoomAnnées
     
    					// On affiche l'année
    					sTexte = dhDate..Année
     
    				// Mois
    				CAS zoomMois
     
    					// On affiche le mois et l'année
    					sTexte = DateVersChaîne(dhDate..PartieDate, "MMMM") + RC +  DateVersChaîne(dhDate..PartieDate, "AAAA")
     
    				// Jours
    				CAS zoomJours
    //************************AFFICHAGE JOUR					
    					// On affiche la date
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersJourEnLettre(dhDate..PartieDate) + RC + DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA")
    					SINON
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ") + " " + DateVersJourEnLettre(dhDate..PartieDate)
    					FIN
     
    				// Heures
    				CAS zoomHeures
     
    					// On affiche la date et l'heure entière
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					SINON
    						sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					FIN
     
    				// Dizaines de minutes
    				CAS zoomMinutes10
     
    					// On affiche la date et l'heure à la dizaine de minutes près
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					SINON
    						sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					FIN
     
    				// Minutes
    				CAS zoomMinutes
     
    					// On affiche la date et l'heure
    					SI m_pclTimelineParente = Null ALORS
    						sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					SINON
    						sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
    					FIN
    			FIN
     
    			// Ligne verticale dégradée - DESSINE LES LIGNES VERTICALES DU PLANNING***************************
    			dRectangleDégradé(nX, 0, nX + 1, {m_sChamp, indChamp}..Hauteur, m_nCouleurFond, nCouleur, 90)
     
    			// Si le texte est sur deux lignes
    			SI ChaîneOccurrence(sTexte, RC) > 0 ALORS
     
    				// Affiche les deux lignes
    				dTexteAvancé(DC, (nX), ({m_sChamp, indChamp}..Hauteur - 28), (nX + nLargeurElt), ({m_sChamp, indChamp}..Hauteur - 14), ExtraitChaîne(sTexte, 1, RC), DT_CENTER + DT_VCENTER + DT_EDITCONTROL, nCouleur)
    				dTexteAvancé(DC, (nX), ({m_sChamp, indChamp}..Hauteur - 14), (nX + nLargeurElt), ({m_sChamp, indChamp}..Hauteur), ExtraitChaîne(sTexte, 2, RC), DT_CENTER + DT_VCENTER + DT_EDITCONTROL, nCouleurEclaircie)
    				nDecalageV = 32				
    			SINON
     
    				// Affiche sur une ligne
    				dTexteAvancé(DC, (nX), ({m_sChamp, indChamp}..Hauteur - 14), (nX + nLargeurElt), ({m_sChamp, indChamp}..Hauteur), sTexte, DT_CENTER + DT_VCENTER + DT_EDITCONTROL, nCouleur)
    				nDecalageV = 18
    			FIN
     
    		FIN
     
    		// Prochaine position  CALCUL L'INTERVALLE DES LIGNES VERTICALES
    		nX += nLargeurElt
     
    		// Ajuste la largeur totale
    		SI m_nLargeurMax < nX ALORS
    			m_nLargeurMax = nX
    		FIN
    	FIN
     
    	// Point de départ
    	nX = (m_bDéplacementAutorisé ? Décalage SINON 0)
     
    	// Si une date a été sélectionnée
    	SI m_dhDateHeureSelect <> "00000000000000000" ALORS
    		dhDate = m_dhDateHeureSelect
    	SINON 
     
    		// Si aucune date n'a été sélectionnée, qu'on ne peut pas déplacer l'évenement et qu'on possède une timeline synchronisée
    		SI m_bDéplacementAutorisé = Faux _ET_ m_pclTimelineSynchronisée <> Null ALORS
     
    			// On récupère la première date visible de l'évenement synchronisée
    			dhDate = m_pclTimelineSynchronisée.PositionVersDate(-m_pclTimelineSynchronisée.Décalage, Vrai)
    		SINON
    			// Aujourd'hui
    			dhDate = DateDuJour + Maintenant		
    		FIN		
    	FIN
     
    	nX += DateVersPosition(dhDate, Vrai)
    //****DESSINE LA LIGNE DU JOUR	
    	SI PAS (nX + nLargeurElt < 0 _OU_ nX + Décalage > m_nLargeurTimeLine) ALORS
    		dRectangleDégradé(nX, 0, nX + 1, {m_sChamp, indChamp}..Hauteur - nDecalageV, m_nCouleurFond, m_nCouleurSélection, 90)
     
    	FIN
     
    	// Détermine si on peut afficher les cases complètes
    	bAffichageComplet = ({m_sChamp, indChamp}..Hauteur > HAUTEUR_FULLELT * 3)
     
    	// Point de départ
    	nX = (m_bDéplacementAutorisé ? Décalage SINON 0)
     
    	Trie(tabEvt, ttMembre, "+m_dhDateDébut")
     
    	// Pour chaque événement à afficher
    	POUR TOUT pclEvt DE tabEvt
     
    		// Largeur de l'événement en pixels
    		nLargeurEvt = (Max(3.0, DuréeVersPixels(pclEvt.DateDébut, pclEvt.DateFin)))
    		nLargeurElt = 256
     
    		// Rectangle de l'événement
    		stRect.x1 = nX + (DateVersPosition(pclEvt.DateDébut, Vrai))
     
    		SI bAffichageComplet ALORS
     
    			stRect.y1 = {m_sChamp, indChamp}..Hauteur - nDecalageV - HAUTEUR_FULLELT - HAUTEUR_ELT * 2
    			stRect.y2 = stRect.y1 + HAUTEUR_FULLELT	/ (pclEvt.Titre = "" ? 1.9 SINON 1)		
     
    			// Calcule le rectangle de l'évenement 
    			stRectComplet.x1 = stRect.x1 + HAUTEUR_ELT * 2 + 4
    			stRectComplet.x2 = stRect.x1 + nLargeurElt + HAUTEUR_ELT * 2 - 4
    			stRectComplet.y1 = stRect.y1 + HAUTEUR_ELT * 2 + 2
    			stRectComplet.y2 = stRect.y2 + HAUTEUR_ELT * 2 - 2
     
    			// Police
    			dPolice(polPolice)
     
    			// Largeur du texte
    			dTexteAvancé(DC, stRectComplet.x1, stRectComplet.y1, stRectComplet.x2, stRectComplet.y2, (pclEvt.Titre + Répète(" ", Taille(pclEvt.Titre) / 3) + [RC] + pclEvt.Description), DT_TOP + DT_LEFT + DT_CALCRECT + DT_EDITCONTROL)
    			nLargeurTex = Min(256, stRectComplet.x2 - stRectComplet.x1)
    			nLargeurElt = nLargeurTex + 12				
     
    			// Recherche si un autre événement se trouve à la position
    			TANTQUE DétectionSuperposition(stRect, tabEvt, pclEvt)
     
    				stRect.y1 -= HAUTEUR_FULLELT + HAUTEUR_FULLELT / 2
    				stRect.y2 -= HAUTEUR_FULLELT + HAUTEUR_FULLELT / 2
    			FIN
     
    			stRect.x2 = stRect.x1 + nLargeurEvt
     
    		SINON
     
    			stRect.x2 = stRect.x1 + nLargeurEvt
     
    			stRect.y1 = {m_sChamp, indChamp}..Hauteur - nDecalageV - HAUTEUR_ELT
    			stRect.y2 = {m_sChamp, indChamp}..Hauteur - nDecalageV
     
    			// Recherche si un autre événement se trouve à la position
    			TANTQUE DétectionSuperposition(stRect, tabEvt, pclEvt)
     
    				stRect.y1 -= HAUTEUR_ELT + HAUTEUR_ELT / 2
    				stRect.y2 -= HAUTEUR_ELT + HAUTEUR_ELT / 2
    			FIN
    		FIN
     
    		// Transmet le rectangle
    		m_taRectangles[pclEvt.UID] = stRect 
     
    		// Si le cadre de l'événement dépasse la largeur du cadre du planning, on abandonne son dessin
    		SI stRect.y2 < 0 ALORS CONTINUER
     
    		// En mode affichage complet ?
    		SI bAffichageComplet ALORS
     
    			// Petit rectangle
    			dRectangle(stRect.x1, stRect.y1, stRect.x2, stRect.y1 + HAUTEUR_ELT, pclEvt.Couleur, pclEvt.Couleur)
     
    		// Calcule le rectangle du dessin ** -- Optionnel vu que le dessin prend
    		// une place inutile sur la page.....mais bon..pour le savoir faire..
    			stRectComplet.x1 = stRect.x1 + HAUTEUR_ELT * 2
    			stRectComplet.x2 = stRect.x1 + nLargeurElt + HAUTEUR_ELT * 2
    			stRectComplet.y1 = stRect.y1 + HAUTEUR_ELT * 2
    			stRectComplet.y2 = stRect.y2 + HAUTEUR_ELT * 2
     
    			// Si un titre ou une description a été fournie
    			SI pclEvt.Description <> "" _OU_ pclEvt.Titre <> "" ALORS
     
    				// Conserve le rectangle du cartouche
    				m_taRectanglesComplet[pclEvt.UID] = stRectComplet
     
    				// DESSIN DU RECTANGLE DE L'EVENEMENT**********
    //********		dRectangle(stRectComplet.x1 , stRectComplet.y1, stRectComplet.x2, stRectComplet.y2, m_nCouleurFond, GrisFoncé)	
     
    				// Affiche le titre si il existe
    				SI pclEvt.Titre <> "" ALORS
     
    					// Police grasse
    					polPolice..Gras = Vrai
    					polPolice..Italique = Faux
    					dPolice(polPolice)	
     
    					// Affiche le titre
    					dTexteAvancé(DC, stRectComplet.x1 + 4, stRectComplet.y1 + 2, stRectComplet.x2 - 4, stRectComplet.y1 + 14, (pclEvt.Titre), DT_TOP + DT_LEFT + DT_SINGLELINE + DT_MODIFYSTRING + DT_END_ELLIPSIS + DT_EDITCONTROL)					
    				FIN
     
    				SI pclEvt.Description <> "" ALORS
     
    					// Police de la description
    					polPolice..Gras = Faux			
    					polPolice..Italique = Vrai			
    					dPolice(polPolice)	
     
    					// Affiche la description
    					dTexteAvancé(DC, stRectComplet.x1 + 4, stRectComplet.y1 + 2 + (pclEvt.Titre <> "" ? 14 SINON 0), stRectComplet.x2 - 4, stRectComplet.y2 - 2, (pclEvt.Description), DT_TOP + DT_LEFT + DT_MODIFYSTRING + DT_END_ELLIPSIS + DT_EDITCONTROL)
    				FIN
    			FIN
    		SINON
     
    			// Petit rectangle
    			dRectangle(stRect.x1, stRect.y1, stRect.x2, stRect.y2, pclEvt.Couleur, pclEvt.Couleur)		
    		FIN
     
    	FIN
     
    	// Conserve la liste des événements visibles
    	m_tabEvénementsVisibles = tabEvt	
     
    	// Si on a une timeline synchronisée
    	SI m_pclTimelineSynchronisée <> Null ALORS
     
    		// Affecte les mêmes événements à la timeline synchronisée
    		m_pclTimelineSynchronisée.Evénements = Evénements
     
    		// Date et heure sélectionnée
    		m_pclTimelineSynchronisée.DateHeureSelect = m_dhDateHeureSelect
     
    		// Couleurs
    		m_pclTimelineSynchronisée.Couleur = Couleur
    		m_pclTimelineSynchronisée.CouleurFond = CouleurFond
     
    		// Police
    		m_pclTimelineSynchronisée.Police = m_polPolice
     
    		// Zoom de distance
    		m_pclTimelineSynchronisée.ZoomDistance = m_rZoomDist
     
    		// Callback
    		m_pclTimelineSynchronisée.p_sCallback = p_sCallback
     
    		// Etat
    		m_pclTimelineSynchronisée.Etat = (m_bDéplacementAutorisé ? Actif SINON Inactif)
     
    		// Affiche la timeline synchronisée
    		m_pclTimelineSynchronisée.Affiche()
    	FIN
    J'espère que cela sera plus clair de la sorte.
    Par honnêteté, il faut noter que je m'inspire d'un exemple fournis dans une LST (abonné depuis un an..) et que cela fait quelques jours que je décortique ce code.
    Je pense l'avoir bien assimilé mais je but sur ce point.

    Mille merci pour votre temps
    ........Et très bonne journée
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


  8. #8
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Pff non pas plus clair pour moi désolé. Et plus j'ai pas les LST depuis longtemps donc impossible a tester.

    Bon ton souci est d'afficher des date quand tu zoome. Je peux voir que :

    i variant de nIndice1er à nIndiceDer alors puisque dhDate = PositionVersDate(i - nIndice1er)

    chdate varie donc de PositionVersDate(0) à PositionVersDate(nIndiceDer-nIndice1er)

    Mais est-ce bien ça que tu veux ?
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  9. #9
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 953
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    Il me semble que cela sera plus simple en incluant le code du zoom

    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
    PROCEDURE Zoom(nZoom est un entier)
     
    	SI 1 <= nZoom <= 7 ALORS
     
    		// Conserve le zoom
    		SI nZoom <> m_nZoom ALORS
    			m_nZoom = nZoom	
     
    			SI m_pclTimelineParente = Null ALORS
     
    				// Actualise
    				Affiche()
    			FIN
    		FIN
    	FIN
    Désolé, je ne répond pas exactement à ta question, je continus à contrôler avant de répondre.

    ....Je ne suis pas à une ânerie prêt, mais quant même.....
    Raptor92
    Dominique
    Aucune aide par MP, utilisez le forum.

    Mon guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java


Discussions similaires

  1. [XL-2010] Rétro planning et MFC
    Par goldfinger13 dans le forum Excel
    Réponses: 3
    Dernier message: 23/08/2014, 08h26
  2. plan assurance qualité PAQ de la construction d'un bâtiment
    Par karinouchka dans le forum Gestion de projet
    Réponses: 0
    Dernier message: 31/03/2010, 16h44
  3. [JBuilder 7] Construction d'executable natif
    Par renaudfaucon dans le forum JBuilder
    Réponses: 3
    Dernier message: 24/11/2006, 22h28
  4. Plan type d'un document de spécification
    Par ludovic.fernandez dans le forum Test
    Réponses: 3
    Dernier message: 06/12/2002, 17h36
  5. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54

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