Есть ли возможность в объекте OBJ_TEXT выводить текст в несколько строк? - страница 7

 
Реter Konow:
Конечно.

Я хочу ещё вас озадачить, тем чем сам озадачился.))) Есть-ли возможность в одном ресурсе передать несколько отдельных строк, так чтобы можно было читая ресурс, прочесть только выбранную строку из него.

Для картинки несколько строк можно создать посредством TextOut() а вот попытки прочесть такой ресурс успехом не увенчался. Читается только первая строка.

 
Alexey Viktorov:

Я хочу ещё вас озадачить, тем чем сам озадачился.))) Есть-ли возможность в одном ресурсе передать несколько отдельных строк, так чтобы можно было читая ресурс, прочесть только выбранную строку из него.

Для картинки несколько строк можно создать посредством TextOut() а вот попытки прочесть такой ресурс успехом не увенчался. Читается только первая строка.

Нет никакого смысла пытаться сохранять или читать текст с картинки. Используйте ресурс для записи строк так, как я описал выше, а потом извлекайте обратно с помощью CharArrayToString. Далее, разбивайте строку по разделителю и находите среди них нужную. (Следовательно, перед сохранением строки разделите ее на подстроки каким нибудь символом).
 
Реter Konow:
Нет никакого смысла пытаться сохранять или читать текст с картинки. Используйте ресурс для записи строк так, как я описал выше, а потом извлекайте обратно с помощью CharArrayToString. Далее, разбивайте строку по разделителю и находите среди них нужную. (Следовательно, перед сохранением строки разделите ее на подстроки каким нибудь символом).

Да с картинки читать у меня и небыло желания. О картинке я сказал только как для примера записи в несколько строк.

Вытащить подстроку, это слишком просто. Мы ведь не ищем лёгких путей.:))) Спасибо за помощь.

 
Alexey Viktorov:

Да с картинки читать у меня и небыло желания. О картинке я сказал только как для примера записи в несколько строк.

Вытащить подстроку, это слишком просто. Мы ведь не ищем лёгких путей.:))) Спасибо за помощь.

Вытащить подстроку не слишком тяжело, если уже умеете сохранять данные в ресурсе и извлекать их. Это простая задача сама по себе. Попробуйте сначала сохранить строку в ресурсе, а потом извлечь ее оттуда. Потом добавьте функцию разбития строки на подстроки и поиск нужной.
 
Реter Konow:
Вытащить подстроку не слишком тяжело, если уже умеете сохранять данные в ресурсе и извлекать их. Это простая задача сама по себе. Попробуйте сначала сохранить строку в ресурсе, а потом извлечь ее оттуда. Потом добавьте функцию разбития строки на подстроки и поиск нужной.

Peter спасибо за помощь. Со строками работать я научился достаточно много лет назад. А как сохранить ресурс и прочесть его, с вашей помощью разобрался вчера. Просто пришла бешеная СМСка в голову, типа надо попробовать... а как это сделать СМСка потерялась в пути, заблудилась в мыслях.

Вот пытаюсь сейчас понять в чём разница двумерных и одномерных массивов для создания ресурсов. У вас есть какие-то наработки, соображения по этому поводу?

 
Alexey Viktorov:

Peter спасибо за помощь. Со строками работать я научился достаточно много лет назад. А как сохранить ресурс и прочесть его, с вашей помощью разобрался вчера. Просто пришла бешеная СМСка в голову, типа надо попробовать... а как это сделать СМСка потерялась в пути, заблудилась в мыслях.

Вот пытаюсь сейчас понять в чём разница двумерных и одномерных массивов для создания ресурсов. У вас есть какие-то наработки, соображения по этому поводу?

Честно говоря, я никогда не сохранял в ресурсе двумерный массив. Всегда работал с одномерным, потому как он не ограничен. Для сохранения данных лучше подходит одномерный, хотя, конечно необязательно. Смотря какие данные и в каком формате. Для сохранения строк используйте только одномерный массив, т.к. двумерный нельзя послать в функции CharArrayToString и StringToCharArray. Поэтому, для универсальности, я бы посоветовал Вам разработать механизм сохранения любых своих данных в одномерном массиве. Но, можете попробывать использовать двумерные для нестроковых данных одного типа. Будет интересно, что из этого получится.
 

Прочел несколько более ранних страниц и понял, что задача была прочесть всего только одну малую строку из ресурса. Если эта строка менее 64-ех символов, то нет смысла городить огород с юнионами и сохранением данных в ресурсе. Просто запишите нужную строку в свойство описание объекта OBJPROP_TEXT:

ObjectSetString(chartID,label_name,OBJPROP_TEXT,"Ваша строка");

И получите ее назад так:

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


И все.))

 
Alexey Viktorov:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: 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:

Прочел несколько более ранних страниц и понял, что задача была прочесть всего только одну малую строку из ресурса. Если эта строка менее 64-ех символов, то нет смысла городить огород с юнионами и сохранением данных в ресурсе. Просто запишите нужную строку в свойство описание объекта OBJPROP_TEXT:

ObjectSetString(chartID,label_name,OBJPROP_TEXT,"Ваша строка");

И получите ее назад так:

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


И все.))

Не совсем так. Задача была вывести несколько строк информации. На мой взгляд ... просто мне так захотелось, вывести это канвасом. В одной из строк есть дата. Эта дата не только для наглядности, но и должна использоваться программой даже после перезагрузки. Выходит, что её надо как-то сохранить. Тут я и начал куралесить, лёгких путей не ищем. Поскольку один из способов сохранить дату, это использование графического объекта, то почему-бы не использовать тот самый ресурс. После перезапуска МТ ресурс читается, а вот после перезагрузки компа не проверил пока. Главное что я разобрался с ресурсами и юнионами. А дальше пошли бешеные СМСки в голову. Как поудаляю все, так и продолжу полезную работу.

 
Alexey Viktorov:

Не совсем так. Задача была вывести несколько строк информации. На мой взгляд ... просто мне так захотелось, вывести это канвасом. В одной из строк есть дата. Эта дата не только для наглядности, но и должна использоваться программой даже после перезагрузки. Выходит, что её надо как-то сохранить. Тут я и начал куралесить, лёгких путей не ищем. Поскольку один из способов сохранить дату, это использование графического объекта, то почему-бы не использовать тот самый ресурс. После перезапуска МТ ресурс читается, а вот после перезагрузки компа не проверил пока. Главное что я разобрался с ресурсами и юнионами. А дальше пошли бешеные СМСки в голову. Как поудаляю все, так и продолжу полезную работу.

Хорошо. Тогда продолжайте осваивать ресурсы и юнионы. Через них открывается универсальный способ не только быстрой записи и хранения любых данных, но и обмена этими данными между разными программами в режиме реального времени и без нагрузки на диск.

Причина обращения: