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

Composants VCL Delphi Discussion :

Créer image a la volée disposant de la fonction drag n drop


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut Créer image a la volée disposant de la fonction drag n drop
    bonjour,

    mon code de drag n drop fonctionnel est pour l'image 3:



    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
    procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
        { Cette procédure initialise le processus. Elle permet de déterminer s'il
        s'agit d'un simple Click ou du début d'un Drag'n drop }
    begin
         Sliping := false;
         Image3.BeginDrag(false,3);{ false pour permettre de cliquer sans déplacer.
                                  Ici, commence à glisser après mouvement de 3 pixels.}
      XsurLab := X;
      YsurLab := Y;
    end;
     
    procedure TForm1.Image3DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    { Cette procédure permet d'éviter l'affreux glissement saccadé obtenu avec
        la méthode proposée par Borland dans l'aide en ligne }
    begin
         Sliping := true;
         Image3.Left := Image3.Left + (X - XsurLab);
         Image3.Top :=  Image3.Top  + (Y - YsurLab);
    end;
     
    procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
      { Cette procédure permet d'éviter la "perte" du compo lors d'un mouvement très
        rapide de la souris }
    begin
         Image3.Left := X - XsurLab;
         Image3.Top  := Y - YsurLab;
    end;
     
    procedure TForm1.Image3EndDrag(Sender, Target: TObject; X, Y: Integer);
      { Cette procédure permet d'effectuer l'action prévue lors du "OnClick" }
    begin
           If Sliping = false then
           beep;
    end;
    par contre si je veux pouvoir utiliser cette fonction pour plusieur j'ai plusieur méthode, soit la réécrire soit créer des images a la volée, afin que mon code soit optimisé mon choix se port sur la 2e possibilité... bien que la création d'image a la volé ne soit pas tres dur je ne sais vraiment pas comment mettre en place cette fonction pour toutes les images :s

    quelqu'un a une idée?

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Je te donne un exemple sur un, après tu feras les modifications en conséquences ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
      { Cette procédure permet d'éviter la "perte" du compo lors d'un mouvement très
        rapide de la souris }
    begin
      if Sender is TImage then
      begin
         TImage(Sender).Left := X - XsurLab;
         TImage(Sender).Top  := Y - YsurLab;
      end;
    end;
    Voial ^^

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    salut

    pour la creation a la volée il faut que tu ecrivent tes methode de facon generique afin de pouvoir les affecter

    exemple

    on va prendre la premiere methode que tu donne soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
    begin
       Sliping := false;
       Image3.BeginDrag(false,3);
       XsurLab := X;
       YsurLab := Y;
    end;
    apres transformation la methode devrais donner un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.OnImageMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
    begin
       Sliping := false;
       (Sender as Timage).BeginDrag(false,3);
       XsurLab := X;
       YsurLab := Y;
    end;
    au momment de la creation dynamique de ton image ne pas oublier d'affecter la methode creer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Imag := Timage.create ...
       ....
       Imag.MouseDown := OnImageMouseDown ;
       ....
    @+ Phil

  4. #4
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    alors avant de mettre tous mes code je doit d'abord les créer de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    picture1 := TImage.Create(Form1);
    	Form1.picture1.MouseDown := OnImageMouseDown ;
    	Form1.picture1.DragOver := OnDragOver ;
    	Form1.picture1.EndDrag := OnEndDrag ;
    picture2 := TImage.Create(Form1);
    	Form1.picture2.MouseDown := OnImageMouseDown ;
    	Form1.picture2.DragOver := OnDragOver ;
    	Form1.picture2.EndDrag := OnEndDrag ;
    picture3 := TImage.Create(Form1);
    	Form1.picture3.MouseDown := OnImageMouseDown ;
    	Form1.picture3.DragOver := OnDragOver ;
    	Form1.picture3.EndDrag := OnEndDrag ;
    ...
    exacte??

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    salut

    en gros oui mais j'aurait peut etre fait differement

    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 Tform1.affectDrag(Pict : TPicture);
    begin
      pict.MouseDown := OnImageMouseDown ;
      pict.DragOver := OnDragOver ;
      pict.EndDrag := OnEndDrag ;
    end;
    ...
     
      picture1 := TImage.Create(Form1);
      affectDrag(picture1);
      picture2 := TImage.Create(Form1);
      affectDrag(picture2);
      picture3 := TImage.Create(Form1);
      affectDrag(picture3);
      ....
      end;  
     ...
    @+ Phil

  6. #6
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Est ce qu'un tel code pourrais marcher?? je ne suis pas sur de ce qui est des attribut des images si elles vont bien s'affichier etc... d'apres vous?

    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
     
    //////////////////////////////////
    Procedure Tform1.affectDrag(Pict : TPicture);
    begin
      pict.MouseDown := OnImageMouseDown ;
      pict.DragOver := OnDragOver ;
      pict.EndDrag := OnEndDrag ;
    end; 
    //////////////////////////////////
    //////////////////////////////////
    procedure TForm1.Create(Sender: TObject);
      picture1 := TImage.Create(Form1);
      affectDrag(picture1);
      picture2 := TImage.Create(Form1);
      affectDrag(picture2);
     
     
         with picture1 do
              begin 
                   photo := Application.GetNamePath + '.\sprit\switch.jpg'; 
              if FileExists(photo) then 
                begin 
                   picture1.Picture.LoadFromFile(photo);
                   parent := Form1;
                   Visible := true;
                end 
              else ShowMessage('La photo est introuvable'); 
              end;
     
         with picture2 do
              begin 
                   photo := Application.GetNamePath + '.\sprit\routeur.jpg'; 
              if FileExists(photo) then 
                begin 
                   picture2.Picture.LoadFromFile(photo);
                   parent := Form1;
                   Visible := true;
                end 
              else ShowMessage('La photo est introuvable'); 
              end;
     
     
    end;
    //////////////////////////////////
    //////////////////////////////////
    procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
      { Cette procédure permet d'éviter la "perte" du compo lors d'un mouvement très
        rapide de la souris }
    begin
      if Sender is TImage then
      begin
         TImage(Sender).Left := X - XsurLab;
         TImage(Sender).Top  := Y - YsurLab;
      end;
    end; 
    //////////////////////////////////
    //////////////////////////////////
    procedure TForm1.OnImageMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
    begin
       Sliping := false;
       (Sender as Timage).BeginDrag(false,3);
       XsurLab := X;
       YsurLab := Y;
    end;
    //////////////////////////////////
    //////////////////////////////////
    procedure TForm1.OnImageDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    { Cette procédure permet d'éviter l'affreux glissement saccadé obtenu avec
        la méthode proposée par Borland dans l'aide en ligne }
    begin
         Sliping := true;
         (Sender as Timage).Left := (Sender as Timage).Left + (X - XsurLab);
         (Sender as Timage).Top :=  (Sender as Timage).Top  + (Y - YsurLab);
    end;
    //////////////////////////////////
    //////////////////////////////////
    procedure TForm1.OnImageEndDrag(Sender, Target: TObject; X, Y: Integer);
      { Cette procédure permet d'effectuer l'action prévue lors du "OnClick" }
    begin
           If Sliping = false then
           beep;
    end;
    //////////////////////////////////

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    salut

    modifie de facon a n'avoir qu'une fois le code identique

    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
     
    Prcedure TForm1.Affectpict(pict : Tpicture;Filename : string);
    begin
       with pict do
       begin
           photo := Application.GetNamePath +Filename ;
           if FileExists(photo) then
           begin
               picture1.Picture.LoadFromFile(photo);
                parent := Form1;
                Visible := true;
            end
            else ShowMessage('La photo est introuvable'); // j'aurait utiliser une ecxeption mais bon c'est toi qui voit
        end; 
    end
    ... 
     Affectpict(picture1,'\sprit\switch.jpg');// sans le point '.\sprit\switch.jpg'
     Affectpict(picture2 ,'\sprit\routeur.jpg');// '.\sprit\routeur.jpg'   
    ...
    cela te permet de ne modifier qu'une fois le code si il y a des modif a faire
    j'ai modifier ton chemin parcqu'avec le point ca risque de ne pas marcher


    @+ Phil

  8. #8
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    donc je remplace ma
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm1.Create(Sender: TObject);
    par ta
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Prcedure TForm1.Affectpict(pict : Tpicture;Filename : string);
    a tester si le tout marche nikel ! et autre problème, tform.affectpics n'apparait pas dans les évènement de le form1 dans le menu a gauche :s:s (delphi 6)

  9. #9
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    cest le gros bordel de les créée a l'arrache, chez moi ça me donne plein d'erreur a la con, je l'ai fait sur un projet vierge, vous pouvez voir :

    http://smiliesforum.free.fr/project.zip

  10. #10
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    bon a la limite je pourrais essayer de régler le probleme en utilisant les paramètre de dragover enddrag etc... que j'ai utilisé sur une image deja !

    par ailleurs, comment je pourrais faire pour gérer les colisions???

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    salut

    ouais c'est un sacree bordel

    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
    Tform1= class(Tform)
    ...
      picture1 : TImage;
      picture2 : TImage;
    end;
    ...
    procedure TForm1.Create(Sender: TObject);
    Begin
      picture1 := TImage.Create(Form1);
      Affectpict(picture1,'\sprit\switch.jpg'); // sans le point '.\sprit\switch.jpg'
      picture2 := TImage.Create(Form1);
      Affectpict(picture2 ,'\sprit\routeur.jpg'); // '.\sprit\routeur.jpg'    
    end;
     
    Procedure TForm1.Affectpict(pict : Tpicture;Filename : string);
    begin
       with pict do
       begin
           photo := Application.GetNamePath +Filename ;
           if FileExists(photo) then
           begin
               TImage(Sender).Picture.LoadFromFile(photo);
                parent := Form1;
                Visible := true;
            end
            else ShowMessage('La photo est introuvable'); // j'aurait utiliser une ecxeption mais bon c'est toi qui voit
        end;
       affectDrag(pict);
     
    end;
     
    Procedure Tform1.affectDrag(Pict : TPicture);
    begin
      pict.MouseDown := OnImageMouseDown ;
      pict.DragOver := OnDragOver ;
      pict.EndDrag := OnEndDrag ;
    end;
    ...
     
    end;
    pour la colision il te suffit de determiner si les zones on une intersection commune

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function collision(var collisionR : Trect;  rect1,rect2 : Trect) : Boolean ;
    begin 
       result := intersectrect(Collisionr,rect1,rect2);
    end;
    a toi de definir les zones que tu veut definir en intersection
    en regle generale
    on commence par une grosse boite et on affine si le resultat est vrai

    un exemple pous que tu comprenne sur un personnage on va definir le personnage comme une boite ensuite on divise le personnage en morceau
    la tete d'un cote le bras + main de l'autre ,le tronc ...
    une fois que l'on s'apercois qu'il y a un contact on refait le test sur les differente partie et ainsi de suite si par exemple on s'appercois que le contact et au niveau du bras on subdivise le bras en morceau avant bras ,coude ,...main.
    donc la main et representé par un carre si celle ci rencontre un autre element on divisera la main
    par 5 rectangle definisant las doigt pour savoir si efffectivement ceux si sont en contact et on decend de plus en plus en detail pour avoir la precision mais en reglegeneral les phalage suffise


    @+ Phil

  12. #12
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    ui j'ai compris, chez moi cest plus simple ce sont de simple recontagle, donc pour les dimensions cest facile =] mais apres avoir cette function, comme l'utiliser dans le code :s :s et dans quel procédure la metre? merci. . .

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    salut

    bin a mon avis... et ce n'est que le miens il faut que tu l'insert avant d'efectuer le mouvement tout en incrementant les valeurs avant affichage

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure Form1.deplace(Pict1,Pict2 : Timage;x,y : integer);
    var 
     zonecolission : Trect;
    begin
      if colission(zonecolission,bound(x,y,Pict1.heigth,Pict1.width),
      bound(Pict2.top,Pict2.left,Pict2.heigth,Pict2.width) Then 
        showmessage('impossible de deplacer l''image')
      else 
         affectdeplacementimage(Pict1);
    end;
    @+ Phil

Discussions similaires

  1. [PHP-JS] galerie d'images éxécutée à la volée
    Par Christophe93250 dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2007, 14h16
  2. Créer une option à la volée ds un select avec IE
    Par katchi dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/01/2007, 09h48
  3. [SVG] Modifier une image à la volée
    Par 18Marie dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 28/07/2006, 09h32
  4. image a la volée impossible :(
    Par avogadro dans le forum Delphi
    Réponses: 4
    Dernier message: 16/05/2006, 15h58
  5. créer image ISO
    Par vikz dans le forum C++
    Réponses: 14
    Dernier message: 07/02/2006, 21h53

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