Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 06.08.21
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard DeInit mit reason funktioniert nicht

Ich versuche in DeInit mit Hilfe der reason die erforderlichen Aktionen einzuteilen, leider klappt das nicht.
Die Situation: ich habe im EA 2 unterschiedliche Objektarten, das eine ist die Steuereinheit (besteht aus Button, RectangleLabel und Label) und das andere ist die Aktionseinheit (besteht aus Linien und Buffern, die hier aber unwichtig sind).
Code:
   // === delete all created objects
   // === ONLY if we failed to init or if we are deleted from chart
   if(   reason==REASON_PROGRAM 
      || reason==REASON_REMOVE
      || reason==REASON_CHARTCLOSE
      || reason==REASON_INITFAILED
      || reason==REASON_CLOSE       )
   {
      for(int i=ObjectsTotal()-1; i>=0; i--)
      {
         string obj_name=ObjectName(i);
         if(StringSubstr(obj_name,0,StringLen(PFX))==PFX) //ExactPFXmatch
         {
            ObjectDelete(0,obj_name);
         }
      }
   }
   // === in other cases keep action objects, only delete the panel
   // === this will be recreated in OnInit
   else if(   reason==REASON_CHARTCHANGE  //ForTimeframeChange
           || reason==REASON_RECOMPILE    //ForWorkingInEditor
           || reason==REASON_TEMPLATE     //ForChangeOfIndicatorCombination
           || reason==REASON_PARAMETERS   //ForChangeOfValues
           || reason==REASON_ACCOUNT    ) //ForLoosingServerConnection
   {
      DriveRemoveAll();
   }
DriveRemove all sucht nach den Elementen der Steuereinheit und löscht sie:
Code:
void DriveRemoveAll() 
{
   for(int i=ObjectsTotal()-1; i>=0; i--)
   {
      string obj_name=ObjectName(i);
      if(StringSubstr(obj_name,0,StringLen(PFX))==PFX) //ExactPFXmatch
      {
         if(ObjectGetInteger(0,obj_name,OBJPROP_TYPE)==OBJ_BUTTON ) 
            ObjectDelete(0,obj_name);
         else if(ObjectGetInteger(0,obj_name,OBJPROP_TYPE)==OBJ_RECTANGLE_LABEL ) 
            ObjectDelete(0,obj_name);
         else if(ObjectGetInteger(0,obj_name,OBJPROP_TYPE)==OBJ_LABEL ) 
            ObjectDelete(0,obj_name);
      }
   }
}
Aber anstatt bei einem Recompile nur die Steuereinheit zu löschen, werden komplett alle Elemente rigoros gelöscht. Dasselbe passiert, wenn ich einfach nur den Timeframe wechsele.
Ich bin momentan komplett ratlos, wieso das nicht funktioniert. Hat jemand eine Idee?
Danke. AVT