Bibliotheken: Easy Canvas - Seite 8

 
Nikolai Semko:

Umbenennen ist nicht schwer. Es gibt die Tastenkombination Strg+H

Aber ich stimme mit Andrei überein. Suchen Sie nach #define T oder #include <Canvas\iCanvas.mqh> setzen Sie es zuerst in das Projekt

Die Suche nach Dateien ist automatisch ) Es gibt kein #define T in irgendeiner Datei im MQL5 Ordner.

Ich konnte herausfinden, dass es einen Konflikt mit etwas in TypeToBytes.mqh von TradeTransactions https://www.mql5.com/de/code/22166 gibt.

Diese Bibliothek wurde seit langem nicht mehr geändert, so dass höchstwahrscheinlich eine Neuerung oder ein Fehler in einem der neuen Builds aufgetreten ist.)

 
Oleksii Chepurnyi:

Ich habe herausgefunden, dass der Konflikt mit etwas in TypeToBytes.mqh von TradeTransactions https://www.mql5.com/de/code/22166 zusammenhängt.

Diese Bibliothek wurde seit langem nicht mehr geändert, so dass höchstwahrscheinlich eine neue Funktion oder ein Fehler in einem der neuen Builds aufgetaucht ist)

Dies ist ein Compiler-Fehler.

#include <TypeToBytes.mqh> // https://www.mql5.com/de/code/16282

class CLASS
{
  void Method()
  {
    datetime T[1];
    
    T[0] = 0; // '[' - Name erwartet
  };
};

void OnStart()
{
  datetime T[1];
  
  T[0] = 0; // OK
}
 
Ich hab's. Ich danke Ihnen. Ich werde es dann natürlich korrigieren.
 

Juhu, wir haben es gefunden! )


@fxsaber, verfolgen Sie Zweige für "Ihre" Schlüsselwörter mit etwas Automatischem, oder scrollen Sie einfach regelmäßig durch alle Zweige? Sie reagieren sehr schnell auf "gezielte" Fragen.

 
Andrey Khatimlianskii:

@fxsaber, verfolgen Sie die Verzweigungen für "Ihre" Schlüsselwörter mit etwas Automatischem, oder blättern Sie einfach regelmäßig durch alle Verzweigungen? Sie beantworten "gezielte" Fragen sehr schnell.

Das passiert zufällig.

 

Ich möchte für interessierte Programmierer einen wichtigen Punkt der Kanvas-Bedienung im Tester-Modus klären.
Ein bekannter Programmierer in dieser Community stellte mir diese Frage:

- Warum wird im Testmodus das auf Objekten erstellte Panel um eine Größenordnung schneller neu gezeichnet als das auf Kanvas realisierte, während im normalen Modus alles mit der Geschwindigkeit von Kanvas in Ordnung ist?

Nach einer Analyse habe ich den Grund und die Lösung für dieses Problem verstanden.

Die Sache ist die, dass, wenn Objekte zusammen mit dem Neuzeichnen des gesamten Bildschirms neu gezeichnet werden, und der Bildschirm im Testgerät nicht öfter als 30 Bilder pro Sekunde neu gezeichnet wird.

Objekte sind letztlich die gleiche Leinwand (intern), aber wenn Sie die Eigenschaften eines Objekts ändern, wird die Leinwand des Objekts nicht gebildet (nicht neu berechnet), sondern wird nur im Moment der Aktualisierung des Bildschirms (ChartRedraw), die in der Tester passiert (und im normalen Modus auch) nicht öfter als unser Auge unterscheiden kann Änderungen, dh nicht öfter als ~ 32 Frames pro Sekunde.

Nehmen wir an, dass sich das Panel bei jedem Tick ändert. Dann wird die Leinwand im Standard-Testgerät bei jedem Tick neu berechnet, aber das Neuzeichnen im Testgerät ist immer noch nicht häufiger als ~30 Millisekunden (~30 Bilder pro Sekunde).

Mit anderen Worten: Die Leinwand wird viel häufiger neu berechnet, als sie tatsächlich auf dem Bildschirm angezeigt wird, was zu einem unverhältnismäßig hohen Ressourcenverbrauch führt.

Die Lösung für dieses Problem besteht darin, die Neuberechnung und das Neuzeichnen von Leinwänden nicht öfter als alle 15-30 Millisekunden der Computerzeit zu steuern, dann gibt es keine unnötigen Zyklen von leeren Neuberechnungen.

Zum Beispiel, wie dies:

void OnTick()
  {
  static uint lastCalc=0;
  uint cur=GetTickCount();
  if (cur-lastCalc>15) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }
 

Guten Tag!

   if(width==0) {width=W.Width;   FullWinCanvW=true; Xpos=0;} else FullWinCanvW=false;
   if(height==0){height=W.height[SubWin]; FullWinCanvH=true; Ypos=0;} else FullWinCanvH=false;
   Name+=IntegerToString(rand())+IntegerToString(rand());
   Handle=ChartGetInteger(chart_id,CHART_WINDOW_HANDLE,SubWin);
   if(!CreateBitmapLabel(chart_id,SubWin,Name,Xpos,Ypos,width,height,formatCF))
      Print("Error creating canvas: ",GetLastError());

Diese Zeile im Konstruktor, warum?

CCanvas fügt auch eine Menge zum Namen hinzu, einschließlich rand. Manchmal ist der Name so lang, dass er die zulässige Länge überschreitet )

 
Oleksii Chepurnyi:

Guten Tag.

Diese Zeile im Konstruktor, warum?

CCanvas fügt auch eine Menge zum Namen hinzu, einschließlich rand. Manchmal ist der Name so lang, dass er die zulässige Länge überschreitet )

Ja, ich stimme zu.
In meiner Version von iCanvas habe ich das bereits behoben, aber hier habe ich es wohl vergessen.

 
Version 1.40
Einige Fehler wurden behoben.
Insbesondere wurde ein Fehler behoben: Die Größe von iCanvas-Objekten wurde nicht automatisch vertikal angepasst, wenn mehr als ein Objekt vorhanden war.
 
Letzte Version 1.40
Dateien:
iCanvas.mqh  48 kb