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 :

Drag and Drop


Sujet :

C++Builder

  1. #1
    Invité
    Invité(e)
    Par défaut Drag and Drop
    Bonjour,

    Je voudrais mettre en place un drag and drop sur Borland seulement verticale ou horizontal. Mais le probleme c'est que je veux pas vérifier la position d'arrivé quand on relache l'objet mais pendant...

    Si quelqun aurait une idée...

    Merci,

  2. #2
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Peut-être en détaillant le Drag & Drop avec OnMouseDown, OnMouseMove et OnMouseUp.
    C'est juste idée...

    A plus !

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut seb2020
    Si c'est pour deplacer une Form en cliquant dessus, regarde ce post il y a une fonction qui le fait tres bien et dans toutes les directions

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Merci pour les réponses. J'arrive a faire le drag and drop de mon objet. Le truc c'est que je vais le faire que de droite a gauche ou de haut en bas.

    Je vais essayer la solution de henderson. Je vous tiens au courant mais si il y a d'autres idée ca pourrait etre pas mal

  5. #5
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    J'ai pris comme base de réflexion de déplacer des TPanel.
    J'utilise un TPanel *Mobile dont le parent est la Form (idem pour les Panels) pour matérialiser le déplacement.
    Au départ, Mobile n'est pas visible et je lui ai donné une teinte gris foncé.

    Voici quelques globales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool DragHorizontal = true;
    bool IsDragging = false;
    TPoint Start;
    TPoint Off;
    Pour chacun des TPanel que je vais déplacer, j'ai donné les événementielles suivantes :
    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
     
    void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Mobile->BoundsRect = ((TPanel*)Sender)->BoundsRect;
    Mobile->BringToFront();
    Mobile->Visible = true;
    IsDragging = true;
    Start = Point(X,Y); // pour garder l'offet de départ au cas où
    Off = Point(X,Y); // l'offset en cours
    }
     
     
    void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(IsDragging)
        {
        if(DragHorizontal)
            {
            Mobile->SetBounds(Mobile->Left + X - Off.x,
                              Mobile->Top,
                              Mobile->Width,
                              Mobile->Height);
            }
        else
            {
            Mobile->SetBounds(Mobile->Left,
                              Mobile->Top + Y - Off.y,
                              Mobile->Width,
                              Mobile->Height);
            }
        Off = Point(X,Y);
        }
    }
     
    void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(IsDragging)
        {
        IsDragging = false;
        Mobile->Visible = false;
        // Réflexion à suivre...
        //....
        //Si l'objet doit se placer bêtement à l'endroit du Mobile 
        //mais sur le même Parent :
        ((TPanel*)Sender)->BoundsRect = Mobile->BoundsRect;
        }
    }
    A plus !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    je vais voir tout ca et je te redis

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut,

    J'aurais besoin de quelque indication:
    -Mobile c'est quoi ?
    -Tu as combien de TPanel ?

    Merci

    Edit : Je te mets le code source de ma fenetre : ( oui je sais il y a moyen de faire beaucoup plus simple mais bon... )

    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
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "ufmGameRushHour.h"
    #include "ufmResultRushHour.h"
    #include "ufmOptionRushHour.h"
    #include "ufmCommentJouerRushHour.h"
    #include "ufmConnexionBDD.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFormGame *FormGame;
     
     
    int Depart_H;
    int Depart_V;
    int temps;
    int NbreCoupsJoue;
    int TempsEnCours;
     
    //---------------------------------------------------------------------------
    __fastcall TFormGame::TFormGame(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------      
    void __fastcall TFormGame::Quitterlejeu1Click(TObject *Sender)
    {
    Application->Terminate();
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TFormGame::TimerHorlogeTimer(TObject *Sender)
    {
    StatusTime->Panels->Items[0]->Text = "Il est:" + Time();
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::FormClose(TObject *Sender, TCloseAction &Action)
    {
    	Application->Terminate();
     
    	//efface la table jeu_encours quand on ferme le programme
     
    	DataModule1->ADOQueryDeplacement->Close();
    	DataModule1->ADOQueryDeplacement->SQL->Clear();
    	DataModule1->ADOQueryDeplacement->SQL->Add("TRUNCATE tbl_encours;");
    	DataModule1->ADOQueryDeplacement->ExecSQL();
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::ButtonResultsClick(TObject *Sender)
    {
    FormResult->ShowModal();
    TimerEnCours->Enabled = false;
    TimerTimeRestant->Enabled = false;
    }
    //---------------------------------------------------------------------------        
    void __fastcall TFormGame::OptionsduJeu1Click(TObject *Sender)
    {
    FormOptions->ShowModal();
    }
    //----------------------------------------------------------------------------
    void __fastcall TFormGame::JVoiture1StartDock(TObject *Sender,
    	  TDragDockObject *&DragObject)
    {
    TImage* NomVoiture_D;
     
    NomVoiture_D = dynamic_cast<TImage *>(Sender);
     
    //fonction qui passe en parametre la position de depart de la voiture
    PositionStartDock(NomVoiture_D->Left, NomVoiture_D->Top, NomVoiture_D);
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::PositionStartDock(int X_Depart, int Y_Depart, TImage* NomVoiture_D)
    {
    //mise en place des coordonees de depart de la voiture
    Depart_H = NomVoiture_D->Left;
    Depart_V = NomVoiture_D->Top;
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::JVoiture1EndDock(TObject *Sender, TObject *Target,
    	  int X, int Y)
    {
    TImage* NomVoiture_A;
     
    NomVoiture_A = dynamic_cast<TImage *>(Sender);
     
    //fonction qui passe en parametre la position de fin de la voiture
    PositionEndDock(NomVoiture_A->Left,NomVoiture_A->Top, NomVoiture_A);
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::PositionEndDock(int X_Arrive, int Y_Arrive, TImage* NomVoiture_A)
    {
    	AnsiString Arrive_H;
    	AnsiString Arrive_V;
    	AnsiString Depart_H_2;
    	AnsiString Depart_V_2;
     
    	Depart_V_2 = IntToStr(Depart_V);
    	Depart_H_2 = IntToStr(Depart_H);
    	Arrive_H = IntToStr(X_Arrive);
    	Arrive_V = IntToStr(Y_Arrive);
     
    	NbreCoupsJoue = NbreCoupsJoue + 1;
     
    	DataModule1->ADOQueryDeplacement->Close();
    	DataModule1->ADOQueryDeplacement->SQL->Clear();
    	DataModule1->ADOQueryDeplacement->SQL->Add("INSERT INTO tbl_encours (Coups_D_H, Coups_D_V, Coups_A_H, Coups_A_V, Voiture) VALUES ('"+Depart_H_2+"', '"+Depart_V_2+"', '"+Arrive_H+"', '"+Arrive_V+"', '"+NomVoiture_A->Name+"');");
    	DataModule1->ADOQueryDeplacement->ExecSQL();
     
    	if (! NomVoiture_A->Floating)
    	{  	
    		if (JVoiture1->Left >= 360 && JVoiture1->Top >= 342 || JVoiture1->Top <= 352 )
    		{
    			FinDuJeu();
    		}
    	}
     
    	if (NomVoiture_A->Name == "JVoiture1")
    	{
    		if (JVoiture1->Top != Depart_V)
    		{
    			ShowMessage("deplacement non autorise");
    			JVoiture1->Top = Depart_V;
    			JVoiture1->Left = Depart_H;
    		}
    	}
    	if (NomVoiture_A->Name == "JVoiture2")
    	{
    		if (JVoiture2->Left != Depart_H)
    		{
    			ShowMessage("deplacement non autorise");
    			JVoiture2->Top = Depart_V;
    			JVoiture2->Left = Depart_H;
    		}
    	}
    	if (NomVoiture_A->Name == "JVoiture3")
    	{
    		if (JVoiture3->Left != Depart_H)
    		{
    			ShowMessage("deplacement non autorise");
    			JVoiture3->Top = Depart_V;
    			JVoiture3->Left = Depart_H;
    		}
    	}
    	if (NomVoiture_A->Name == "JVoiture4")
    	{
    		if (JVoiture4->Left != Depart_H)
    		{
    			ShowMessage("deplacement non autorise");
    			JVoiture4->Top = Depart_V;
    			JVoiture4->Left = Depart_H;
    		}
    	}
    	if (NomVoiture_A->Name == "JVoiture5")
    	{
    		if (JVoiture5->Top != Depart_V)
    		{
    			ShowMessage("deplacement non autorise");
    			JVoiture5->Top = Depart_V;
    			JVoiture5->Left = Depart_H;
    		}
    	}
     
     
    	// Traitement dans le cas où l'image sort de la fenêtre
     
    	if (NomVoiture_A->Floating)
    	{	NomVoiture_A->Parent = FormGame;
     
    		NomVoiture_A->Top = Depart_V;
    		NomVoiture_A->Left =Depart_H;
     
    	}
     
    	JVoiture1->DragMode = dmManual;
    	JVoiture1->DragKind = dkDrag;
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::FinDuJeu()
    {
    	FormGame->Hide();
    	AnsiString Pseudo;
    	AnsiString temp;
    	AnsiString NJeu;
    	AnsiString Temps;
     
    	Pseudo = LaNom->Caption;
    	temp = FormOptions->DBLookupComboBox1->KeyValue;
    	NJeu = temp.SubString(0,2);
     
    	if (TimerEnCours->Enabled == true)
    	{
    		Temps = LaTime->Caption;
    	}
    	else
    	{
    		AnsiString Temps_temp;
    		Temps_temp = LaTime->Caption ;
    		Temps = 200 - StrToInt(Temps_temp);
    	}
     
    	DataModule1->ADOQueryResult->Close();
    	DataModule1->ADOQueryResult->SQL->Clear();
    	DataModule1->ADOQueryResult->SQL->Add("INSERT INTO tbl_score (Pseudo, NJeu, Temps) VALUES ('"+Pseudo+"', '"+NJeu+"', '"+Temps+"');");
    	DataModule1->ADOQueryResult->ExecSQL();
     
    	ShowMessage("Bravo ! Vous avez fini le Rush Hour");
    	FormResult->Show();
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::ImgPlayClick(TObject *Sender)
    {
    MediaPlayer->Play();	
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TFormGame::ImgStopClick(TObject *Sender)
    {
    MediaPlayer->Stop();
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    LaPosition->Caption = "Largeur: " + IntToStr(X) + " Hauteur: " + IntToStr(Y);
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::About1Click(TObject *Sender)
    {
    FormCommentJouer->ShowModal();
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::TimerTimeRestantTimer(TObject *Sender)
    {
    if (temps != 0)
    {
    	temps = temps - 1;
    	LaTime->Caption = temps;
    	ProgressBarTime->Position = ProgressBarTime->Position - 1;
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormGame::FormShow(TObject *Sender)
    {
     
    	temps = 0;
    	TempsEnCours = 0;
     
    	// Pour que la fenêtre accepte le drag and drop, ces paramètres
    	// sont nécessaires
    	// DockSite : pour valider l'action drag and drop dans la fenêtre
    	// ManualDock: pour indiquer l'objet de départ du drag et l'objet d'arrivée du drop
    	FormGame->DockSite = true;
    	FormGame->ManualDock(FormGame,FormGame,alClient);
     
    	// Nous choissons de rendre les voitures immédiatement déplaçable
    	// de manière automatique
       //	JVoiture1->DragMode = dmAutomatic;
       //	JVoiture1->DragKind = dkDock;
     
    	JVoiture2->DragMode = dmAutomatic;
    	JVoiture2->DragKind = dkDock;
     
    	JVoiture3->DragMode = dmAutomatic;
    	JVoiture3->DragKind = dkDock;
     
    	JVoiture4->DragMode = dmAutomatic;
    	JVoiture4->DragKind = dkDock;
     
    	JVoiture5->DragMode = dmAutomatic;
    	JVoiture5->DragKind = dkDock;
     
    	AnsiString temp;
     
    	temp = FormOptions->DBLookupComboBox1->KeyValue;
     
    	AnsiString Niveau;
     
    	if (temp == "")
    	{
    	Niveau = 1;
    	}
    	else
    	{
    	Niveau = temp.SubString(0,2);
    	}
     
    	DataModule1->ADOQueryGame->Close();
    	DataModule1->ADOQueryGame->SQL->Clear();
    	DataModule1->ADOQueryGame->SQL->Add("SELECT * ");
    	DataModule1->ADOQueryGame->SQL->Add("FROM tbl_jeu");
    	DataModule1->ADOQueryGame->SQL->Add("WHERE PKNJeu = '"+Niveau+"';");
    	DataModule1->ADOQueryGame->Open();
     
    	int Voiture1_H;
    	Voiture1_H = DataModule1->ADOQueryGame->FieldValues["JVoiture1_H"];
    	int Voiture1_V;
    	Voiture1_V = DataModule1->ADOQueryGame->FieldValues["JVoiture1_v"];
     
    	int Voiture2_H;
    	Voiture2_H = DataModule1->ADOQueryGame->FieldValues["JVoiture2_H"];
    	int Voiture2_V;
    	Voiture2_V = DataModule1->ADOQueryGame->FieldValues["JVoiture2_v"];
     
    	int Voiture3_H;
    	Voiture3_H = DataModule1->ADOQueryGame->FieldValues["JVoiture3_H"];
    	int Voiture3_V;
    	Voiture3_V = DataModule1->ADOQueryGame->FieldValues["JVoiture3_v"];
     
    	int Voiture4_H;
    	Voiture4_H = DataModule1->ADOQueryGame->FieldValues["JVoiture4_H"];
    	int Voiture4_V;
    	Voiture4_V = DataModule1->ADOQueryGame->FieldValues["JVoiture4_v"];
     
    	int Voiture5_H;
    	Voiture5_H = DataModule1->ADOQueryGame->FieldValues["JVoiture5_H"];
    	int Voiture5_V;
    	Voiture5_V = DataModule1->ADOQueryGame->FieldValues["JVoiture5_v"];
     
     
     
    	JVoiture1->Left = Voiture1_H;
    	JVoiture1->Top = Voiture1_V;
     
    	JVoiture2->Left = Voiture2_H;
    	JVoiture2->Top = Voiture2_V;
     
    	JVoiture3->Left = Voiture3_H;
    	JVoiture3->Top = Voiture3_V;
     
    	JVoiture4->Left = Voiture4_H;
    	JVoiture4->Top = Voiture4_V;
     
    	JVoiture5->Left = Voiture5_H;
    	JVoiture5->Top = Voiture5_V;
     
     
    	//TimerTimeRestant->Interval = DataModule1->ADOQueryGame->FieldValues["JTime"];
    	temps = DataModule1->ADOQueryGame->FieldValues["JTime"];
     
    	AnsiString Difficulte;
     
    	Difficulte =  DataModule1->ADOQueryGame->FieldValues["JDifficult"];
     
    	if ( Difficulte == "facile")
    	{
    	TimerEnCours->Enabled = true;
    	TimerTimeRestant->Enabled = false;
    	ProgressBarTime->Position = 0;
    	}
    	else
    	{
    	TimerTimeRestant->Enabled = true;
    	TimerEnCours->Enabled = false;
    	ProgressBarTime->Max = temps;
    	ProgressBarTime->Min = 0;
    	ProgressBarTime->Position =  temps;
    	}
    }
    Dernière modification par Invité ; 21/01/2008 à 09h44.

  8. #8
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Mobile est un TPanel (rajouté sur la fiche comme tout le reste).
    Sa propriété Visible est sur false parce qu'il ne sera visible que lors de la manoeuvre.
    J'ai autant de Panels que nécessaire... dans la mesure où je raisonne avec des TPanel.
    Comme je ne sais pas ce que tu dois faire ni de quel type sont tes objets..., j'en suis là !

    A plus !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pour information, je dois réaliser un Rush Hour. Je ne sais pas si tu connais. Enfaite ou je bloque, c'est pour deplacer les voiture seulement verticale ou horizontale. Mais je vais tester ta technique en esperant que cela marche.

    Mes voitures sont toutes des images

    Voila

  10. #10
    Invité
    Invité(e)
    Par défaut
    Alors personne n'a une idee ?

  11. #11
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Tes voitures sont dessiner sur quel composant? Sur le canvas de ta Form? Elles sont dessiner dans plusieurs composants ou toutes dans le même?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Salut,

    Mes voitures sont toutes des images que j'ai mis moi meme en place. Il y en a 5

  13. #13
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Juste pour être certain, tu as cinq (5) composants TImage sur ta Form?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Salut,

    Oui j'ai 5 voiture sur ma form. Les positions des voitures sont dans une base de donnée. Chaque fois qu'on deplace une voiture ca position de depart et d'arrive est stocké dans la base de donnée.

    Je te mets un screenshoot de la form de jeu :


  15. #15
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Si on raisonne par cases, il suffit de vérifier si l'offset (en termes de cases) est conforme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    dx = newpos.x - oldpos.x;
    dy = newpos.x - oldpos.y;
     
    if( ((dx == 0) && (abs(dy) == 1)) ||  //Nord ou Sud
        ((dy == 0) && (abs(dx) == 1)) ) // Est ou Ouest
        {
        //REM : Image->BoundsRect
        }
    Ensuite, je suppose qu'il faut vérifier si l'objet couvre un autre objet.
    L'interception des objets (ici rectangulaires) se calcule à l'aide de leurs BoundsRect.

    Sinon, juste pour info :
    Les objets ont-ils un sens de déplacement qui leur est propre ?
    Les objets peuvent-ils changer de sens ?

    A plus !

  16. #16
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Sinon, la solution avec les événementielles de la souris est à améliorer (au cas où).
    Il s'agit de rajouter un petit mécanisme dans la OnMouseMove qui va détecter le sens à partir des premiers événements.
    Tant que ce sens n'est pas défini, rien ne se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool DirDetect;
    bool IsMoving;
    bool SensHorizontal;
    TPoint Start;
    Dans la OnMouseDown :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DirDetect = true;
    IsMoving = false;
    Start = Point(X,Y);
    Dans la OnMouseMove :

    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
     
    if(DirDetect)
        {
        int dx = abs(X - Start.x);
        int dy = abs(Y - Start.y);
        if((dx > 3) || (dy > 3)) // A ajuster ???
            {
            SensHorizontal = (dx >= dy);
            IsMoving = true;
            DirDetect = false;
            }
        }
    else
        {
        if(IsMoving)
            {
            if(SensHorizontal)
                {
                // On bride en y
                }
            else
                {
                // On bride en x 
                }
            }
        }
    A plus !

  17. #17
    Invité
    Invité(e)
    Par défaut
    Salut,

    Merci pour vos reponses je vais essayer cela. Oui mais voitures ont un sens defini si la voiture est verticale ben le sens est verticale, sinon pour horizontale c'est horizontal. Et oui ensuite je dois tester si il y a une voiture peut avancer car la voie est libre ou non

    Par contre pour ton code, faudrait que tu m'expliques un peu car j'ai pas tout compris. Le TPoint c'est quoi ?

    Je viens d'essayer. Mais cela ne marche pas. Enfaite j'ai mit un point d'arret mais des que je clique sur la voiture je ne vais pas dans la fonction...
    Dernière modification par Invité ; 26/01/2008 à 19h15.

  18. #18
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Peut-être que c'est encore plus simple !
    Voici ce que j'ai testé avec 5 TPanels sur la fiche (ça fonctionne aussi avec des TImage).
    Dans la classe de TForm1 j'ai rajouté (dans la partie public):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bool IsMoving;
    bool Vertical;
    // Pour la mise en liste des objets
    TList *Panels;
    TPoint Start;
    //Une méthode pour calculer l'interception
    TPanel* __fastcall Intercept(TPanel *Panel, TPoint P);
    Dans le constructeur de la form, j'ai mis mes 5 panels en liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Panels = new TList;
    Panels->Add(Panel1);
    Panels->Add(Panel2);
    Panels->Add(Panel3);
    Panels->Add(Panel4);
    Panels->Add(Panel5);
    }
    Mes 5 panels se partagent les mêmes événementielles pour la souris :

    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
     
    void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    TPanel *Panel = (TPanel*)Sender;
    Vertical = (Panel->Height > Panel->Width);
    IsMoving = true;
    Start = Point(X,Y);
    }
     
     
    void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    TPanel *Panel = (TPanel*)Sender;
    TPoint P = Point(Panel->Left, Panel->Top);
    if(IsMoving)
        {
        if(Vertical)
            {
            P.y = P.y + Y - Start.y;
            }
        else
            {
            P.x = P.x + X - Start.x;
            }
        if(Intercept(Panel, P) != NULL)
            {
            ShowMessage("Collision");
            IsMoving = false;
            //A gérer plus en profondeur sans doute...
            //....
            }
        else
            {
            Panel->SetBounds(P.x, P.y, Panel->Width, Panel->Height);
            }
        }
    }
     
     
    void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(IsMoving)
        {
        IsMoving = false;
        //...
        //...
        }
    }
    Voici maintenant la méthode supplémentaire pour calculer l'interception entre deux objets.
    Cette méthode renvoie l'objet intercepté (au cas où...)
    En ce qui concerne les paramètres passés à la méthode :
    - Panel est l'objet que l'on fait glisser
    - P est un Point(x,y), ici, c'est le point (Left, Top) de destination du panel.


    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
     
    TPanel* __fastcall TForm1::Intercept(TPanel *Panel, TPoint P)
    {
    int left = P.x;
    int right = left + Panel->Width;
    int top = P.y;
    int bottom = top + Panel->Height;
    TRect C;
    TPanel *Cible;
    for(int j = 0; j < Panels->Count; j++)
        {
        Cible = (TPanel*)Panels->Items[j];
        if(Panel != Cible)
            {
            C = Cible->BoundsRect;
            if((left < C.Right) &&
               (right >= C.Left) &&
               (top < C.Bottom) &&
               (bottom >= C.Top)) return Cible;
            }
        }
    return NULL;
    }
    Comme on utilise un TList créé dynamiquement, il faudra le détruire dans la OnClose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(Action == caFree)
        {
        Panels->Clear();
        delete Panels;
        }
    A plus !

  19. #19
    Invité
    Invité(e)
    Par défaut
    Salut,

    Je viens de tester ta solution sur un nouveau projet. Cela marche niquelle. Mais voila j'ai essayé dans mon code mais j'ai des probleme. J'ai adapte mon code au tien mais je bloque pas mal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPanel* __fastcall Intercept(TPanel *Panel, TPoint P);
    A la place de TPanel* je mets TImage* ? Et dans les parametres ?

    Je mets TList *Images ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Panels = new TList;
    Panels->Add(Panel1);
    Panels->Add(Panel2);
    Panels->Add(Panel3);
    Panels->Add(Panel4);
    Panels->Add(Panel5);
    Je mets a la place Images->Add(NomDeMonIMage1); ?

    Et mon dernier probleme (enfin je crois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPanel *Panel = (TPanel*)Sender;
    Je mets quoi ?

    Voila je crois que c'est tout !!

    En tout cas MERCI

  20. #20
    Invité
    Invité(e)
    Par défaut
    Salut,

    Voici des nouvelles du front. Voila le code modifier dans mon projet :

    Ca c'est le .cpp
    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
    void __fastcall TFormGame::JVoiture1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    TImage *Images = (TImage*)Sender;
    Vertical = (Images->Height > Images->Width);
    IsMoving = true;
    Start = Point(X,Y);
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TFormGame::JVoiture1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    TImage *Images = (TImage*)Sender;
    TPoint P = Point(Images->Left, Images->Top);
    if(IsMoving)
        {
        if(Vertical)
            {
            P.y = P.y + Y - Start.y;
            }
        else
            {
            P.x = P.x + X - Start.x;
            }
        if(Intercept(Images, P) != NULL)
            {
            ShowMessage("Collision");
            IsMoving = false;
            //A gérer plus en profondeur sans doute...
            //....
            }
        else
            {
            Images->SetBounds(P.x, P.y, Images->Width, Images->Height);
            }
        }
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TFormGame::JVoiture1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    if(IsMoving)
        {
        IsMoving = false;
        //...
        //...
        }
     
    }
    //---------------------------------------------------------------------------
    TImage* __fastcall TFormGame::Intercept(TImage *Image, TPoint P)
    {
    int left = P.x;
    int right = left + Images->Width;
    int top = P.y;
    int bottom = top + Images->Height;
    TRect C;
    Timage *Cible;
    for(int j = 0; j < Images->Count; j++)
        {
    	Cible = (TImages*)Images->Items[j];
    	if(Images != Cible)
            {
    		C = Cible->BoundsRect;
            if((left < C.Right) &&
               (right >= C.Left) &&
               (top < C.Bottom) &&
               (bottom >= C.Top)) return Cible;
            }
        }
    return NULL;
    }

    et le .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public:		// Déclarations de l'utilisateur
     
    	__fastcall TFormGame(TComponent* Owner);
     
    	bool IsMoving;
    	bool Vertical;
    	// Pour la mise en liste des objets
    	TList *Images;
    	TPoint Start;
    	//Une méthode pour calculer l'interception
    TImage* __fastcall TFormGame::Intercept(TImage *Image, TPoint P);

    Mais le probleme c'est que ca compile plus. Voila les erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [C++ Erreur] ufmGameRushHour.cpp(466): E2316 'Width' n'est pas un membre de 'TList'
    [C++ Erreur] ufmGameRushHour.cpp(468): E2316 'Height' n'est pas un membre de 'TList'
    [C++ Erreur] ufmGameRushHour.cpp(470): E2451 Symbole 'Timage' non défini
    [C++ Erreur] ufmGameRushHour.cpp(470): E2451 Symbole 'Cible' non défini
    [C++ Erreur] ufmGameRushHour.cpp(473): E2451 Symbole 'TImages' non défini
    [C++ Erreur] ufmGameRushHour.cpp(473): E2188 Syntaxe de l'expression
    Pourrais-tu m'aider ? (Sinon deja MERCI pour la solution)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. "Drag and drop" avec directinput
    Par batosai dans le forum DirectX
    Réponses: 1
    Dernier message: 16/06/2004, 16h48
  3. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  4. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  5. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

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