2017-09-25 3 views
1

J'ai toujours écrit des composants non visuels; leur création est assez facile et ils fonctionnent aussi bien sous VCL et FMX. Jusqu'ici tout va bien, mais maintenant je suis confronté à un problème.Composant visuel Delphi avec Canvas

J'utilisé pour hériter de TComponent mais maintenant je ne peux plus parce que mon composant appelé TRedistPreview a vraiment besoin d'une telle procédure:

procedure drawPreview(area: TCanvas); 

Cette procédure doit dessiner quelque chose (formes, lignes et couleurs) quelque part, pour exemple dans un TRectangle. J'ai vu en ligne que TComponent n'a pas la capacité de dessiner, donc je devrais hériter de quelque chose d'autre. J'ai trouvé TWinControl (mais c'est VCL seulement) et (VCL seulement, aussi).

Pourriez-vous s'il vous plaît me dire de quoi je devrais hériter pour obtenir une toile? Je veux dire, je veux remplacer:

TRedistPreview = class(TComponent) 
end; 

Avec:

TRedistPreview = class(TSomeClassThatHasCanvas) 
end; 

où je peux appeler procedure drawPreview(area: TCanvas); et tirer sur une surface (comme un TRectangle).

Je cherche la classe la plus basse possible dans la hiérarchie avec un canevas.


Étant donné que ce composant est très utile pour moi sous Windows et Android, je suis à la recherche d'une implémentation Firemonkey. D'après mes recherches, j'ai vu que je pouvais hériter de TRectangle, qui se trouve à l'intérieur de FMX.Objects, mais je ne sais pas si c'est le bon choix.

Que dois-je faire?

De même, si j'avais besoin que ce composant soit en VCL, dois-je écrire un autre composant qui hérite d'une autre classe? Comme je l'ai dit, c'est la première fois que j'écris des composants visuels, alors j'aimerais que quelqu'un me montre la bonne voie!

+0

Absolument parfait pour conduire à partir de TComponent. Aucune raison du tout que vous ne pouvez pas implémenter une méthode pour dessiner votre composant sur un canevas. Bien sûr, ce design pourrait être faux. Peut-être que vous avez besoin d'un contrôle visuel. Peut-être que vous demandez la mauvaise chose. –

+1

Oui, VCL et FMX ne sont en aucune façon compatibles entre eux - pas dans le sens d'écrire un seul contrôle qui fonctionne sur les deux. C'est essentiellement comme essayer d'installer un moteur diesel à partir d'un semi-remorque en mini cooper. –

+0

Pour commencer, vous pouvez jeter un coup d'oeil à quelque chose d'écrit d'avance, comme mon code dans cette question: https://stackoverflow.com/questions/31767346/capturing-signature-very-sketchy-on-touch-screen Étudie-le et implémente ta propre chose. –

Répondre

2

En VCL, la première classe qui prend en charge le canevas est TCustomcontrol, qui est la descendante de TWinControl. Dans FMX, la classe de base qui autorise les routines de peinture est TControl. Mais il est évident que le rendu des composants visuels dans FireMonkey est très différent de celui de la VCL. Donc, si vous pensez à réutiliser le code VCL dans FMX ou vice versa, je crains que ce ne sera probablement pas possible.

+0

Cela n'a pas fonctionné réellement! J'ai ajouté TControl comme classe père au lieu de TComponent mais je ne peux toujours pas accéder au TCanvas en utilisant la procédure que vous pouvez voir ci-dessus ... Si Héritage de TControl et puis j'ai ajouté FMX.Graphics (qui a TCanvas) serait-il suffisant? –

+0

Vous n'avez pas besoin de dériver d'une classe en particulier pour implémenter une fonction qui accepte un canevas comme argument. –

+0

@DavidHeffernan Je viens de l'avoir. J'ai décidé de dériver de TComponent comme d'habitude et ensuite ajouter dans les clauses uses ce dont j'ai besoin, par exemple FMX.Graphics (pour TCanvas). Cela fonctionne jusqu'à présent, je suppose que j'ai compris ce qu'il faut faire! –