Est-il possible d'éditer du texte sur plusieurs lignes dans un objet OBJ_TEXT ? - page 7

 
Реter Konow:
Bien sûr.

Je veux aussi vous rendre perplexe avec quelque chose qui m'a rendu perplexe.)))) Est-il possible de passer plusieurs lignes individuelles dans une ressource, afin de ne lire que la ligne sélectionnée lors de la lecture de la ressource.

Pour une image, quelques lignes peuvent être créées par TextOut() mais les tentatives de lecture d'une telle ressource n'ont aucun succès. Seule la première ligne peut être lue.

 
Alexey Viktorov:

Je veux aussi vous intriguer avec quelque chose qui m'a intrigué.)))) Existe-t-il une possibilité de passer des lignes séparées dans une ressource, de sorte qu'il soit possible de lire uniquement la ligne sélectionnée.

Pour une image, quelques lignes peuvent être créées par TextOut(), mais les tentatives de lecture de cette ressource ont échoué. Seule la première ligne peut être lue.

Il est inutile d'essayer d'enregistrer ou de lire le texte d'une image. Utilisez la ressource pour écrire des chaînes de caractères comme je l'ai décrit ci-dessus, puis extrayez-les en utilisant CharArrayToString. Ensuite, divisez la chaîne par un délimiteur et trouvez le bon parmi eux. (Par conséquent, avant de sauvegarder la chaîne, il faut la diviser en sous-chaînes par un symbole quelconque).
 
Реter Konow:
Il est inutile d'essayer d'enregistrer ou de lire le texte d'une image. Utilisez la ressource pour écrire des chaînes de caractères comme je l'ai décrit ci-dessus, puis extrayez-les en utilisant CharArrayToString. Ensuite, divisez la chaîne par un délimiteur et trouvez le bon parmi eux. (Par conséquent, avant de sauvegarder la chaîne, il faut la diviser en sous-chaînes par un symbole quelconque).

Je n'avais aucune envie de lire à partir d'une image. Je n'ai mentionné l'image qu'à titre d'exemple pour quelques lignes d'écriture.

Extraire une sous-chaîne est trop facile. Nous ne cherchons pas la facilité :)))) Merci pour votre aide.

 
Alexey Viktorov:

Je n'avais aucune envie de lire à partir d'une image. Je n'ai mentionné l'image qu'à titre d'exemple pour quelques lignes d'écriture.

Pour enlever une sous-chaîne, c'est trop facile. Nous ne cherchons pas la facilité). Merci pour votre aide.

Il n'est pas très difficile d'extraire une sous-chaîne si vous savez déjà comment enregistrer des données dans une ressource et les extraire. C'est une tâche simple en soi. Essayez d'abord d'enregistrer la chaîne dans une ressource, puis de l'extraire à partir de celle-ci. Ajoutez ensuite une fonction qui décompose la chaîne en sous-chaînes et recherche la bonne.
 
Реter Konow:
Il n'est pas très difficile d'extraire une sous-chaîne si vous savez déjà comment enregistrer des données dans une ressource et les récupérer. C'est une tâche simple en soi. Essayez d'abord d'enregistrer la chaîne dans une ressource, puis de l'extraire à partir de là. Ajoutez ensuite une fonction qui décompose la chaîne en sous-chaînes et recherche la bonne.

Peter, merci pour votre aide. J'ai appris à travailler avec des cordes il y a des années. Et comment sauvegarder une ressource et la lire, avec votre aide, j'ai compris hier. Je viens d'avoir un texto frénétique dans ma tête, comme si je devais essayer... et comment le faire le texto s'est perdu en route, s'est perdu dans mes pensées.

J'essaie de comprendre la différence entre les tableaux bidimensionnels et unidimensionnels pour la création de ressources. Avez-vous des développements, des réflexions à ce sujet ?

 
Alexey Viktorov:

Peter, merci pour votre aide. J'ai appris à travailler avec des cordes il y a des années. Et comment sauvegarder une ressource et la lire, avec votre aide, j'ai compris hier. Je viens de recevoir un texto frénétique dans ma tête, comme si je devais essayer... mais comment faire le texto s'est perdu en chemin, s'est perdu dans mes pensées.

J'essaie maintenant de comprendre la différence entre les tableaux bidimensionnels et unidimensionnels pour la création de ressources. Avez-vous des idées ou des réflexions à ce sujet ?

Pour être honnête, je n'ai jamais stocké un tableau à deux dimensions dans une ressource. J'ai toujours travaillé avec un unidimensionnel, parce que c'est sans contrainte. L'unidimensionnel est préférable pour la sauvegarde des données, bien que cela ne soit pas obligatoire. Cela dépend du type de données et de leur format. Utilisez uniquement un tableau unidimensionnel pour l'enregistrement des chaînes de caractères, car le tableau bidimensionnel ne peut pas être envoyé aux fonctions CharArrayToString et StringToCharArray. Je vous conseille donc de développer un mécanisme permettant de stocker toutes vos données dans un tableau unidimensionnel, pour plus de souplesse. Mais vous pouvez essayer d'utiliser la dimensionnelle pour les données non textuelles du même type. Il sera intéressant de voir ce que vous en retirerez.
 

J'ai lu quelques pages précédentes et j'ai réalisé que la tâche consistait à lire une seule petite chaîne de caractères à partir de la ressource. Si cette chaîne comporte moins de 64 caractères, il est inutile de semer la pagaille avec les unions et de sauvegarder les données dans la ressource. Il suffit d'écrire la chaîne requise dans la propriété de description de OBJPROP_TEXT :

ObjectSetString(chartID,label_name,OBJPROP_TEXT, "Your string");

Et le récupérer comme ça :

string Str = ObjectGetString(chartID,label_name,OBJPROP_TEXT) ;


Et c'est tout.))

 
Alexey Viktorov:

Forum sur le trading, les systèmes de trading automatisés et l'essai de stratégies de trading

Bibliothèques : TradeTransactions

fxsaber, 2018.09.20 16:23

// Пример хранения/обмена данными через Ресурсы внутри Терминала
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

void OnStart()
{  
  const RESOURCEDATA<int> ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса
  
  int ArrayINT[] = {1, 2, 3};
  int Num = 5;
  
  ResourceINT = ArrayINT;  // Ресурс хранит массив.
  ResourceINT += Num;      // Добавили в ресурс еще значение.
  ResourceINT += ArrayINT; // Добавили массив.
  
  int ArrayINT2[];  
  ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
  ArrayPrint(ArrayINT2);      // Вывели: 1 2 3 5 1 2 3

  ResourceINT.Free();                // Удалили данные из ресурса
  Print(ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0

  const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    for (int i = 0; i < 3; i++)
      ResourceTicks += Tick; // Добавили в ресурс тики

  MqlTick Ticks[];
  ResourceTicks.Get(Ticks); // Считали данные из ресурса.
  ArrayPrint(Ticks);        // Вывели.
  
  // Это полное имя ресурса для обращения из другой программы
  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
  Print(NameOut); // Вывели полное имя ресурса.
  
  const RESOURCEDATA<MqlTick> Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}

 
Реter Konow:

J'ai lu quelques pages précédentes et j'ai réalisé que la tâche consistait à lire une seule petite chaîne de caractères à partir de la ressource. Si cette chaîne comporte moins de 64 caractères, il est inutile de semer la pagaille avec les unions et de sauvegarder les données dans la ressource. Il suffit d'écrire la chaîne requise dans la propriété de description de OBJPROP_TEXT :

ObjectSetString(chartID,label_name,OBJPROP_TEXT, "Your string");

Et le récupérer comme ça :

string Str = ObjectGetString(chartID,label_name,OBJPROP_TEXT) ;


Et c'est tout.))

Pas exactement. La tâche consistait à produire quelques lignes d'information. A mon avis... c'est juste la façon dont je voulais qu'il soit affiché. L'une des lignes comporte une date. Cette date n'est pas seulement pour la clarté, mais devrait être utilisée par le programme même après le redémarrage. Il s'avère qu'il doit être sauvé d'une manière ou d'une autre. C'est là que j'ai commencé à faire des bêtises, on ne cherche pas à s'en sortir facilement. Puisque l'une des façons d'enregistrer la date est d'utiliser un objet graphique, pourquoi ne pas utiliser la même ressource. Après le redémarrage de la ressource MT est lisible, mais après le redémarrage de l'ordinateur n'a pas encore vérifié. L'essentiel est que j'ai compris les ressources et les unités. La prochaine chose que je sais, c'est que je recevais des messages frénétiques dans ma tête. Une fois que j'aurai tout effacé, je continuerai le travail utile.

 
Alexey Viktorov:

Pas vraiment. La tâche consistait à produire quelques lignes d'information. A mon avis... c'est juste la façon dont je voulais que ce soit, pour l'afficher avec une toile. L'une des lignes comporte une date. Cette date n'est pas seulement pour la clarté, mais elle doit être utilisée par le programme même après le redémarrage. Il s'avère qu'il doit être sauvé d'une manière ou d'une autre. C'est là que j'ai commencé à faire des bêtises, on ne cherche pas à s'en sortir facilement. Puisque l'une des façons d'enregistrer la date est d'utiliser un objet graphique, pourquoi ne pas utiliser la même ressource. Après le redémarrage de la ressource MT est lisible, mais après le redémarrage de l'ordinateur n'a pas encore vérifié. L'essentiel est que j'ai compris les ressources et les unités. La prochaine chose que je sais, c'est que je recevais des messages frénétiques dans ma tête. Une fois que j'aurai tout effacé, je continuerai le travail utile.

Bien. Ensuite, continuez à maîtriser les ressources et les syndicats. Ils offrent un moyen polyvalent non seulement d'écrire et de stocker rapidement n'importe quelle donnée, mais aussi de partager ces données entre différents programmes en temps réel et sans charge sur le disque.