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

 
Nikolai Semko:

Il y a un autre problème.
Si vous n'avez pas accès au code qui a généré le kanvas, vous n'avez pas non plus accès à la ressource de ce kanvas. Vous pouvez voir la liste des objets bitmap, mais pas la liste des ressources. Si vous ne connaissez pas le nom de la ressource, vous ne pouvez le trouver que par correspondance ou par force brute, ce qui est sans intérêt pratique.
Comment obtenir un tableau de points pour la reconnaissance ? Si ce n'est qu'à travers une capture d'écran, ce qui est aussi un non-sens.
Ou ai-je tort ?

Le code est bien sûr le mien, ce qui signifie qu'il est open source. Je me suis juste dit que s'il y a une date à l'écran, pourquoi ne pas l'enregistrer quelque part si on peut l'obtenir ... A condition que vous puissiez l'obtenir. Ha-ha-ha, "magnifiquement" dit.

C'est un peu comme si vous pouviez récupérer une chaîne de caractères dans un champ de texte et en extraire une partie. Mais, hélas, non, non.

 
Andrey Barinov:

La propriété bitmap contient un chemin d'accès à la ressource. Je ne sais pas si vous pouvez l'obtenir de manière programmatique.


Exactement. Après tout, la question n'était pas de l'obtenir à partir d'une image, mais à partir d'une ressource. Et puis j'ai moi-même perdu ce que je cherchais. Je vais expérimenter et voir quelles propriétés je peux obtenir.


Ça ne marche pas pour moi...

  string resource = "\\Scripts\\Test\\Canvas\\00.ex5::aaa";     // получили путь к ресурсу созданному другим скриптом

//  if(ObjectGetString(0, "aaa", OBJPROP_BMPFILE, 0, resource))
  if(ObjectSetString(0, "aaa", OBJPROP_BMPFILE, 0, resource))   // работает любая строка, хоть эта, хоть закомментированная выше
   {
    Print(ObjectGetString(0, "aaa", OBJPROP_NAME));             // имя есть
    Print(ObjectGetString(0, "aaa", OBJPROP_BMPFILE));          // путь к ресурсу есть
    Print(ObjectGetString(0, "aaa", OBJPROP_TEXT));             // текста нету.....
    Print(ObjectGetInteger(0, "aaa", OBJPROP_XDISTANCE));       // это значение тоже есть
   }

Et comment obtenir un tableau que je ne trouve pas. Est-ce que c'est possible ?

 
Alexey Viktorov:

Exactement. Après tout, la question n'était pas d'obtenir à partir d'une image, mais d'une ressource. Et puis j'ai perdu ce que je cherchais moi-même. Je vais expérimenter et voir quelles propriétés je peux obtenir.


Ça ne marche pas pour moi...

Et je ne trouve pas comment obtenir un tableau. Est-ce que c'est possible ?

Je pense que ResourceReadImage() ou quelque chose comme ça devrait aider.

 
Alexey Viktorov:

Le code est bien sûr le mien, donc il est ouvert. Je me suis juste dit que si une date est affichée à l'écran, pourquoi la sauvegarder quelque part alors que l'on peut l'obtenir ... A condition que vous puissiez l'obtenir. Ha-ha-ha, bien joué.

C'est un peu comme si vous pouviez récupérer une chaîne de caractères dans une zone de texte et en extraire une partie. Mais, hélas, rien de tel.

Vous êtes vraiment quelqu'un :))
Une valise de piles pour une montre scientifique n'est vraiment pas la meilleure solution, bien que créative.
 
Andrey Barinov:
Je pense que ResourceReadImage() ou quelque chose comme ça devrait aider.

Je l'ai trouvé, mais rien n'a marché pour moi. J'ai essayé de convertir un tableau en chaîne de caractères, mais les types de tableaux ne correspondent pas. Peu importe comment je l'ai tourné, ça n'a pas marché. Je fais peut-être quelque chose de mal, mais je n'ai pas encore de nouvelles idées.

 
Alexey Viktorov:

Je l'ai trouvé, mais rien n'a marché pour moi. J'ai essayé de convertir un tableau en chaîne de caractères, mais les types de tableaux ne correspondent pas. Peu importe comment je l'ai tourné, ça ne marche pas. Je fais peut-être quelque chose de mal, mais je n'ai pas encore de nouvelles idées.

Comment traduire les données de couleur des pixels en une chaîne de caractères ? Et surtout, pourquoi ?
Vous obtenez une image bitmap et vous pouvez ensuite essayer de la reconnaître, mais c'est une autre science :)
 
Nikolai Semko:
Vous êtes vraiment quelqu'un :))))
Une valise pleine de piles pour une horloge scientifique n'est pas vraiment la meilleure solution, bien qu'elle soit créative.

Nikolaï, mais ce n'est pas une solution qui est nécessairement applicable. Après tout, vos dessins animés sont de la même série, beaux, mais sans possibilité d'application dans le commerce.

 
Andrey Barinov:
Comment traduire les données de couleur des pixels en une chaîne de caractères ? Et surtout, pourquoi ?
Vous obtenez une image bitmap et vous pouvez ensuite essayer de la reconnaître, mais c'est une autre science :)

Ah, bien, c'est... Je ne sais pas.))

En général, j'abandonne probablement l'idée. Peut-être que ce n'est vraiment pas ce genre de chose.

 

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

Caractéristiques du langage mql5, subtilités et astuces

fxsaber, 2017.10.31 08:11

// Сохранение Bitmap-объекта в bmp/gif/png-файле (прозрачность не учитывается)
bool BitmapObjectToFile( const long chartID, const string ObjName, const string FileName, const bool FullImage = false )
{  
  const ENUM_OBJECT Type = (ENUM_OBJECT)ObjectGetInteger(chartID, ObjName, OBJPROP_TYPE);  
  bool Res = (Type == OBJ_BITMAP_LABEL) || (Type == OBJ_BITMAP);
             
  if (Res)
  {
    const string Name = __FUNCTION__ + (string)MathRand();

    ObjectCreate(chartID, Name, OBJ_CHART, 0, 0, 0);
    ObjectSetInteger(chartID, Name, OBJPROP_XDISTANCE, -1 e3);
    
    const long chart = ObjectGetInteger(chartID, Name, OBJPROP_CHART_ID);
        
    Res = ChartSetInteger(chart, CHART_SHOW, false) && ObjectCreate(chart, Name, OBJ_BITMAP_LABEL, 0, 0, 0) &&
          ObjectSetString(chart, Name, OBJPROP_BMPFILE, ObjectGetString(chartID, ObjName, OBJPROP_BMPFILE)) &&
          (FullImage || (ObjectSetInteger(chart, Name, OBJPROP_XSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_XSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_YSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_XOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_XOFFSET)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_YOFFSET)))) &&
                         ChartScreenShot(chart, FileName, (int)ObjectGetInteger(chart, Name, OBJPROP_XSIZE),
                                                          (int)ObjectGetInteger(chart, Name, OBJPROP_YSIZE));
    ObjectDelete(chartID, Name);
  }                    

  return(Res);
}


Application

// Сохраняет в png-файлах все Bitmap-объекты текущего чарта
void OnStart()
{  
  for (int i = ObjectsTotal(0) - 1; i >= 0; i--)
  {
    const string Name = ObjectName(0, i);
    
    BitmapObjectToFile(0, Name, (string)ChartID() + "\\" + Name + ".png");    
  }      
}


SZY Le convertisseur de fichiers BMP->GIF/PNG est également implémenté.

 
Alexey Viktorov:

Nouvelle question : Puis-je lire le texte d'une ressource dans un canevas ?

Par exemple ces lignes, ou n'importe laquelle d'entre elles.

Objectif : Dans le kanvas, il y a une ligne qui contient une date. C'est la date que vous voulez lire.

Ou utilisez l'une des vieilles méthodes éprouvées, GV, fichier, graphique ou autre.

Vous pouvez lire les données d'une ressource à l'aide de ResourceReadImage, mais pour ce faire, vous devez les y écrire à l'aide de ResourceCreate. La fonction ResourceCreate accepte uniquement un tableau de données uint et si nous voulons écrire un tableau d'un autre type de données, nous devons utiliser l'union. Déclarez-y plusieurs tableaux de différents types. Après cela, nous pouvons stocker n'importe quelle donnée dans la ressource, y compris des chaînes de caractères. Pour convertir la chaîne de caractères en type de caractère , utilisez StringToCharArray et vice versa, utilisez CharArrayToString. Il ne s'agit donc pas du tout du kanvas, mais de la ressource dans laquelle vous pouvez écrire tout type de données à l'aide d'unions.