Ein Crowdsourced-Projekt auf Canvas durchführen - Seite 23

 
Реter Konow:

))) Warum habe ich also dieses Thema begonnen? ) Ich werde mich jetzt mit OOP befassen.


Das ist der Vorteil deines Weges - von der Praxis zur Theorie. Das habe ich auch schon gemacht. Mein Bauchgefühl hat sich lange Zeit gegen das OOP-Paradigma gewehrt, weil ich mit der Programmierung begonnen habe, als es noch nicht in freier Wildbahn existierte. Aber jetzt verstehe ich, dass dies die wertvollste Erfindung in der Programmierung ist. Und manchmal kommt es mir so vor, als ob ich das AOP selbst erfunden hätte, wenn es noch nicht erfunden worden wäre :))
Dir, Peter, wird es gefallen, und du wirst begeistert sein, wenn du erkennst, wie großartig OOP ist und welche Möglichkeiten es eröffnet. Das versichere ich Ihnen :)). Und es gibt nichts Kompliziertes und Verworrenes an OOP, besonders für Sie mit Ihrer Programmiererfahrung. Und es scheint mir, dass in Ihrem Fall die Dokumentation von Metacvots sogar ausreicht, um der Sache auf den Grund zu gehen. Es gibt eine Menge Literatur dazu.
Tag Konow:

Aber Nikolay, ich verstehe immer noch nicht, was ich gefragt habe - gibt es eine Möglichkeit, eine bestimmte Farbe für Verlaufslinien des Rahmens in der CCcanvas-Klasse festzulegen? Wenn man sich Ihr Beispiel ansieht, könnte man meinen, dass es... Wenn ja, können Sie etwas Ähnliches wie mein Beispiel zeichnen?

OKAY, OKAY. Es ist zwar nicht das Thema dieses Threads, aber ich werde versuchen, Dinge zu klären, die für erfahrene Programmierer offensichtlich sind, aber für Programmierer, die Canvas zum ersten Mal benutzen, nicht offensichtlich sind.
Was also ist Canvas. Aus dem Englischen übersetzt ist es eine Leinwand. Es ist einfach ein beliebiger Bereich des Bildschirms innerhalb eines Fensters, an das es dann angehängt wird. Seine Hauptmerkmale sind seine Größe (Breite und Höhe). Und tatsächlich handelt es sich um ein eindimensionales Array von Punkten des Typs uint (4 Byte) mit der Größe Breite*Höhe. In der CCanvas-Klassenimplementierung heißt dieses Array m_pixels, und standardmäßig ist es privat (d.h. nur innerhalb der Klasse zugänglich), aber ich persönlich mache es immer öffentlich (nicht nur innerhalb der Klasse, sondern auch in Benutzeranwendungen zugänglich), weil ich direkt mit dem Datenarray arbeiten möchte. Jeder Punkt auf dieser Leinwand kann einen beliebigen Wert des Farbtyps annehmen (ebenfalls 4 Bytes wie uint, ein Byte reserviert), d.h. einen Punkt einer beliebigen RGB-Farbe. Jede Farbe (Rot, Grün oder Blau) entspricht einem Byte (256 Werte), so dass es insgesamt 256*256*256=16.777.216 RGB-Farben gibt.

Um einen roten Punkt in X,Y-Koordinaten zu setzen, wobei X Werte von 0 bis (Breite-1) und Y von 0 bis (Höhe-1) annehmen kann, weisen Sie einer Zelle des Arrays m_pixels mit der Nummer (Y*Breite+X) einen roten Wert zu:

m_pixels[Y*Width+X]=clrRed;

oder was dasselbe ist:

m_pixels[Y*Width+X] = 0x0000FF; // 0x00FF00 зеленый, - 0xFF0000 - синий, 0x00FFFF - желтый и т.д.

Das ist ALLES!!!
Sie können jetzt nicht einmal die eingebauten Funktionen der CCanvas-Klasse verwenden (was natürlich dumm ist, weil es dort eine Menge nützlicher Dinge gibt). Wenn Sie einen Punkt auf den Bildschirm setzen können, egal wo und in welcher Farbe, dann können Sie zeichnen, was Sie wollen: Schaltflächen, Grafiken, Ihre eigene GDI erstellen usw. usw.

Und wer glaubt, dass Kanvas langsam ist, der irrt. Kanvas ist unglaublich schnell, und das ist ein Verdienst des Entwicklungsteams. Ich habe die Geschwindigkeit beim Zeichnen von Leinwänden viele Male mit Dll-Bibliotheken getestet, die ebenfalls in C++ geschrieben wurden. Nach den Updates des letzten Jahres ist das Canvas auf MT5 nun fast so schnell, als ob man es in Visual Studio in C++ geschrieben hätte. Sie ist nur 10-15 % langsamer. Und vergessen Sie nicht: Windows ist in C++ geschrieben und besteht ausschließlich aus Canvas. Das ist die Schönheit und das Versprechen von MT5 mit seinem MQL5!!! Weder Java noch C# werden mit einer solchen Geschwindigkeit aufwarten können, wie einige in diesem Thread geschrieben haben.

Nicht umsonst haben die Entwickler vor kurzem eine neue Eigenschaft CHART_SHOW eingeführt, um das Rendern von Grafiken zu deaktivieren.
Ich werde dies anhand eines Beispiels für ein Skript demonstrieren:

//+------------------------------------------------------------------+
//|                                                  CleanScreen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

// Внимание !!! В классе CCanvas массив m_pixels должен быть определен как public
#include <Canvas\Canvas.mqh>

void OnStart()
  {
   ChartSetInteger(0,CHART_SHOW,false); // очищаем экран от всего
   int Width =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину экрана
   int Height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту экрана

   CCanvas C;   // создаем объект Canvas
   if(!C.CreateBitmapLabel(0,0,"CleanScreen",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // Создаем холст на весь экран
      Print("Error creating canvas: ",GetLastError());

// Теперь что-нибудь нарисуем на этом чистом экране
// например красную точку в центре экрана
   int X=Width/2;
   int Y=Height/2;
   C.m_pixels[Y*Width+X]=0xFF0000; // красный
                                   // или нарисуем окружность в центре с радиусом 100 по точкам фиолетового цвета
   int r=100;
   int q=(int)ceil(r*M_SQRT1_2);
   int r2=r*r;
   for(int x=0; x<=q; x++)
     {
      int y=(int)round(sqrt(r2-x*x));
      C.m_pixels[(Y+y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y+y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X-y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X-y]=0xFF00FF;
     }
// конечно же можно окружность построить проще :) - через встроенную функцию класса CCanvas:
   C.Circle(X,Y,r+20,0xFFFF00); // желтого цвета
   C.Update(); // Теперь выводим это на экран
  }

Bedienung dieses Skripts:


Der Bildschirm wird geleert, aber der Zugang zu den Kursen bleibt erhalten, und wir können diese leere Leinwand nutzen, um unsere eigene Diagrammoberfläche zu erstellen, z. B. diese mit einem Farbverlauf:


Regex Konow:

Aber Nikolai, ich habe immer noch nicht verstanden, wonach ich gefragt habe - gibt es eine Option in der CCcanvas-Klasse, um eine bestimmte Farbe für die Verlaufslinien des Rahmens festzulegen? Wenn man sich Ihr Beispiel ansieht, könnte man meinen, dass es... Wenn ja, können Sie etwas Ähnliches wie mein Beispiel zeichnen?

Die Farbe wird innerhalb der GButton-Klasse definiert, und es gibt sogar zwei Funktionen zum Mischen der beiden Farben und zum Erstellen eines Arrays von Farben, um von einer Farbe zur anderen zu gelangen, d. h. nur für den Farbverlauf. Es geht nur darum, den Begriff des Gefälles zu definieren. Nach meinem Verständnis ist ein Farbverlauf (oder eine Verlaufsfüllung) ein gleichmäßiger Übergang von einer Farbe zur anderen. In Ihrem Beispiel gibt es keinen Farbverlauf, sondern nur 4 Farben. In meinem Beispiel werden innerhalb der GButton-Klasse 4 zusätzliche Farben mit unterschiedlicher Helligkeit der Farbe gebildet und ein Array von Farben für die Farbverlaufsfüllung gebildet. Dies geschieht genau deshalb, um dem Endnutzer der Klasse das Leben zu erleichtern. Warum sollte er sich um die Bildung dieser Farben kümmern?
Zeichne etwas Ähnliches wie dein Beispiel - das ist deine Hausaufgabe, Peter :)) Komm schon, fang an, Klassen zu verstehen, also die OOP.
Viel Glück!
 
Nikolai Semko:

Viel Glück!

Okay, Nikolai. Vielen Dank und viel Glück auch für Sie!
 
Nikolai Semko:

Nikolai, ich wollte gestern auf Ihren informativen Beitrag antworten, aber ich konnte meine Gedanken nicht sammeln. Jetzt habe ich meine Gedanken gesammelt und erkannt, dass ich aus dem Herzen und nicht aus dem Kopf schreiben muss, sonst erkläre ich nichts. Natürlich würde es nicht zum Thema gehören und die Moderatoren würden es wahrscheinlich löschen, aber trotzdem...

Was Sie über OOP schreiben, ist inspirierend. Ich habe bereits begonnen, es zu studieren, mit der ernsthaften Absicht, es zu meistern. Während des Lernens wurde ich jedoch ständig mit Fragen der Kategorie "Warum den langen Weg nehmen, wenn es eine Abkürzung gibt?" bombardiert. Ich sah ständig einfache, prägnante und klare Wege, Probleme zu lösen, und es war, als würde man mir sagen: "Nein! In OOP ist das keine Lösung. Man muss es formell, formell und edel machen". Daraufhin habe ich mich gefragt: "Aber wie kann das sein? Ich brauche diese Einrichtungen nicht. Warum sollte ich sie in den Code aufnehmen? Sie sind überflüssig. Ich will den Code schrumpfen." Und ich sagte: "Nein, das ist nicht professionell. Das ist schlechter Code."

Ich habe mich viel mit dem Thema OOP auseinandergesetzt und versucht herauszufinden, was die Vorteile für mich sind. Ich dachte: "Wenn ich Aufgaben auch ohne OOP gut und einfach lösen kann, warum sollte ich sie dann verwenden? Warum sollte ich zusätzlich einfache und für mich klare Dinge verkomplizieren? Wie, wo und warum sollte ich etwas in meinen Code einbauen, das ich nicht brauche?". Dann habe ich beschlossen, dass ich kein OOP brauche, weil ich alles selbst mache und sehr gut darin bin. Wenn man alles selbst macht und nicht erwartet, dass man etwas einstecken muss, und darüber hinaus die effektivsten Lösungen sucht und findet, dann stellt sich natürlich die Frage: "Warum sonst? Es scheint, dass OOP einem Programm Komfort und Ordnung verleiht. Ja, das tut sie. Aber ich habe meinen eigenen Auftrag. Meine eigene Struktur. Meine eigenen Einheiten. Meine eigenen Regeln. Warum sollte ich sie also ablehnen?

So wie unser Körper fremdes Gewebe abstößt, konnte ich nicht mit dem Produkt fremder Gedanken "verschmelzen". Überall und in allem fühlte ich mich abgelehnt. Für mich war PLO eine Ordnung, die durch die Gedanken eines anderen geschaffen wurde, und sie hat meinen Wirksamkeitstest nicht bestanden. Dieser Test war für mich der entscheidende Faktor. Ich habe erkannt, dass ich ein schwächerer Programmierer sein werde, wenn ich OOP verwende, als wenn ich meinen eigenen Weg gehe und alle Probleme selbst löse. Meine "Programmierstärke" besteht darin, dass ich in einer Sprache schreibe, die ich auf Russisch verstehe, einen gemeinsamen globalen Speicher für grafische Objekte verwende, den ich "Kernel" nenne, und große und komplexe Mechanismen entwickle, die mit diesem Kernel arbeiten. Das ist mein Ansatz.

Ich werde so lange nicht OOP programmieren, bis mich jemand mit diesem Ansatz besiegt. Bis sie damit das tun, was ich tue, nur noch effizienter.

Ich habe mich nach Kanvas erkundigt, weil ich verstehen wollte, warum mein Mechanismus in der Tat effektiver ist. Nicht in der Theorie, nicht in der Schönheit des Codes, sondern in der Praxis.

Jedenfalls danke ich dir, Nikolay, dass du mich inspiriert und angeleitet hast. ))

 
Реter Konow:

...

Ich werde so lange nicht OOP programmieren, bis mich jemand mit diesem Ansatz besiegt.

...


Dieser Jemand ist wahrscheinlich eine der Windmühlen, gegen die Sie in Ihrer Fantasie so verzweifelt kämpfen. )
 
Anatoli Kazharski:

Dieser Jemand muss eine dieser Windmühlen sein, gegen die Sie in Ihrer Fantasie so verzweifelt ankämpfen. )
Na also! Die Trolle kommen...))
 
Реter Konow:
Na also! Die Trolle kommen...))
Beruhige dich, Peter. Es sind nur Mühlen. Sie stehen einfach da, erfüllen eine bestimmte Funktion und versuchen nicht, dich zu schlagen. Aber wer weiß, wie du dir das in deiner fruchtbaren Fantasie vorstellst. Allem Anschein nach sieht es sehr spektakulär aus. )
 
Реter Konow:

Ich bin absolut kein Fan von OOP, aber man muss sie kennen und klar anwenden können, wenn man sich als Programmierer versteht, zumindest um sich selbst weiterzubilden.

Aber ob Sie es zur Lösung Ihrer Anwendungsaufgaben verwenden wollen oder nicht, bleibt Ihnen überlassen.

 
Anatoli Kazharski:
Beruhige dich, Peter. Es sind nur Mühlen. Sie stehen nur herum, erfüllen eine bestimmte Funktion und versuchen nicht, dich zu schlagen. Aber wer weiß, wie Sie sich das in Ihrer fruchtbaren Fantasie vorstellen. Allem Anschein nach sieht es sehr spektakulär aus. )

Anatoly, Mühlen hin oder her, ich kämpfe und gewinne gern. Vor allem bei dem, was ich gut kann. Ich mag Live-Wettbewerbe, Duelle und so... Das ist alles Teil der Evolution und der natürlichen Auslese. Es ist also in Ordnung... Solange die Regeln fair sind.

Die Zusammenarbeit mit Gleichgesinnten, die Teilnahme an gemeinsamen Projekten, die Arbeit in einem Team ist auch cool. Und natürlich darf die Phantasie die Realität nicht ersetzen. Wenn Sie das meinen, bin ich einverstanden.

 
Комбинатор:

... Aber man muss sie kennen und eindeutig anwenden können, wenn man sich als Programmierer versteht, zumindest um sich selbst weiterzubilden.

Aber es ist Ihnen überlassen, ob Sie sie für Ihre eigenen Anwendungen nutzen oder nicht.

Dem kann man nicht widersprechen.
 
Реter Konow:

Ich werde so lange nicht OOP programmieren, bis mich jemand mit diesem Ansatz besiegt. Bis sie damit das tun, was ich tue, nur noch effizienter.

Ich habe mich nach Kanvas erkundigt, weil ich verstehen wollte, warum mein Mechanismus in der Tat effektiver ist. Nicht in der Theorie oder in der Schönheit des Codes, sondern in der Praxis.

Auf jeden Fall danke ich dir, Nikolay, dass du mich inspiriert und angeleitet hast. ))

Wenn zwei Programmierer mit gleicher Erfahrung und Intelligenz bei der Erstellung ähnlichgroßer Projekte miteinander konkurrieren. Die erste Version verwendet jedoch nur Funktionen, während die zweite Version Funktionen und Klassen verwendet. Der zweite wird auf jeden Fall gewinnen. Aber, ich wiederhole, wenn es sich um ein umfangreiches Projekt handelt, wird es mit letzterem schneller gehen, weil es weniger Fehler und mehr Ordnung gibt. Und das zweite Produkt wird besser lesbar, wartbar und leichter zu aktualisieren und zu ergänzen sein. Das ist nicht einmal meine Meinung, sondern nur eine Feststellung von Tatsachen. Es ist einfacher, ein Loch mit einer Schaufel zu graben als mit einer Kelle. Wenn Sie Ihren Mechanismus nicht nur auf Funktionen, sondern auch auf Klassen anwenden würden, wäre er effizienter. Das ist meine Meinung.

Und Peter, ich habe einen kurzen Blick auf deinen Code geworfen und festgestellt, dass du Canvas in vollem Umfang verwendest (zwar nicht die CCanvas-Klasse, aber wen interessiert das schon). Warum dann all diese Fragen zur Leinwand und warum ich versuche, all diese Dinge hier zu erklären? :)).

Grund der Beschwerde: