Composant : modification graphisme lors de la création [Résolu]

Signaler
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011
-
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011
-
Bonjour à tous !
Dans mon apprentissage de la conception de composants, l'un de mes premiers composants est très primaire et il fonctionne très bien :
          dérivé de TGraphicControl,  je surcharge paint pour qu'elle me dessine un simple bout de ligne horizontale  =>  canvas.LineTo(Width,Height div 2) avec le PenWidth et le BrushColor que je veux ;

      Je voudrais le sophistiquer un peu : lorsque l'utilisateur-programmeur le glisse sur une form, je voudrais, un peu comme les logiciels de dessin vectoriel, qu'il puisse (sur un événement souris p.ex.) continuer la création de son segment en changeant la direction de la suite du segment.
         Lorsqu'il estimerait que son composant-segment  est assez long, un "OnMouseUp" (p.ex.) signifierait à la méthode Paint (et au create) qu'il a fini d'installer son composant "segment à chevron" sur sa form.
 
Je patine là-dessus et n'arrive pas à trouver le truc..         
En fait, donc, comment rendre le paint du constructeur sensible à des événements - souris..
 
Quelqu'un peut-il me venir en aide ? !..  un grand merci d'avance !
JJT

10 réponses

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Salut !
Te revoila avec ta commande de chemins de fer !

J'ai bien compris ta question mais je ne peux pas t'y répondre directement car une de tes phrase me ... comment dire... choque !

"paint du constructeur sensible à des événements - souris"
=> ça ressemble à du méli-mélo de mots compliqués !

car :
<ol><li>Il n'y a pas de Paint dans le constructeur (Paint est appelé lors du message WM_PAINT)</li><li>Paint() comme son nom l'indique, est une méthode de ... dessin !</li><li>Donc pas d'évènement de souris dessus !</li></ol>Par contre, ce que tu peux faire c'est :<ol><li>Surcharger Mousedown, MouseMove et MouseUp qui sont des procédures protégées de TControl</li><li>Dedans, tu gères les déplacements de la souris et tu mémorise les mouvements faits par l'utilisateur</li><li>Après, lorsque le bouton gauche est relaché (appel de MosueUp avec Button mbLeft) tu déclenche un redessin de ton compo> Invalidate</li><li>Dans ta procédure Paint, tu dessines selon les données que tu auras enregistré dans les procédures MouseXXX.</li></ol>ça va mieux maintenant ?
Allez, je te laisse méditer ... !

A+
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Ouf ! Tu me rassures !

Oui, j'ai une bonne mémoire, mais tu sais, des gens qui posent des questions de composants, ça coure pas les rues sur Delphifr. En ce moment, c'est plutôt des questions de débutants et de personnes qui cherchent à faire quelque chose au dessus de leurs moyens.

Pour te mettre sur la voie, tu peux commencer par permettre à l'utilisateur à bouger un point du dessin.
Petit exemple:

<hr size= "2" width="100%" />TMyCompo = class(...)
private
[...]
  FPos2ndPoint: TPoint; // initialisé automatiquement à (0, 0) par le constructeur
[...]
protected
  procedure MouseDown(Button: TMousebutton; Shift: TShiftstate; X, Y: Integer); override ;
  procedure Paint; override;
[...]

end;

[...]

procedure TMyCompo.MouseDown(Button: TMousebutton; Shift: TShiftstate; X, Y: Integer);
begin
  FPos2ndPoint : = Point(X, Y);  // stockage ici.
  Invalidate;
  inherited;
end;

procedure TMyCompo.Paint;
begin
  Canvas.MoveTo(ClientWidth div 2, ClientHeight div 2);
  Canvas.LineTo(FPos2ndPoint.X, FPos2ndPoint.Y); // et utilisation là.
end;
<hr size="2" width="100%" />
Voila, ça devrait te donner quelques idées.
++

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Pour l'histoire de vocabulaire, rien de très précis mais tu peux toujours dire (et tout le monde comprendra) :
- moi, pour le concepteur du composant (puisque c'est toi et pas ton voisin)
- le développeur, ou programmeur pour celui qui pose le compo sur la fiche (il se peut que ce soit la même personne que "moi")
- l'utilisateur (final)

Pour ton problème, tu voudrais que le développeur dessine lui même les segments ?
Si c'est à cela que tu fais allusion, c'est en effet pas si simple que ça (mais rien d'impossible), il faut tester ceci : "ComponentState = csDesigning"

Sinon, pour dessiner plusieurs segments, c'est simple, il suffit d'en faire un tableau dynamique et de TOUS les redessiner lors de Paint().

J'ai peut être quelque chose pour toi, je regarde ça d'ici peu.
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Ah oui, les tableaux dynmaiques !
Très très important !
Profite en pour te prélasser parce qu'après, ça va barder... en effet, je viens de retrouver mon code que je cherchais et ce que tu cherches à faire est affreusement compliqué à mettre en place.

Néanmoins, une fois mis en place, c'est super simple à utiliser.
=> Le malaise du développeur du composant se retrouve bonheur pour l'utilisateur du composant !

CompoentState est bien en lecture seule, c'est Delphi qui se charge de la modifier.
if csDesigning in ComponentState then [...] te permet de faire exécuter du code uniquement dans l'éditeur de Delphi.

En attendant, ton bouquin est sûrement obsolète, la gestion du design-time a été profondément modifiée avec Delphi6.

Voila tout pour aujourd'hui.
Bon dimanche !
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

Bonjour et un grand merci préalable pour ta réponse.

      Oui, c'est à nouveau moi, avec mon  "p'tit train"...   tu vois, je suis tenace (en qualité de rouergat, presque plus, je pense, que mes amis auvergnats) !..       (et Delphi me plait de + en +..) et je vois aussi que tu as bonne mémoire !.
      D'abord mes excuses d'avoir été aussi "rapide" dans mon propos.        Ce n'était pas dans mon intention de confondre Paint et le Constructeur car ça, je pense que j'ai pigé depuis le mois dernier.
      En revanche, j'ai un grand besoin de méditer ce que tu dis de la méthode paint   "..donc pas d'évènement de souris dessus !.." .    
      Le reste, (surcharge des événements Mouse et déclenchement du redessin) pas de pb.
      En revanche aussi, il faut que je médite à l'interaction, dans Paint, données enregistrées  <->  procédures Mouse.XX, j'ai besoin de l'approfondir.
      Je vais y consacrer mon dimanche, et, si tu le veux bien, je te donnerai des nouvelles demain soir ou lundi de mes progrès (j'espère !.).
   
Grazie Mille !...
JJT
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

          Merci pour la "courte échelle" qui me permet de mettre bien au clair dans mon esprit la question du traitement des surcharges des procédures protégées de TControl de "Mousedown etc..". 
      J'ai donc repris une nouvelle version de mon composant dans ce sens mais, ce que je "subodorais" se produit : ce traitement est conçu à l'intention de l'utilisateur de l'application, c.a.d. le 3ème intervenant...   (de plus, comble de malchance, lorsqu'il fait son LineTo, le Invalidate lui efface son premier MoveTo..).

      Mon souhait était que ce 2ème segment (  LineTo (FPos2ndPoint.X, FPos2ndPoint.Y); ) soit dessiné par le 2ème homme selon son souhait (même un 3ème segment si ça lui chante) , celui qui installe le composant sur la form !..
      C'est ce que je souhaitais  -  très maladroitement  -  te dire en faisant allusion au Create..

Et pour ça, je patine dans la semoule..    (comment faire pour que le n+1 ième segment n'efface pas le nième, surtout lorsque le concepteur du composant ne sait pas à l'avance combien le créateur de la form voudra en mettre à la queue-leu-leu !.).   
 Bon dimanche !  (et encore un grand merci pour l'aide au débutant)
JJT
Question annexe mais primordiale pour moi, débutant, y-a-t-il une sémantique "autorisée" pour qualifier le 1er homme (concepteur de composant), le 2ème (programmeur de l'application) et  le 3ème (utilisateur    final) car dans les bouquins, les auteurs mélangent joyeusement tout celà si bien qu'on s'y perd...     
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

JJT
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

     En me reportant à mon vieux bouquin Référence de la bibliothèque des composants visuels (Delphi 1), je vois que la propriété CompoentState est en lecture seule...    Je ne l'ai jamais vue employée dans mes bouquins et donc pas d'exemple..               J'attendrai donc ce que tu me dis dans ta dernière ligne avec beaucoup d'espoir !..
      Par ailleurs, je vais potasser les tableaux dynamiques que (je l'avoue) je n'ai jamais eu l'opportunité, encore, de regarder (je ne doute pas que ce soit très intéressant puisque nouveau pour moi !..)
  J'en découvre, en ce moment,  des notions nouvelles !   merci de m'y avoir entraîné..
JJT
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

OUF !...


Si je comprend bien, je vais en prendre pour 6 mois de rumination ?...
J'ai hâte d'ouvrir ça dès que l'erreur sur le lien sera réparée !...
bonne soirée et merci d'avoir passé du temps là-dessus (...en espèrant qu'un de ces jours je serai à la hauteur pour tout saisir !.)
JJT  
Messages postés
28
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
25 juillet 2011

Ça y-est !!....    J'ai tout chargé, compilé et fait tourner.      C'est vraiment fantastique.
      Je me suis imprimé les .pas pour essayer de suivre la démarche.      ça m'a l'air vraiment bluffant !..
 Un grand merci de m'avoir ouvert ces horizons.   Bonne journée !
JJT

Tu me trouveras insistant mais je persiste et signe :  il est vraiment nécessaire de faire un petit  "topo d'instructions" à l'intention des débutants (et des auteurs de bouquins) sur : " ...  comment, dans les échanges, baptiser officiellementles concepteurs, programmeurs et autres utilisateurs.." de Delphi pour que tous les débutants (et pas seulement les "cadors") ne soient pas paumés quand ils abordent la conception de composants..        (Aie, Aïe, Aïe.... la dégelée que je vais me prendre !..).