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

C++Builder Discussion :

Selectionner une image dynamique parmi plusieurs (pb de pointeurs)


Sujet :

C++Builder

  1. #1
    Membre du Club Avatar de Revan777
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 87
    Points : 52
    Points
    52
    Par défaut Selectionner une image dynamique parmi plusieurs (pb de pointeurs)
    Bonjour,
    je souhaite créer une application graphique pour gérer un parc informatique.

    L'ajout de PC sur le réseau local se traduit par la création d'une image (un objet TImage crée en dynamique).
    Chaque image de PC pourra être déplacée sur la Form en maintenant le bouton de la souris appuyé.

    Mon problème :
    Si j'ajoute 2 PCs, lorsque je veux faire glisser l'image, seule la dernière créee bouge (même si j'ai cliqué sur une autre image).
    En fait, mon programme garde l'adresse du dernier objet crée et l'utilise lors des appels aux événements.
    Les adresses des objets sont empilées dans un composant TList mais je ne sais pas comment rediriger le pointeur sur la bonne adresse lors du clic sur une image...
    Il faudrait que lors de la sélection d'une image, le bon objet soit sélectionné.

    Ce n'est pas facile à expliquer comme ça.
    Je peux toujours vous envoyer mon début d'appli pour que ce soit plus simple...

    Voici un bout du code :

    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    // Création d'un nouvel icone et affectation des événements
       MonImage = new TImage(this);
       MonImage->Parent = Form1;
       MonImage->Picture->LoadFromFile(ExtractFilePath(Application->ExeName)+"pc1.ico");
       MonImage->Left = 30;
       MonImage->Top = 10;
       MonImage->OnMouseDown = ImageMouseDown;
       MonImage->OnMouseMove = DeplacementImage;
       MonImage->OnMouseUp = ImageMouseUp;
       MonImage->Height = 33;
       MonImage->Width = 33;
       MonImage->ShowHint = true;
       MonImage->Hint = "IP : 10.33.12.xxx";
       MonImage->PopupMenu = PopupMenu1;
    }
    J'ajoute ensuite les pointeurs dans un TList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Ajout du pointeur dans la liste
       listeImages->Add((void *)MonImage);
    Et voici l'événement appelé lors du déplacement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::DeplacementImage(TObject *Sender, TShiftState Shift,
              int X, int Y)
    {
        Actif = (TImage *)listeImages->Items[Edit3->Text.ToInt()];
     
        if(MoveFlag)
        {
        Actif->SetBounds(  Actif->Left + X - Movex,
                            Actif->Top + Y - Movey,
                            Actif->Width,
                            Actif->Height);
     
        }
    }
    Actif est un pointeur permettant de récupérer l'adresse du bon objet mais je le choisis manuellement (en informant un Edit avec l'indice de ma TList).
    C'est de la bidouille tant que je n'aurai pas trouvé comment rendre la sélection automatique.

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 437
    Points
    3 437
    Par défaut
    Salut,

    Tu peux toujours extends TImage avec ta propre classe, et ajouté dans cet objet le paramètre "identifiant".

    Ainsi, lorsque tu cliqueras sur ton image, tu pourras récupérer l'identifiant, et savoir quelle image bouger ?

    C'est une idée.

    A+

  3. #3
    Membre du Club Avatar de Revan777
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    J'avais pensé utiliser la donnée Tag de l'objet TImage mais là encore je ne vois pas comment je pourrais faire pour identifier l'image sélectionnée... le clic sur l'image ne faisant qu'appeler un événement...arf

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Le paramètre TObject *Sender est un pointeur sur l'objet qui a généré l'événement.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TImage *Cible = (TImage*)Sender;
    Cible->SetBounds(...);
    Ou bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((TImage*)Sender)->SetBounds(...);
    A plus !

  5. #5
    Membre du Club Avatar de Revan777
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    Oh ça marche !
    C'était simple, il fallait y penser Merci henderson.

    Maintenant il va falloir que j'associe mon objet avec une adresse IP et un nom d'hote, et conserver tout ça en mémoire... (une BDD ? un fichier ?) Idem pour la position des images sur l'écran qui doit etre conservée...

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    On peut très bien dériver de TImage pour ajouter les propriétés necessaires à l'objet.
    On peut utiliser une classe regroupant ces propriétés, en évitant les AnsiString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class jDonnees
    {
    public :
    char ID[20]; //ici c'est un exemple
    //...
    };
    Ensuite on dérive de TImage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class jImage : public TImage
    {
    public :
    jDonnees Donnees;
        __fastcall jImage(TComponent *Owner);
        __fastcall ~jImage();
    };
    Depuis une instance jImage on aura donc sous la main toutes les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jImage *Cible;
    Cible->Donnees.ID ...
    Pour le traitement avec un fichier, on sait que l'on aura à manipuler sizeof(jDonnees) octets donc probablement que les fonctions élémentaires pourraient suffire (fopen etc...)!

    C'est juste une idée !

    A plus !

  7. #7
    Membre du Club Avatar de Revan777
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    Je réouvre ce post m'étant remis sur le développement de cette application...

    Pourquoi faut-il éviter l'utilisation des AnsiString (j'en mets partout moi ) ?

    J'ai des problèmes quand je compile jImage (je dois oublier d'inclure quelque chose):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef jImage
    #define jImage
     
    class jImage : public TImage
    {
            public:
                    jDonnees Donnees;
                    __fastcall jImage(TComponent *Owner);  // 1ere erreur
                    __fastcall ~jImage();   // 2e erreur
    };
     
    #endif
    [C++ Erreur] jImage.h(8): E2293 ) attendue
    [C++ Erreur] jImage.h(9): E2272 Identificateur attendu
    [C++ Erreur] jImage.cpp(5): E2272 Identificateur attendu

  8. #8
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Ton jDonnees est connu dans ton header???

  9. #9
    Membre du Club Avatar de Revan777
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    Oui il est bien inclu dans jImage.cpp.
    J'arrive à le compiler lorsqu'il est retiré du projet seulement.
    Quand je le rajoute, il me remet les mêmes erreurs...

  10. #10
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,
    Juste une question surement stupide mais bon, ta classe jDonnees est bien déclarée en amont de celle de jImage ?

    @ +

Discussions similaires

  1. [Requêtes] Selectionner une seule date parmis plusieurs
    Par Herman dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 28/03/2007, 15h01
  2. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32
  3. [VB.NET] Afficher une image dynamiquement
    Par Sadneth dans le forum ASP.NET
    Réponses: 20
    Dernier message: 07/01/2005, 16h26
  4. [C#] ajouter une image dynamiquement
    Par h_imane dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/04/2004, 11h27
  5. [CR7] Insérer une image dynamiquement
    Par yoloosis dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 28/07/2003, 09h54

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