ЗАПИСЬ И ЧТЕНИЕ БИНАРНЫХ ФАЙЛОВ. Кто может помочь понять, что неправильно в коде?

 
Это скрипт.
//+------------------------------------------------------------------+
//|                                                    Component.mq4 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs

input int interfaceID=0; //входной параметр - идентификатор сохраняемого интерфейса
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//откроем файл для записи
   int handle=FileOpen("Scheme_"+IntegerToString(interfaceID)+".bin", FILE_WRITE|FILE_BIN);
   if(handle!=INVALID_HANDLE)
     {
      //переберём все объекты на экране
      for(int i=0; i<ObjectsTotal(); i++)
        {
         string name=ObjectName(i);
         Print(i," name=",name);

         //и запишем их свойства в файл
         FileWriteString(handle,name,100);

         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_TYPE),INT_VALUE);
         Print(i," TYPE=",ObjectGetInteger(0,name,OBJPROP_TYPE));
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_XDISTANCE),INT_VALUE);
         Print(i," X=",ObjectGetInteger(0,name,OBJPROP_XDISTANCE));
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_YDISTANCE),INT_VALUE);
         Print(i," Y=",ObjectGetInteger(0,name,OBJPROP_YDISTANCE));
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_XSIZE),INT_VALUE);
         Print(i," XSIZE=",ObjectGetInteger(0,name,OBJPROP_XSIZE));
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_YSIZE),INT_VALUE);
         Print(i," YSIZE=",ObjectGetInteger(0,name,OBJPROP_YSIZE));
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_COLOR),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_STYLE),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_WIDTH),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_BACK),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_SELECTED),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_SELECTABLE),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_READONLY),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_FONTSIZE),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_STATE),INT_VALUE);
         FileWriteInteger(handle,(int)ObjectGetInteger(0,name,OBJPROP_BGCOLOR),INT_VALUE);
         Print(i," COLOR=",ObjectGetInteger(0,name,OBJPROP_BGCOLOR));

         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_TEXT),100);
         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_FONT),100);
         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_BMPFILE,0),100);
         FileWriteString(handle,ObjectGetString(0,name,OBJPROP_BMPFILE,1),100);

         FileWriteDouble(handle,ObjectGetDouble(0,name,OBJPROP_PRICE));

        }
      //закроем файл
      FileClose(handle);
      Alert("Done!");
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                               RESTORE_OBJECT.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                            https://www.mql5.com/ru/users/ich_hub |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/ich_hub"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int wnd=0;             //индекс окна с индикатором
bool last_loaded=false; //флаг указывающий, первая инициализация, или нет
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//запустим таймер с периодичностью в 1 секунду
   EventSetTimer(1);

//если первая инициализация - создадим интерфейс
   if(!last_loaded)
      create_interface();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
//если причина деинициализации - не смена таймфрейма или символа
   if(reason!=REASON_CHARTCHANGE)
     {
      //сбросим флаг инициализации
      last_loaded=false;
      //удалим все объекты панели
      ObjectsDeleteAll_my("ABR");
     }
//иначе установим флаг
   else
      last_loaded=true;
//остановим таймер
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+
//| Функция создания интерфейса                                      |
//+------------------------------------------------------------------+
void create_interface()
  {
//создадим интерфейс главного меню
   ApplyScheme(0);
//перерисуем график
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Функция удаления всех объектов панели                            |
//| IDstr - строка-идентификатор                                     |
//+------------------------------------------------------------------+
void  ObjectsDeleteAll_my(string IDstr)
  {
//переберём все объекты
   for(int i=ObjectsTotal(); i>=0; i--)
     {
      string n=ObjectName(i);
      //если в имени есть идентификатор - удалим объект
      if(StringFind(n,IDstr)>=0)
         ObjectDelete(0,n);
     }
  }
//+------------------------------------------------------------------+
//| Функция загрузки интерфейса                                      |
//| ID - идентификатор сохранённого интерфейса                       |
//+------------------------------------------------------------------+
bool ApplyScheme(int ID)
  {
   string fname="Scheme_"+IntegerToString(ID)+".bin";
//если не существует сохранённая схема загрузим стандартную
   if(!FileIsExist(fname))
      fname="Scheme_"+IntegerToString(ID)+".bin";
//откроем файл для чтения
   int handle=FileOpen(fname,FILE_READ|FILE_BIN);
//файл открыт
   if(handle!=INVALID_HANDLE)
     {
      //считаем всё
      while(!FileIsEnding(handle))
        {
         string obj_name=FileReadString(handle,100);
         ENUM_OBJECT obj_type=ENUM_OBJECT(FileReadInteger(handle));
         Print("obj_name=",obj_name," obj_type=",obj_type);
         //создаём объект
         ObjectCreate(0, obj_name, obj_type, wnd, 0, 0, 0, 0);
         //и применяем к нему свойства
         ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_COLOR,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_STYLE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_WIDTH,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_BACK,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_SELECTED,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_SELECTABLE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_READONLY,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_FONTSIZE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_STATE,FileReadInteger(handle));
         ObjectSetInteger(0,obj_name,OBJPROP_BGCOLOR,FileReadInteger(handle));

         ObjectSetString(0,obj_name,OBJPROP_TEXT,FileReadString(handle,100));
         ObjectSetString(0,obj_name,OBJPROP_FONT,FileReadString(handle,100));
         ObjectSetString(0,obj_name,OBJPROP_BMPFILE,0,FileReadString(handle,100));
         ObjectSetString(0,obj_name,OBJPROP_BMPFILE,1,FileReadString(handle,100));

         ObjectSetDouble(0,obj_name,OBJPROP_PRICE,FileReadDouble(handle));

        }
     
      //закроем файл
      FileClose(handle);
      return(true);
     }
   return(false);
  }

Друзья!

Копаясь в нашей библиотеке нашел довольно давнее издание статьи

https://www.mql5.com/ru/articles/62


Меня заинтересовала довольно простая схема получения быстрых результатов создания адаптивных панелей управления.

К тому же нужно было решить несколько подобных задач, но на MQL4.

И вот тут начались проблемы.

Есть два программных файла:

1-скрипт, который считывает в бинарный файл все графические объекты с экрана.

2-советник, который должен их восстановить на экране после их удаления.

В результате считывается первый графический объект, но не всегда с параметрами для установки.

В чем может быть проблема?

В приложении оба файла.

А также просто для просмотра.


Создание активных панелей управления на MQL5 для торговли
Создание активных панелей управления на MQL5 для торговли
  • www.mql5.com
Статья посвящена разработке активных панелей управления на MQL5. Управление элементами интерфейса осуществляется при помощи механизма обработки событий, есть возможность гибкой настройки свойств элементов управления. Реализована работа с позициями а также возможность выставления, модификации и удаления рыночных и отложенных ордеров.
Файлы: