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 :

Afficher une TImage sur une TImage


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut Afficher une TImage sur une TImage
    Bonjour,

    J'ai un truc assez compliqué pour moi à réaliser, je ne vois pas trop par ou commencer !

    J'ai mit une carte de la Belgique dans une TImage.

    Je vais créer un fichier texte de ce genre de format:

    1,202,505,Bruxelles;
    2,202,808,Liège;

    etc.. je voudrais ajouter à la volée des petit drapeaux sur la carte pour représenter ces villes .. en fonction des coordonées X,Y fournies.

    Mais attention, les coordonées X,Y doivent être le coin supérieur gauche du TImage de la carte, et pas le coin supérieur gauche de la Form...

    Mettre dans le Hint de l'image le nom de la ville ( Bruxelles, Liège ..) et sur le OnClick une action avec l'ID style " Form2.execute(id); "

    Comment générer cela à la volée? je suis tout perdu !

    Merci

  2. #2
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    N'utilises pas TImage pour faire ça, c'est pas fait pour.

    Je te conseille plutot d'utiliser un TPaintBox (fait une recherche sur le forum avec mon pseudo, je l'explique un peu partout).

    Ce n'est pas plus compliqué.

    Dans ta Fiche, tu déclares une variable BitMap au niveau de la partie Public:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TForm1 = class(TForm)
      private
        { Déclarations privées }
        ....
        ....
        ....
      public
        { Déclarations publiques }
        ImageBelgique:TBitmap;
      end;
    Dans le OnCreate de ta fiche, tu crées le bitmap et le charge depuis le disque dur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ImageBelgique:= TBitmap.Create;  
      ImageBelgique.LoadFromFile('Belgique.bmp');
    end;
    Dans le OnDestroy de la fiche, tu libères le Bitmap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ImageBelgique.Free;  
    end;
    Dans l'évènement OnPaint de la PaintBox, tu écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.PaintBoxPaint(Sender: TObject);
    begin
      //Dessine la belgique dans la PAintBox en l'étirant pour prendre les dimensions  de la PaintBox
      PaintBox.Canvas.StretchDraw(PaintBox1.ClientRect, ImageBelgique);  
      //Dessine les drapeaux :
      PaintBox1.Canvas.penPos(202,505);
      PaintBox1.Canvas.lineto (222,485);
      PaintBox1.Canvas.TExtOut(222,485,'Bruxelles');
      //...
    end;

  3. #3
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    pourqoi pas faire les modif dans le bitmap crée et dans onpaint de painbox afficher simplement le bitmap???
    en plus pour tes evenement crée des au vollées des shapes en form de cercle ou carée et les positionnée au cordonée, leur affecter des evenemnt (onclick)

    EDIT
    voir: source

  4. #4
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Aussi oui, bien vu Edam

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Hello!

    Merci waskol !

    J'ai fait ceci:

    PaintBox1.Canvas.StretchDraw(PaintBox1.ClientRect, ImageBelgique);

    PaintBox1.Canvas.Ellipse(200,200,210,210);
    PaintBox1.Canvas.TextOut(220,200,'Bruxelles');

    Un petit point, suivis du nom !
    Mais comment faire une zone cliquable? :-)

    Merci

  6. #6
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par mickaelmediaprod
    Mais comment faire une zone cliquable? :-)
    Merci
    Bon, sans rentrer dans les API Windows, on va le faire comme ça :

    METHODE 1 :
    1) Dans le OnMouseMove, tu teste pour voir si la souris se trouve sur ta ville (c'est du à peu prêt); Quand a souris passe sur le cercle, le curseur change d'aspect (une main apparait) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
       if PtInRect(Rect(200,200,210,210),point(x,y)) //Bruxelle
    //  or PtInRect(Rect()),point(x,y))
    //  or PtInRect(Rect()),point(x,y))
    //  ....
    //  or PtInRect(Rect()),point(x,y))
       then Cursor:=crHandPoint else cursor:=crDefault;
    end;
    2) Si l'utilisateur clique sur la PaintBox (OnClick), c'est presque le même code sauf que l'on déclenche une action spécifique à chaque "cercle" :
    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 TForm1.PaintBox1Click(Sender: TObject);
    var UnPoint:TPoint;
    begin
      //Récupère les coordonnées de la souris sur l'écran
      UnPoint:=Mouse.CursorPos;
      //Les transforme en coordonnées de la PaintBox
      UnPoint:=PaintBox1.ScreenToClient(UnPoint);
     
      //Et en fonction de ça, on effectue une action selon le point
      //se trouve dans tel ou tel rectangle :
     
      //Bruxelles
      if PtInRect(Rect(200,200,210,210),UnPoint) then showmessage('Bruxelle');
      //Autre Ville
      //if PtInRect(Rect(...),UnPoint) then Une_Action (Afficher un message, appeler une fonction, etc...)
    end;

    METHODE 2 :
    On peut aussi, en tirant parti de ce qu'offre Windows, définir des régions

    1) Tu les déclare ici, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TForm1 = class(TForm)
      private
        { Déclarations privées }
        ....
        ....
        ....
      public
        { Déclarations publiques }
        ImageBelgique:TBitmap;
        //Déclaration des régions
        Region1,Region2,Region3:HRGN;
        //ou bien comme ça (sous forme de tableau) :
        //Regions:array[1..n] of HRGN;
      end;
    2) Puis tu les crées ici (OnCreate)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ImageBelgique:= TBitmap.Create;  
      ImageBelgique.LoadFromFile('Belgique.bmp');
      //On creee des régions elliptique, qui ont les mêmes 
      //coordonnées que tes ellipses qui correspondent à tes villes
      Region1:=CreateEllipticRgn(200,200,210,210);
      Region2:=CreateEllipticRgn(....);
      ...
    end;
    Tu peux aussi creer des régions, en forme de Rectangle (CreateRectRgn)
    en forme de polygones (CreatePolygonRgn), combiner deux regions (CombineRgn) pour n'en faire qu'une (union, intersection).
    Pour tout ça, rapporte toi à l'aide fourni dans Delphi (Menu Aide-->SDK Windows), et tu recherche les mots-clés "Region Functions".

    3)
    Pour changer le curseur dans la PaintBox, si la souris passe au dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if PtInRegion(Region1,x,y) //Bruxelle
    //  or PtInRegion(Region2,x,y)
    //  ....
    //  or PtInRegion(RegionN,x,y)
       then Cursor:=crHandPoint else cursor:=crDefault;
    end;
    Et puis si tu cliues dans la PaintBox :
    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
    procedure TForm1.PaintBox1Click(Sender: TObject);
    var UnPoint:TPoint;
    begin
      //Récupère les coordonnées de la souris sur l'écran
      UnPoint:=Mouse.CursorPos;
      //Les transforme en coordonnées de la PaintBox
      UnPoint:=PaintBox1.ScreenToClient(UnPoint);
     
      //Et en fonction de ça, on effectue une action selon le point
      //se trouve dans telle ou telle région :
     
      With UnPoint do
      begin
        //Bruxelles
        if PtInRegion(Region1,x,y) then showmessage('Bruxelle');
        //Autre Ville
        //if PtInRegion(RegionN,x,y) then Une_Action;
      end;
    end;
    Bref, tu peux améliorer tout ça en travaillant avec des tableaux...

    Bon dev

  7. #7
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par edam
    pourqoi pas faire les modif dans le bitmap crée et dans onpaint de painbox afficher simplement le bitmap???
    en plus pour tes evenement crée des au vollées des shapes en form de cercle ou carée et les positionnée au cordonée, leur affecter des evenemnt (onclick)

    EDIT
    voir: source

  8. #8
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par waskol
    Dans l'évènement OnPaint de la PaintBox, tu écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.PaintBoxPaint(Sender: TObject);
    begin
      //Dessine la belgique dans la PAintBox en l'étirant pour prendre les dimensions  de la PaintBox
      PaintBox.Canvas.StretchDraw(PaintBox1.ClientRect, ImageBelgique);  
      //Dessine les drapeaux :
      PaintBox1.Canvas.penPos(202,505);
      PaintBox1.Canvas.lineto (222,485);
      PaintBox1.Canvas.TExtOut(222,485,'Bruxelles');
      //...
    end;
    la tu as proposé de dessinée l'image initiale a une autre taille, alors .....!!!!

  9. #9
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Si la PaintBox a la même taille que l'image de la belgique, ça ne change pas la taille de l'image.

    Mais au départ, rien ne dit si sa zone de dessin doit avoir la taille de son image...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Wouaaaa ! Merci Waskol ! J'avance à grand pas !
    (enfin, à grand pas d'escargots )

    Je suis arrivé à faire un truc chouette avec la version 2.

    Reste à présent à ouvrir mon fichier texte, et le mettre dans le tableau Regions[] ...

    Ce sertait plus simple avec un fichier texte que j'ouvre et je m'arrange pour tout tapper dans un tableau ?

    Exemple:
    330,200,Bruxelles,192.168.1.1;
    500,150,Soignies,192.168.1.2;

    Ou bien j'essaie d'utiliser un IniFiles avec
    [Bruxelles]
    X=330
    Y=200
    IP=192.168.1.2

    Mais le nombre de Items dans l'inifiles n'est pas connu donc.. il me faudra trouver moyen de faire un Count.. puis un For :s en fonction du nombre de [VILLE] trouvés..

    qu'en pensez vous ?

  11. #11
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    tu peut crée une fenetre pour insére tes cordonnée avec deux solut:
    1-stringgrid+fichier typé
    2-dbgrid+clientdataset puis enregistre dans unfichier binaire (c'est le plus rapide)

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. Afficher le résultat d'une requête sur une ligne
    Par cmako dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/08/2008, 14h37
  3. Afficher la valeur d'une cellule sur une image
    Par alex830001 dans le forum Excel
    Réponses: 2
    Dernier message: 02/07/2008, 11h07
  4. Réponses: 5
    Dernier message: 18/07/2006, 15h32
  5. Afficher un bouton appartenant à une classe sur une form
    Par Julien_riquelme dans le forum Composants VCL
    Réponses: 2
    Dernier message: 05/09/2005, 13h10

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