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,![]()

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,![]()
Salut !
Peut-être en détaillant le Drag & Drop avec OnMouseDown, OnMouseMove et OnMouseUp.
C'est juste idée...
A plus !
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

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
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 :
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 bool DragHorizontal = true; bool IsDragging = false; TPoint Start; TPoint Off;
A plus !
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; } }

Salut,
je vais voir tout ca et je te redis![]()

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 à 10h44.
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 !

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![]()

Alors personne n'a une idee ?
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?

Salut,
Mes voitures sont toutes des images que j'ai mis moi meme en place. Il y en a 5
Juste pour être certain, tu as cinq (5) composants TImage sur ta Form?

Salut !
Si on raisonne par cases, il suffit de vérifier si l'offset (en termes de cases) est conforme.
Ensuite, je suppose qu'il faut vérifier si l'objet couvre un autre objet.
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 }
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 !
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 :
Dans la OnMouseDown :
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 OnMouseMove :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 DirDetect = true; IsMoving = false; Start = Point(X,Y);
A plus !
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 } } }

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 à 20h15.
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):
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 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);
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 __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); }
Voici maintenant la méthode supplémentaire pour calculer l'interception entre deux objets.
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; //... //... } }
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.
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
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; }
A plus !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if(Action == caFree) { Panels->Clear(); delete Panels; }

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.
A la place de TPanel* je mets TImage* ? Et dans les parametres ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TPanel* __fastcall Intercept(TPanel *Panel, TPoint P);
Je mets TList *Images ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TList *Panels;
Je mets a la place Images->Add(NomDeMonIMage1); ?
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);
Et mon dernier probleme (enfin je crois)
Je mets quoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TPanel *Panel = (TPanel*)Sender;
Voila je crois que c'est tout !!
En tout cas MERCI![]()

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 :
Pourrais-tu m'aider ? (Sinon deja MERCI pour la solution)
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
Partager