Déplacer un objet dans son parent - test de rencontre (collision)

Soyez le premier à donner votre avis sur cette source.

Vue 9 870 fois - Téléchargée 928 fois

Description

Les TShape se trouvant dans un TPanel peuvent être déplacés, dans cet exemple. Si un TShape rencontre un autre TShape, il le recouvre en se mettant au premier plan.

Pour répondre à une question posée sur le forum ici:
http://www.delphifr.com/forum.v2.aspx?rm=1&ID=444697

Contrairement à mon habitude, je n'ai pas trop commenté le code.
J'y reviendrai plus tard.

Mais en gros :

La procedure "Deplace(Control: TObject; X, Y: Integer)" s'applique à tout les contrôles.
La procedure "SiToucheRecouvre(Shape: TShape; X,Y: Integer)" n'est pas complètement optimisée à mon avis et gère actuellement les TShape.

Il y a d'autres approches, il s'agissait surtout de faire une démonstration de déplacement d'objets.


J'ai ajouté les commentaires détaillés dans Unit1.pas.
Je sais que certains n'aiment pas, mais il s'agit d'un code source à but didactique. ;-)
Ah oui, je n'ai pas renommé explicitement mes composants.
Mais ici, ça ne s'impose vraiment pas, à mon avis !

Bonne prog' :-p


Mise à jour du 3 mai 2005.

Correction du calcul de collision entre les shapes.
Le test de collision fonctionnait bien, mais l'approche était moins logique.

Désolé pour ceux qui ont déjà téléchargé.


3 mai 2005

Nouvelle (et dernière ?) mise à jour.
J'avais oublié de tenir compte de la Marge pour les valeurs empêchant la sortie à gauche et en haut.
La marge étant à 0 dans l'exemple, ça n'avait pas d'incidence sur le comportement.
De plus, on peut maintenant donner une valeur négative à cette marge...

Source / Exemple :


procedure Deplace(Control: TObject; X, Y: Integer);
const Marge: ShortInt = 0;  // Marge éventuelle (étendue: -128..127)
var
  ControlPos, MousePos: TPoint;
  DiffX, DiffY: Integer;
  XMax, YMax: Integer;
  XMin, YMin: Integer;
  Application.ProcessMessages;
  GetCursorPos(MousePos);
  with Control as TControl do
  begin
    XMax := Parent.Width - Width - Marge;
    YMax := Parent.Height - Height - Marge;
    XMin := 0 + Marge;
    YMin := 0 + Marge;
    Windows.ScreenToClient(Parent.Handle, MousePos);
    DiffX := MousePos.X - Left;
    DiffY := MousePos.Y - Top;
    while DragDetect(Parent.Handle, ControlPos) do
    begin
      GetCursorPos(MousePos);
      Windows.ScreenToClient(Parent.Handle, MousePos);
      Left := MousePos.X - DiffX;
      if Left < XMin then
        Left := XMin
      else if Left > XMax then
        Left := XMax;
      Top := MousePos.Y - DiffY;
      if Top < YMin then
        Top := YMin
      else if Top > YMax then
        Top := YMax;
      Application.ProcessMessages;
    end;
  end;
end;

Conclusion :


Compilable au moins à partir de D4

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
58
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
2 juin 2006

Slt,

...merci mais la route est encore longue.

En ce qui concerne les shapes, y a un truc qui me tarabuste. L'icône de sélection du shape dans le VCL est représenté par un rond, un triangle et un carré. Pourtant le triangle n'est pas repris dans le TShape. Soit c'est impossible ou alors j'ai raté quelque chose. Mes recherches dans l'aide et sur le net n'ont rien donné. Ce n'est pas une question de vie ou de mort, mais bon, quand c'est dans la tête ça veut plus partir.
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Salut, EddiTheHead

Ce qui est sûr, c'est qu'il faut en placer quand c'est nécessaire, comme dirait la Palisse.
Ce qui est certain, c'est que tant que les messages Windows sont traités, c'est un peu au détriment de la rapidité d'exécution du traitement en cours dans notre application.
Le conseil du jour sera donc : "uti, non abuti" (pour parler actuel : user, ne pas abuser).

Content que mon code t'ai ouvert des perspectives.

Vu la qualité prometteuse de tes codes, ça va donner...
Messages postés
58
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
2 juin 2006

J'ai oublié de posté mes questions.

Si j'ai réellement bien compris le fonctionnement :
Dans la pratique, peut-on en abuser?
Y a-t-il des inconvénients à l'execution? (ralentissement du prog ...)
Messages postés
58
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
2 juin 2006

Slt,

Je me suis toujours demandé qu'elle était l'utilité d'un shape et surtout comment les utiliser. Voila un code bien court et bien facile à comprendre. Ca m'a éclairé l'esprit.
Y a moyen de bien s'amuser avec les shapes.

Juste une info sur "Application.ProcessMessages" :
D'après ce que j'ai lu dans l'aide (et compris), cela permet de rendre la main au système pour lui permettre d'effectuer ses évènements.
Cela permettrait aussi de ne pas bloquer un prog à cause d'une boucle trop longue? Comme un "sleep()".

Repeat
Application.ProcessMessages;
...
Until True;

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.