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

Contribuez Discussion :

Création dynamique de champ image + déplacement souris


Sujet :

Contribuez

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut Création dynamique de champ image + déplacement souris
    Je poste rapidement un petit bout de code pour ceux qui souhaitent rapidement et simplement créer des champs images dynamiquement, et de pouvoir les déplacer à la souris.
    Fort heureusement cela fonctionne pour tous les champs.

    Dans votre projet vous n'aurez besoin que d'une fenêtre vide, d'un bouton et d'un champ image à cloner (placez le champ image hors de la fenêtre pour ne pas vous embêter avec). Redimensionnez ce champ en 50*50 pour ne pas qu'il soit trop gros.

    Attention : le programme n'est pas parfait, il y a 2 petits problèmes :
    - le premier est que la souris lors du déplacement du champ doit toujours être au dessus du champ, si vous bougez la souris trop vite on perd le focus du champ (mais on peut rebouger le champ en reclickant dessus).
    - le second (attention faut suivre) est lorsque vous bougez un champ, vous relachez le bouton gauche de la souris, vous clickez à l'extérieur de ce champ (dans la fenêtre mais hors autres champs) et si vous revenez sur ce champ tout en maintenant le bouton de la souris enfoncé (j'avais dit qu'il fallait suivre) vous rebougerez le champ.
    Sinon le reste normalement c'est bon

    D'abord on définit des variables globales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    nbimagemax est un entier = 0 // nombre total de champs créés pour dimensionner le tableau
    tab_images est un tableau dynamique de chaînes // tableau contenant le nom des champs
    carrésélectionné est un entier = 0 // le champ sélectionné lors du click souris
     
    posxsourisinit est un entier // position initiale de la souris en X
    posysourisinit est un entier // position initiale de la souris en Y
    Ensuite dans l'initialistion de la fenêtre 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Evénement("clickimage",".*", 513) // WM_LBUTTONDOWN uniquement sur les champs de la fenêtre
    Clic sur bouton 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    nbimagemax++ // pour chaque click sur le bouton on incrémente le nombre total de champs créés
    Dimension(tab_images, nbimagemax) // on n'oublie pas de redimensionner le tableau de noms
    tab_images[nbimagemax] = "carré"+ nbimagemax // on définit le nom du nouveau champ (carré1, carré2, carré3, ...)
     
    ChampClone(Image1, tab_images[nbimagemax]) // la fameuse fonction qui permet de créer un nouveau champ
     
     
    // là on décale un peu la position du nouveau champ par rapport au coin haut gauche de la fenêtre, ((nbimagemax - 1) * 55) permet de décaler chaque nouveau champ par rapport au précédent
    {tab_images[nbimagemax],indChamp}..X = 10 + ((nbimagemax - 1) * 55)
    {tab_images[nbimagemax],indChamp}..Y = 10
    Initialisation de Image1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MoiMême..CouleurFond = RougePastel // faut bien lui mettre une couleur ou alors vous pouvez la définir dans sa description
    Procédure locale clickimage :

    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
     
    PROCEDURE clickimage()
     
    SI nbimagemax > 0 ALORS // si on a créé au moins 1 nouveau champ
     
    	POUR i= 1 A nbimagemax
     
    		SI {tab_images[i],indChamp}..Nom = ChampSurvol(Faux,Faux) ALORS
                            // on initialise la position de la souris
    			posxsourisinit = SourisPosX()
    			posysourisinit = SourisPosY()
    			carrésélectionné = i // on récupère l'indice du champ survolé
    			Evénement("déplaceimage",{tab_images[carrésélectionné],indChamp},512) // souris bouge, attention il faut bien utiliser l'indirection pour que la souris déplace le champ survolé par la souris
     
    		FIN
    	FIN
    FIN
    Procédure locale déplaceimage :

    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
     
    PROCEDURE déplaceimage()
     
    SI ToucheEnfoncée(teBoutonG)=Vrai ALORS
     
    	SI 	{tab_images[carrésélectionné],indChamp}..Nom = ChampSurvol(Faux,Faux) ALORS
     
            // on sauveagrde la position initiale du champ		
    		posxinitcarré est un entier = {tab_images[carrésélectionné],indChamp}..X
    		posyinitcarré est un entier = {tab_images[carrésélectionné],indChamp}..Y
     
            // la position du champ est sa position initiale + la position actuelle de la souris - la position initiale de la souris
    	{tab_images[carrésélectionné],indChamp}..X = (posxinitcarré + SourisPosX() - posxsourisinit)
    	{tab_images[carrésélectionné],indChamp}..Y = (posyinitcarré + SourisPosY() - posysourisinit)
     
    	FIN		
    FIN
    Mieux vaut un petit lien qu'un long discours.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Alors pour résoudre les 2 problèmes précédents y a 2 petites modification à faire dans Procédure locale déplaceimage :
    Code précédent :

    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
     
    PROCEDURE déplaceimage()
     
    SI ToucheEnfoncée(teBoutonG)=Vrai ALORS
     
    	SI 	{tab_images[carrésélectionné],indChamp}..Nom = ChampSurvol(Faux,Faux) ALORS
     
            // on sauveagrde la position initiale du champ		
    		posxinitcarré est un entier = {tab_images[carrésélectionné],indChamp}..X
    		posyinitcarré est un entier = {tab_images[carrésélectionné],indChamp}..Y
     
            // la position du champ est sa position initiale + la position actuelle de la souris - la position initiale de la souris
    	{tab_images[carrésélectionné],indChamp}..X = (posxinitcarré + SourisPosX() - posxsourisinit)
    	{tab_images[carrésélectionné],indChamp}..Y = (posyinitcarré + SourisPosY() - posysourisinit)
     
    	FIN		
    FIN
    Code modifié :

    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
     
    PROCEDURE déplaceimage()
     
    SI ToucheEnfoncée(teBoutonG)=Vrai ALORS
     
     
    	posxinitcarré est un entier = {tab_images[carrésélectionné],indChamp}..X
    	posyinitcarré est un entier = {tab_images[carrésélectionné],indChamp}..Y
     
     
    	{tab_images[carrésélectionné],indChamp}..X = (posxinitcarré + SourisPosX() - posxsourisinit)
    	{tab_images[carrésélectionné],indChamp}..Y = (posyinitcarré + SourisPosY() - posysourisinit)
     
     
    	FenRepeint(Fenêtre1)
    FIN
    Mieux vaut un petit lien qu'un long discours.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Voici une proposition de corrections.

    Dans le traitement de déclaration des variables globales, j'ajoute une variable pour conserver l'id de de l'interruption du message 512 (événement).
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    nbimagemax est un entier = 0 // nombre total de champs créés pour dimensionner le tableau
    tab_images est un tableau dynamique de chaînes // tableau contenant le nom des champs
    carrésélectionné est un entier = 0 // le champ sélectionné lors du click souris
     
    nIdEvt est un entier // id de l'interruption sur événement msg 512
    posxsourisinit est un entier // position initiale de la souris en X
    posysourisinit est un entier // position initiale de la souris en Y

    Dans la procédure clickimage, il ne faut pas utiliser d'indirection, puisqu'on peut travailler directement sur le nom des champs.

    Code WLangage : 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
     
    PROCEDURE clickimage()
     
    // on peut s'arrêter si aucun champ n'est cloné
    SI nbimagemax = 0 ALORS RETOUR
     
    // on récupère l'indice du champ survolé
    carrésélectionné = TableauCherche(tab_images, tcLinéaire, ChampSurvol(Faux,Faux))
     
    SI carrésélectionné  > -1 ALORS
    	// on initialise la position de la souris
    	posxsourisinit = SourisPosX()
    	posysourisinit = SourisPosY()
     
    	// on conserve l'id de l'interruption du msg 512 pour l'annuler plus tard
    	nIdEvt = Evénement("déplaceimage",tab_images[carrésélectionné],512)
    FIN

    Je simplifie un peu le code de la procédure déplaceimage.
    C'est là qu'on annule l'interruption du message 512.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PROCEDURE déplaceimage()
     
    SI ToucheEnfoncée(teBoutonG)=Vrai ALORS		
    	sChamp est une chaîne = tab_images[carrésélectionné]
     
    	{sChamp,indChamp}..X +=  SourisPosX() - posxsourisinit
    	{sChamp,indChamp}..Y += SourisPosY() - posysourisinit
     
    	FenRepeint(Fenêtre1)
    SINON
    	// Arrêt de l'interception du message 512
    	FinEvénement(nIdEvt)
    FIN

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Mes bouts de codes sont une proposition générique pour créer dynamiquement des champs image et de pouvoir les déplacer.

    En fait dans mon programme j'évite d'utiliser des variable globale sauf pour sauvegarder le nom du champ qui était sélectionné avant pour différents traitements et pour la position de la souris.
    Je passe par un champ Table dans lequel j'ai pas mal de colonnes, ensuite avec un simple TableSelect j'ai plus qu'à mettre le nom de la colonne qui contient la bonne donnée.

    Par exemple j'y ai même mis les altitudes des champs puisque lors d'un clonage d'un champ l'altitude est incrémentée à chaque fois. Ça pose des problèmes de superposition quand on déplace les champs alors j'ai du insérer une boucle pour changer l'altitude du champ "actif".

    Après pour l'indirection si ça fonctionne sans tant mieux. Mais de mémoire je crois que c'est parce que j'utilise différentes variables. Ici on manipule juste des champs images avec les indices du tableau mais dans mon programme je donne des noms spécifiques venant de différentes variables. Ça me permet d'utiliser la même procédure à différents endroits de mon programme.

    Je le répète mon code est là à titre d'exemple, ensuite chacun peut le modifier à sa convenance pour que ça corresponde à ce qu'il veut faire.
    Mieux vaut un petit lien qu'un long discours.

Discussions similaires

  1. [2.x] [Form]Création dynamique de champs
    Par Philoulheinz dans le forum Symfony
    Réponses: 2
    Dernier message: 16/09/2011, 11h39
  2. [MySQL] Création dynamique de champs dans une table
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/05/2011, 11h09
  3. [AC-2000] création dynamique de champ
    Par devalender dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/04/2009, 10h11
  4. Création dynamique de champs de saisie
    Par mjp dans le forum Langage
    Réponses: 3
    Dernier message: 03/04/2008, 23h08
  5. [DOM] création dynamique de champs
    Par Ekik dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/01/2007, 10h11

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