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

 
Алексей Барбашин:

De ce qui précède, on peut comprendre qu'un élément de structure est un contrôle de dialogue spécifique, il contient ses propres propriétés et peut contenir des contrôles imbriqués. L'ensemble des propriétés d'un tel contrôle universel n'est limité que par l'imagination du développeur.

Bien sûr, nous pouvons éviter la structure et décrire les propriétés des contrôles dans un tableau multidimensionnel, mais ce n'est pas rentable au départ car nous devons nous rappeler clairement quel index du contrôle stocke une propriété quelconque. Et le tableau ne peut pas contenir des types de données hétérogènes. Il s'avère que la description de l'élément de contrôle dans la programmation procédurale n'est possible que par le biais des structures. Autrement dit, l'élément de structure est un contrôle concret, c'est-à-dire l'objet concret du dialogue avec ses propriétés.

Dans la bibliothèque standard, il existe un dossier Generic dans le dossier Include, qui contient la classe CHashMapqui implémente l'interface de type clé-valeur.
Un objet unique peut avoir un ensemble de valeurs de n'importe quel type. Bien que l'arbre cartographique ait un temps d'exécution long, il fonctionne assez rapidement.
Cela pourrait même fonctionner pour décrire les propriétés, il faudrait essayer en général.
Ou bien utilisez un autre type de classe de cette bibliothèque, plus adapté à la tâche.

Документация по MQL5: Стандартная библиотека / Шаблонные коллекции данных
Документация по MQL5: Стандартная библиотека / Шаблонные коллекции данных
  • www.mql5.com
Библиотека содержит классы и интерфейсы для определения шаблонных коллекций, которые, в свою очередь, дают пользователю возможность создавать строго типизированные коллекции. Они обеспечивают большее удобство и высокую производительность работы с данными, чем обычные типизированные коллекции.
 

Relisez-le, c'est-à-dire que vous proposez de stocker un tableau égal à un tableau de pixels, afin de stocker des informations dans ce tableau (dans votre cas "quel numéro de fonction" doit être utilisé pour le traitement). ?

 
Maxim Kuznetsov:

Ensuite, il y aura l'inverse - relier l'interface au graphique. Par exemple, pour fabriquer un bouton strictement lié à l'heure et au prix.

Une interface graphique distincte peut être écrite en un rien de temps - avec tous les tableaux, onglets, menus et sifflets. En C# ou même en BASIC. Et l'intérieur du graphique est un problème important pour les applications externes.

Et puis, pourquoi lier l'interface au graphique ?
Après tout, vous pouvez obtenir toutes les données, telles que les horodatages et les prix, directement à partir des fonctions pertinentes.

 
Alexandr Andreev:

Relisez-le, c'est-à-dire que vous proposez de stocker un tableau égal à un tableau de pixels, afin de stocker des informations dans ce tableau (dans votre cas "quel numéro de fonction" doit être utilisé pour le traitement). ?

Si vous me demandez, je n'ai rien suggéré de tel. Je n'ai rien suggéré du tout)). J'ai juste décrit un peu mon point de vue. Vous êtes libre de ne pas être d'accord.

 
Реter Konow:

En principe, il est possible de généraliser les types. Je suis arrivé à la conclusion que rien de mauvais ne se produira, si la grande majorité des propriétés des objets sont de type int. Tous les autres types abrégés (le double est pratiquement absent des propriétés des objets graphiques) ont été rejetés par souci de simplification. Le "dépassement" de mémoire est si insignifiant qu'il est inutile d'y penser. Bien sûr, nous ne pouvons pas accepter un tel sacrilège au nom du professionnalisme))). Mais nous sommes au 21e siècle et je ne suis pas menacé par les feux de joie).

J'ai fait des noms des objets des nombres, et je les ai mis dans la série générale des propriétés des objets.

Le seul endroit où j'avais besoin d'un type de données différent était les paramètres de contrôle. Là, j'ai créé un deuxième noyau, qui stocke les propriétés des paramètres, et les valeurs elles-mêmes dans le type string, que je peux facilement réduire à n'importe quoi (plus précisément, à ce qui est écrit dans les propriétés du paramètre).

ASTUCE : Par "paramètre de l'élément de commande", vous entendez le PARAMÈTRE GÉRÉ par l'élément de commande.

Il s'avère que le tableau global, qui contient tous les contrôles et toutes leurs propriétés, a une profondeur de dimension égale à la somme de toutes les différentes propriétés des contrôles. En d'autres termes, même si certaines propriétés du contrôle ne sont pas nécessaires, ces cellules seront toujours dans ce tableau, car le tableau est toujours uniforme.

Ce qui est surprenant, cependant, c'est l'uniformité du tableau lui-même. À cet égard, l'utilisation d'une structure est plus que justifiée, car dans ce cas, chacune des propriétés peut être décrite par son propre type, y compris l'union.

L'utilisation de structures simplifie vraiment le stockage des propriétés, vous ne devez pas vous limiter à un seul type ou renoncer à quoi que ce soit. Vous n'avez pas à vous occuper des conversions de chaînes de caractères vers d'autres types de données... Une structure supprime toutes ces limitations dès le départ.

En plus des propriétés et des coordonnées elles-mêmes, ce tableau global doit également stocker le système de subordination des éléments. Si l'objet Caption de notre dessin a changé, les boutons doivent également être redessinés, car ils sont situés sur le champ d'en-tête. Ainsi, si un contrôle "central" a changé, tout ce qui s'y trouve doit être redessiné. Peter, comment stockez-vous la structure de dépendance des objets ?
 
Алексей Барбашин:

Il s'avère que le tableau global, qui contient tous les contrôles et toutes leurs propriétés, a une profondeur de dimension égale à la somme de toutes les différentes propriétés des contrôles. C'est-à-dire que même si certaines propriétés ne sont pas nécessaires pour un élément, ces cellules seront toujours dans ce tableau, car le tableau est toujours uniforme.

Ce qui est surprenant, cependant, c'est l'uniformité du tableau lui-même. À cet égard, l'utilisation d'une structure est plus que justifiée, car dans ce cas, chacune des propriétés peut être décrite par son propre type, y compris l'union.

L'utilisation de structures simplifie vraiment le stockage des propriétés, vous ne devez pas vous limiter à un seul type ou renoncer à quoi que ce soit. Vous n'avez pas à vous occuper des conversions de chaînes de caractères vers d'autres types de données... Une structure supprime toutes ces limitations dès le départ.

Le noyau est la matrice. Il contient toutes les propriétés des objets.

Vous pouvez choisir votre propre méthode. Mais, au fil des années de gui, je suis arrivé à la conclusion qu'aucune autre méthode ne donnera une croissance aussi puissante de la fonctionnalité d'un système évolutif. La simplicité et l'efficacité maximales sont la perfection.


 
Алексей Барбашин:

...Peter, comment stockez-vous la structure de dépendance des objets ?

Si vous voulez dire coordonner les dépendances, également dans le noyau.

J'ai un gestionnaire spécial pour les dépendances de coordonnées. Il fonctionne avec tous les types de dépendances.
 
Roman:

Et puis, pourquoi lier l'interface au graphique ?
Après tout, vous pouvez directement récupérer n'importe quelle donnée, les mêmes horodateurs et le même prix, à partir des fonctions pertinentes.

au fait que l'interface d'application (ce avec quoi l'utilisateur opère) n'est pas limitée à une seule fenêtre.

Nous parlons de commerce, n'est-ce pas ?

Eh bien, le placement des éléments interactifs sur le graphique (et leur fixation) est presque impossible à résoudre par des moyens externes.

Là encore, les dialogues/formulaires externes sont faciles à dessiner. Mais les éléments à l'intérieur du graphique sont presque impossibles à dessiner sans les spécificités du terminal et du graphique en question.

 
Реter Konow:
Le noyau est la matrice. Il contient toutes les propriétés des objets.

Vous pouvez choisir votre propre méthode. Mais, au fil des années de gui, je suis arrivé à la conclusion qu'aucune autre méthode ne donnera une croissance aussi puissante de la fonctionnalité d'un système évolutif. La simplicité et l'efficacité maximales sont la perfection.


La matrice est constituée de boucles imbriquées et les boucles imbriquées sont du temps. Imho, pas de sarcasme, juste un raisonnement logique.

 

Peter, vous obtenez ce qui suit : le noyau se compose d'une matrice globale des propriétés des éléments, d'une matrice globale des valeurs des éléments, d'une matrice globale des dépendances, d'une matrice globale des images...

Si d'autres propriétés doivent être ajoutées, la dimensionnalité des matrices est augmentée.

L'accès aux propriétés se fait strictement par index car les cellules n'ont pas de nom.

Au moins les noms des champs sont accessibles avec une structure.

Peter, tu es... géant...

Moi, par exemple, je vois les choses de cette façon (simplifiée) :

class CControl : public CObject

{

public:

        int ПозицияХ;

        int ПозицияY;

        int Длина;

        int Ширина;

        color ЦветОсновы;

        color ЦветБордюра;

        int ТолщинаБордюра;

}

Une "classe" de facto est une chaîne spécifique dans votre tableau global, mais avec un visage plus "humain". Les classes sont conçues pour créer leurs propres objets de données, avec un ensemble de propriétés compréhensibles auxquelles on peut accéder par nom plutôt que par index. Une classe est simplement un constructeur de type universel.

Nous créons donc un contrôle de base qui contient les propriétés les plus courantes, que possède presque tout contrôle.

Vous pouvez créer des objets spécialisés sur cette base :

class CButton : public CControl 

{

public:

        string Заголовок;

        int Image[];

}

En d'autres termes, chaque type de contrôle suivant complète simplement le type de base avec les propriétés requises.

Et puisque, comme je l'ai écrit plus tôt, les propriétés de base sont stockées dans le contrôle de base, la traversée de la "frappe" du curseur dans le contrôle se fait en vérifiant un seul type de données : CControl. Ayant trouvé l'objet désiré, le programme a immédiatement accès aux propriétés de cet objet, puisque le point de programme se trouve déjà dans l'objet lui-même, tout comme dans votre boucle le programme se trouve sur la ligne de tableau désirée.