Réaliser un projet de crowdsourcing sur Canvas - page 13

 
Igor Volodin:


Pour moi, il est plus facile de créer une équipe de développement de produit, dont les membres, dans une mesure convenue, recevront un bénéfice des ventes du produit (peut-être quelqu'un est l'idéologue du projet, quelqu'un finance une part, quelqu'un est le programmeur).

Et puisque tout le monde est financièrement motivé, mettre en œuvre les bibliothèques nécessaires pour l'interface dans le cadre du projet également.

d'accord, mais la bibliothèque elle-même devrait faire l'objet d'un crowdsourcing ouvert ;)
 
o_O:
Igor Volodin:


Pour moi, il est plus facile de créer une équipe de développement de produit, dont les membres, dans une mesure convenue, recevront un bénéfice des ventes du produit (peut-être quelqu'un est l'idéologue du projet, quelqu'un finance une part, quelqu'un est le programmeur).

Et puisque tous sont financièrement motivés - pour mettre en œuvre dans le projet et les bibliothèques nécessaires pour l'interface.

Je suis d'accord, mais la bibliothèque elle-même devrait être open-source crowdsourcée).
J'ai lu le fil de discussion et je n'ai pas compris pourquoi il est nécessaire de dessiner le bouton sur Canvas à partir de zéro. Pouvez-vous expliquer sans émotions ?
 
Alexey Volchanskiy:
J'ai lu le fil de discussion et je ne comprends toujours pas pourquoi il est nécessaire de dessiner un bouton sur Canvas à partir de zéro. Pouvez-vous expliquer sans émotions ?
Je choisis entre ObjectCreate et ResourceCreate.
parce que les développeurs de MT ne sont pas omnipotents et qu'il est fastidieux de les importuner avec des demandes insignifiantes.
 

Pourquoi ça pourrait être utile :

1. l'interface sur le bitmap est rapide. Si rapide qu'il est presque impossible de le distinguer de celui du système. Par exemple, j'ai implémenté des éléments semi-transparents avec des gradients etmême lorsqu'ils se déplacent, ils sont rendus de manière fluide sans retard visible, en tenant compte du mélange des couleurs et du calcul du canal alpha sur d'autres objets avec des gradients semi-transparents.

2. l'interface est évolutive. Vous pouvez rendre l'application plus complexe et elle ne ralentira pas en raison de la suppression et de la création d'un grand nombre d'objets de graphe. Les coûts de redécoupage sont minimes, à peine un millième de seconde.

3. il est possible de créer des contrôles prêts à l'emploi et d'en créer de nouveaux, car vous pouvez fournir votre propre pool d'événements, par exemple :

OnMouseDown - a appuyé sur le LKM

OnMouseUp - a appuyé sur le LKM

OnMouseHoverOn - survole le curseur de la souris sur un objet

OnMouseHoverOut - éloigne le curseur de la souris de l'objet.

OnMouseClick : appuyer et cliquer dans les limites de l'objet.

OnMouseDblClick - double clic de souris dans les limites de l'objet.

OnDragStart - événement qui se produit une fois au début du mouvement avec le bouton gauche de la souris enfoncé

OnDragMove - événement généré lors d'un déplacement avec le bouton gauche de la souris

OnDragEnd - événement généré après un déplacement avec le LKM

OnPut - l'objet est transformé en un autre objet.

OnGet - l'objet est transféré vers un autre objet.

OnFocus - l'objet a reçu le focus

OnBlur - l'objet perd le focus

OnResize - l'objet a changé de taille

OnParentResize - l'objet parent a changé de taille.

OnKeyPress - une touche enfoncée

OnChange - la valeur d'un champ a changé

etc.

 
Igor Volodin:

Pourquoi ça pourrait être utile :

1. l'interface sur le bitmap est rapide. Si rapide qu'elle est pratiquement indiscernable de l'interface du système. Par exemple, j'ai implémenté des éléments semi-transparents avec des gradients etmême lorsqu'ils se déplacent, ils sont rendus de manière fluide sans aucun retard visible, en tenant compte du mélange des couleurs et du calcul du canal alpha sur d'autres objets avec des gradients semi-transparents.

2. l'interface est évolutive. Vous pouvez rendre l'application plus complexe et elle ne ralentira pas en raison de la suppression et de la création d'un grand nombre d'objets de graphe. Le coût du redécoupage est minime, il s'agit seulement d'un remplacement de l'image en un millième de seconde.

3. il est possible de créer des contrôles prêts à l'emploi et d'en créer de nouveaux, car vous pouvez fournir votre propre pool d'événements, par exemple :

OnMouseDown - a appuyé sur le LKM

OnMouseUp - a appuyé sur le LKM

OnMouseHoverOn - survole le curseur de la souris sur un objet

OnMouseHoverOut - éloigne le curseur de la souris de l'objet.

OnMouseClick : appuyer et cliquer dans les limites de l'objet.

OnMouseDblClick - double clic de souris dans les limites de l'objet.

OnDragStart - événement qui se produit une fois au début du mouvement avec le bouton gauche de la souris enfoncé

OnDragMove - événement généré lors d'un déplacement avec le bouton gauche de la souris

OnDragEnd - événement généré après un déplacement avec le LKM

OnPut - l'objet est transformé en un autre objet.

OnGet - l'objet est transféré vers un autre objet.

OnFocus - l'objet a reçu le focus

OnBlur - l'objet perd le focus

OnResize - l'objet a changé de taille

OnParentResize - l'objet parent a changé de taille.

OnKeyPress - touche enfoncée

OnChange - la valeur d'un champ a changé

etc.

Exhaustif, merci !

 
Lisez le fil de discussion, intéressant. C'est dommage qu'il n'y ait pas eu autant de tapage autour des interfaces il y a environ 3 ans.

Je ne vois pas l'intérêt de poster mon code car il y a une forte probabilité que l'initiative s'éteigne à cause de la paresse et des difficultés de communication entre les participants (et elles sont déjà observées) mon code sera traîné au sous-sol pour être révisé et je (et la communauté) n'en tirerai aucun bénéfice.

Mais pour participer au projet, je pourrais, en commençant par discuter des caractéristiques nécessaires et des détails spécifiques de la mise en œuvre, car il y a un avantage dans un tel, appelons-le un cadre.

L'avantage est simple, exprimé par Alex dans les premiers messages. La communauté peut influencer les développeurs du terminal pour introduire des modifications dans la plateforme MQL.

Mes espoirs d'amélioration (directement liés aux interfaces de programmation) sont les suivants :

  1. Application MQL - en tant que type de programme distinct qui n'annule pas les autres (il n'a pas de onTick et pas de possibilité de se référer au symbole par défaut - c'est une relique du passé, mais avec la possibilité d'obtenir un environnement de trading de n'importe quel symbole et de trader, car tout est multidevise), l'application ne devrait pas démarrer sur le graphique d'un symbole particulier, mais dans sa propre fenêtre. Si vous faites glisser un tel programme sur un graphique, une nouvelle fenêtre s'ouvrira. Et le glisser-déposer n'est pas nécessaire - 2 clics dans le navigateur - ouvre également une nouvelle fenêtre. Ceci est similaire à la demande de certaines personnes de fournir une API au terminal pour le développement dans une autre langue. Sujet en développement - on peut supposer qu'un tel programme, spécialement compilé, peut être exécuté sans terminal (et pour des raisons de sécurité, ne permettre cette compilation qu'à travers le Marché). Ça peut sembler fou, mais si...
  2. Prise en charge des polices vectorielles tierces présentées comme un fichier séparé et possibilité de les compiler comme une ressource (indiqué dans la documentation, mais non mis en œuvre)
  3. Capture de l'événement de défilement de la souris
  4. Verrouillage du menu par clic droit. Le bouton droit est maintenant géré, mais est inutile.
  5. Manipulation du presse-papiers du système, pour créer vos propres contrôles d'édition de texte (y compris un éditeur multi-lignes), la barre d'espace et la touche Entrée peuvent déjà être verrouillées - bien.
 

@Igor Volodin, @Combinator, @Anatoli Kazharski

Je vais commencer par le sujet douloureux).
La question qui me préoccupe le plus est une sorte d'universalité/abstraction pour le stockage des paramètres de rendu.

----

Comme nous l'avons compris, tous les contrôles utilisent de la même manière la police, la couleur de fond et la couleur du texte, etc.
Lorsque tous ces paramètres sont les mêmes pour tous les contrôles, l'interface a un aspect commun avec un concept unique.

Mais comment les stocker ? car les contrôles n'utilisent pas toujours tous les paramètres.
+ Le système est compliqué par le fait que les éléments ont des états différents qui doivent utiliser différemment la police et les couleurs de fond. Il s'agit de Active, Disable, Over, ou Select, etc.
+ il y a des groupes de contrôleurs - relief (comme Button) et champs d'entrée (comme Edit, List), et quand est le fond pour les rendre

----

Dans l'idée de travail actuelle, j'ai un élément d'attribut minimum de la classe GAttribBase, qui contient 5 paramètres de base (police/taille, couleur d'arrière-plan/de bordure, taille de la bordure).

Ces éléments de base sont utilisés pour former un tableau pour les états de la classe GAttributribut(Active/Disabvle/Over/Select, etc.).

Et ensuite, GAttribut est alimenté pour les différents types d'éléments - Relief, Editable, etc.


Ainsi, nous remplissons les paramètres de rendu une seule fois (nous les stockons en xml), ils peuvent être modifiés afin de créer différents designs et nous les utilisons globalement sans les définir pour chaque contrôleur.

Bien sûr, si un contrôleur doit avoir ses propres paramètres de rendu définis - il suffit de créer votre propre objet GAttributribut dans le contrôle et de spécifier les couleurs souhaitées.

----

Ce modèle fonctionne, le design unifié est atteint en un rien de temps, toutes les commandes prennent les couleurs du tableau commun.

Mais à mon avis, ce n'est pas universel. L'utilisateur ne comprend pas quels paramètres de la base GAttribBase sont utilisés pour le rendu de tel ou tel contrôle.
Pour que le codeur sache exactement quelle couleur changer, il devrait examiner la fonction de rendu du contrôle, ce qui est vraiment gênant.

-----

Quoi qu'il en soit, avez-vous des idées pour que le codeur soit libéré de la gestion des couleurs (pour utiliser immédiatement des couleurs prédéfinies et ne pas s'en préoccuper au début) ?

D'autre part, s'il veut recolorer certains des contrôles à l'écran, il n'a pas besoin de chercher à savoir quel GAttribBase est utilisé et dans quel cas.

 
o_O:

@Igor Volodin, @Combinator, @Anatoli Kazharski

En général - quelles sont les idées pour que le codeur soit libéré du travail sur les couleurs d'une part (pour qu'il utilise immédiatement les couleurs posées et ne s'en préoccupe pas au début).

Et d'autre part, s'ils veulent recolorer certains des contrôles à l'écran, ils peuvent le faire sans entrer dans le dédale des fonctions de dessin et chercher quel GAttribBase est utilisé et dans quel cas.

Ok, les thèmes.

Par exemple, l'objet principal de notre application, appelons-le App, est associé à l'objet ConcreteTheme.

Qu'est-ce qu'un objet thématique ?
couleurs (arrière-plan, premier plan, désactivé, actif, etc.), tailles de base, tailles de police pour les cas standard : titlesize, commonsize, etc. sprites pour : panneaux, boutons, cases à cocher, etc.

Un nouveau thème est une nouvelle classe/structure avec des valeurs modifiées. Mais il est préférable que les thèmes puissent être hérités en ne surchargeant que certains paramètres.


Le reste - la hiérarchie des contrôles dans laquelle chaque contrôleur utilise par défaut une des valeurs nécessaires de l'objet-thème. S'il doit passer outre, nous appelons une méthode pour travailler avec cette propriété, en spécifiant la nouvelle valeur.

Par exemple, SetBgColor(XRGB(255,0,128)) ;

CView - une classe de base fournissant une interaction de base basée sur des événements
- CRect - coordonnées
- Cpanel a un bgcolor
- CButton a un objet d'état, chaque état a un bg.
- CText possède une couleur de texte et des propriétés de police.
- CCircle

Et ainsi de suite.

Si vous voulez utiliser du xml pour décrire les éléments,

ensuite, pour chaque contrôle ou primitive de classe, nous devons créer une classe génératrice, appelons-la "build-container", qui fera correspondre les attributs (bgcolor="(255,0,128)") aux méthodes correspondantes ( SetBgColor(attrValue)) de la classe. Ces conteneurs de construction seront analysés par un analyseur XML, la sortie sera un objet initialisé avec les valeurs nécessaires, ou avec les valeurs par défaut si aucune valeur n'a été spécifiée.

 

Ce thème est le même que le mien - un ensemble de GAttributeurs pour différents types de contrôles et leurs états.

mais vous avez déjà suggéré la première étape sur la voie de la transparence pour le codeur - ajouter des fonctions à un contrôle spécifique pour modifier ses propriétés de rendu (SetBgColor, etc.).

Sur le fond, je suis d'accord, il sera clair quelles couleurs il a et ce qui peut être changé.


Une telle question alors - Thème implique-t-il la redondance des paramètres inutilisés ?

Disons que dans ma GAttribBase de base, pour un certain contrôle (par exemple un bouton), nous n'utilisons que la couleur et la taille de l'arrière-plan, et que les autres paramètres (épaisseur de la bordure, etc.) ne sont pas utilisés dans ce contrôle.

En d'autres termes, avez-vous un élément de base pour tous les contrôles ? Où est stockée l'information "pour tous les cas", ou tous les contrôles n'ont que leurs paramètres sans la surcharge d'universalité ?

 
o_O:

...

En général, quelles sont vos idées pour que, d'une part, le codeur ne soit pas obligé de travailler avec les couleurs (il utiliserait immédiatement les couleurs par défaut et ne s'en préoccuperait pas au début) ?

Et d'autre part - pour que, s'il veut recolorer un contrôleur à l'écran, il n'ait pas à se plonger dans les contrées sauvages des fonctions de rendu et à trouver quel GAttribBase est utilisé et dans quel cas.

Définissez les valeurs par défaut pour chaque élément. Si l'utilisateur a besoin de changer quelque chose, pour chaque propriété de l'élément, il devrait y avoir une méthode pour définir la nouvelle valeur. C'est comme ça que je le fais maintenant.

Je ne l'ai pas encore :

Si vous devez modifier les propriétés de tous les éléments en "deux temps", il suffit de créer des méthodes distinctes (pour les propriétés communes qui sont liées à la conception et applicables à tous les éléments) dans cette classe où tous les éléments de l'interface sont accessibles.

En principe, je vois déjà comment cela pourrait être mis en œuvre dans mon schéma. Par exemple, par le biais d'événements. Mais ensuite, dans le gestionnaire d'événement de chaque élément, vous devez gérer cet événement (le code est gonflé). Deuxième option, créer une méthode publique spéciale dans une classe qui gère les événements courants de l'interface graphique, ou même plus haut, où tous les pointeurs vers les éléments de l'interface graphique sont stockés. Ces deux classes sont des classes de base de la classe MQL-application personnalisée, et l'utilisateur y aura un accès direct. Il peut s'agir de quelque chose comme les méthodes ObjectSet surchargées dans MQL (par exemple,ElementSet), où (1) la propriété et la valeur ou (2) la propriété, le modificateur et la valeur doivent être spécifiés.

Mais tout ceci est mon raisonnement concernant mon schéma. Je n'exclus pas qu'elle change encore beaucoup lorsque je commencerai la transition. Ainsi, tout ce que j'ai écrit ci-dessus peut ne plus être pertinent pour le sujet discuté ici. )