Diskussion zum Artikel "Grafische Interfaces I: Vorbereitung der Bibliotheksstruktur (Kapitel 1)" - Seite 3

 
AlexBar3073:

...Aber vom OOP-Standpunkt aus gesehen hat die vorgeschlagene Methode die besten Chancen auf eine praktische Umsetzung. :)

Leichter gesagt als getan.

AlexBar3073:

...

Betrachten wir zum Beispiel die Funktion zum Verschieben eines Formulars im Diagramm.

In der Funktion müssen wir alle erstellten Objekte des Formulars aufzählen. Und warum? Weil alle erstellten Elemente in den Container (Array) des Formulars selbst eingefügt werden. Warum müssen Sie alle erstellten Elemente in der Funktion aufzählen? Warum kann man nicht einfach eine Schleife um den Container machen und die Koordinaten aller Elemente ändern?

...

Achten Sie auf den Typ(CChartObject) des Arrays(m_objects), in dem Zeiger auf alle grafischen Objekte dieses oder jenes Elements(CElement) gespeichert sind. Sie können versuchen, in diesem Fall eine dynamische Typkonvertierung zu verwenden, aber dann wird der Code noch komplizierter und ressourcenaufwändiger, weil Sie zusätzliche Überprüfungen für den Zeigertyp durchführen müssen.

Was Delete() und ähnliche Methoden angeht, kann man sie in einer Schleife durchlaufen (ich bin nur noch nicht dazu gekommen), da alle Objekte den Typ CChartObject haben.

Ich nehme vorsichtig an, dass nach dem Übergang zur zweiten Phase der Bibliotheksentwicklung, wenn alle Elemente gezeichnet werden, alles viel einfacher wird. Das heißt, es wird nur ein Element geben - ein Objekt(bmp).

 
Anatoli Kazharski:

zusätzliche Prüfungen des Zeigertyps.

Und wie kann man eine Überprüfung des Zeigertyps in MQL durchführen?

Meinen Informationen zufolge verfügt die Sprache über keinerlei Mittel dafür. Ich würde gerne überprüfen, ob ein Objekt eine Instanz einer bestimmten Klasse ist oder ob es ein Nachkomme einer Klasse in der Hierarchie ist.

Ich implementiere beispielsweise ein MVC-Muster und abonniere für bestimmte Modelle mit bearbeitbaren Eigenschaften (die einen gemeinsamen Vorfahren haben) ein View-Objekt. Um die Eigenschaftstabelle dieses Objekts anzuzeigen. Nach Änderungen am Modell wird der Listener (View) neu gezeichnet und das Modell-Objekt wird übergeben.

Hier müssen wir das Modell auf einen der Typen der Modellhierarchie (die Eigenschaften zurückgeben können) umwandeln. Es ist jedoch unmöglich zu überprüfen, ob ein Objekt des richtigen Typs angekommen ist.

Theoretisch kann ein Fremdprogrammierer, der eine Anwendung für eine Schnittstelle erstellt, einen Fehler machen und diese Sicht auf ein anderes Modell (aus einer anderen Hierarchie, die keinen Vorfahren mit bearbeitbaren Eigenschaften hat) unterschreiben. Dies kann zur Laufzeit nicht gehandhabt werden und die Anwendung wird abstürzen.

Anatoli Kazharski:

Ich nehme vorsichtig an, dass nach dem Übergang zur zweiten Stufe der Bibliotheksentwicklung, wenn alle Elemente gezeichnet werden, alles viel einfacher wird. Das heißt, es wird nur noch ein Element geben - ein Objekt(bmp).

Ich habe diesen Weg vor ein paar Jahren eingeschlagen. Zuerst erstellte ich ein DOM-Modell für die Schnittstelle, Zeichnungsprimitive, Aggregation von Ansichten, Weitergabe von Ereignissen (Popup, Stop). Alles wurde auf MQL-Graph-Objekte gezeichnet und funktionierte im Prinzip. Aber als die Anzahl der Objekte 200 überstieg, wurde es aufgrund des Overheads, der durch das Neuzeichnen jedes Objekts entsteht, immer langsamer. Deshalb wurde alles für ein weiteres Jahr aufgegeben, bis Canvas erschien. Dann wurde alles schnell auf Canvas übertragen, indem die grundlegenden Zeichenmethoden der Ansicht und die Aktualisierungslogik ersetzt wurden, ohne etwas anderes zu ändern. Und jetzt führen selbst mehrere tausend Ansichten auf dem Bildschirm nicht zu einer Verzögerung beim Zeichnen, weil alles sehr schnell im Speicher gezeichnet und verglichen wird, und die Ausgabe nur ein Bild ist, d.h. nur ein Element aus den Objekten auf dem Diagramm.

Allerdings ist die Entwicklung der UI-Bibliothek im letzten Jahr aus Zeitmangel praktisch zum Erliegen gekommen.


 

Um nicht unsubstantiiert zu sein, gebe ich ein Beispiel für eine Schnittstelle, die auf der Grundlage von UI auf einem einzigen Canvas-Element aufgebaut ist

 
Igor Volodin:

Um nicht unsubstantiiert zu sein, werde ich ein Beispiel für eine Schnittstelle geben, die auf der Basis von UI auf einem Element Canvas

+ mag )
 
Igor Volodin:

Wie kann ich den Zeigertyp in MQL überprüfen?

Nach meinen Informationen verfügt die Sprache über keinerlei Mittel dafür. Ich möchte überprüfen, ob ein Objekt eine Instanz einer bestimmten Klasse ist oder ob es ein Nachkomme einer Klasse in der Hierarchie ist.

Ich implementiere beispielsweise ein MVC-Muster und abonniere für bestimmte Modelle mit bearbeitbaren Eigenschaften (die einen gemeinsamen Vorfahren haben) ein View-Objekt. Um die Eigenschaftstabelle dieses Objekts anzuzeigen. Nach Änderungen am Modell wird der Listener (View) neu gezeichnet und das Modell-Objekt wird übergeben.

Hier müssen wir das Modell auf einen der Typen der Modellhierarchie (die Eigenschaften zurückgeben können) umwandeln. Es ist jedoch unmöglich zu überprüfen, ob ein Objekt des richtigen Typs angekommen ist.

Theoretisch kann ein Fremdprogrammierer, der eine Anwendung für eine Schnittstelle erstellt, einen Fehler machen und diese Sicht auf ein anderes Modell (aus einer anderen Hierarchie, die keinen Vorfahren mit bearbeitbaren Eigenschaften hat) unterschreiben. Dies kann zur Laufzeit nicht behandelt werden und die Anwendung wird abstürzen.

...

Vielleicht über dynamic_cast? Als ich mit der Entwicklung der Bibliothek begann, war dynamic_cast noch nicht verfügbar.

Etwas wie dieses (Beispiel von hier) :

class CFoo { };
class CBar { };
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
   void *vptr[2];
   vptr[0]=new CFoo();
   vptr[1]=new CBar();
//---
   for(int i=0;i<ArraySize(vptr);i++)
     {
      if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
         Print("CFoo * object at index ",i);
      if(dynamic_cast<CBar *>(vptr[i])!=NULL)
         Print("CBar * object at index ",i);
     }
   CFoo *fptr=vptr[1];  // Zeigerumwandlungsfehler, vptr[1] ist kein CFoo-Objekt
  }
//+------------------------------------------------------------------+

//---

Igor Wolodin:

Ich bin diesen Weg vor ein paar Jahren gegangen. Zuerst erstellte ich ein DOM-Modell für die Schnittstelle, Zeichnungsprimitive, Aggregation von Ansichten, Übergabe von Ereignissen (Popup, Stop). Alles wurde auf MQL-Graph-Objekte gezeichnet und funktionierte im Prinzip. Aber als die Anzahl der Objekte 200 überstieg, wurde es aufgrund des Overheads, der durch das Neuzeichnen jedes Objekts entsteht, immer langsamer. Deshalb wurde alles für ein weiteres Jahr aufgegeben, bis Canvas erschien. Dann wurde alles schnell auf Canvas übertragen, indem die grundlegenden Zeichenmethoden der Ansicht und die Aktualisierungslogik ersetzt wurden, ohne etwas anderes zu ändern. Und jetzt führen selbst mehrere tausend Ansichten auf dem Bildschirm nicht zu einer Verzögerung beim Zeichnen, weil alles sehr schnell im Speicher gezeichnet und verglichen wird und die Ausgabe nur ein Bild ist, d.h. nur ein Element der Objekte auf dem Diagramm.

Es stimmt, dass im letzten Jahr die Entwicklung der UI-Bibliothek aus Zeitmangel praktisch zum Stillstand gekommen ist.

Das ist sehr interessant. Haben Sie auch Ihre eigenen Eingabefelder implementiert?

 
Igor Volodin:

Um nicht unbegründet zu sein, gebe ich ein Beispiel für eine Schnittstelle, die auf der Basis von UI auf einem Bitmap-Element gebaut wurde

Sieht cool aus. Danke für das Beispiel. )

Es gab ein Thema, bei dem Ihre Empfehlungen sehr nützlich wären: Ein Crowdsource-Projekt auf Canvas machen

 
Anatoli Kazharski:

Vielleicht über dynamic_cast? Als ich mit der Entwicklung der Bibliothek begann, war dynamic_cast noch nicht verfügbar.

CFoo *foo = dynamic_cast<CFoo *>(&bar); // kein kritischer Ausführungsfehler wird auftreten


Oh, das habe ich nicht gesehen. Oh, ich danke Ihnen. Es hat sich herausgestellt, dass sie es im August hinzugefügt haben. Wenn es NULL zurückgibt und kein kritischer Fehler auftritt, ist es schon sehr gut. Wir können arbeiten )

Anatoli Kazharski:

Haben Sie auch Ihre eigenen Eingabefelder implementiert?

Bei Eingabefeldern wird das so gemacht:

beim Ereignis Fokus auf das Objekt des editierbaren Feldes wird ein grafisches Objekt des editierbaren Feldes der gewünschten Konfiguration mit dem aktuellen Wert in die UI eingefügt, mit dem man arbeiten kann, auch unter Verwendung des Eingabepuffers (es gibt keinen Weg ohne ihn in der Schnittstelle),

beim Unschärfe-Ereignis wird der Wert des Feldes gespeichert (und das Systemgraphenobjekt - Bearbeiten wird gelöscht). Und der Wert wird auf dem bmp mit Text angezeigt.

 

Igor Volodin:

...

Bei Eingabefeldern geschieht dies auf folgende Weise:

Beim Fokus-Ereignis auf dem Objekt des bearbeitbaren Feldes wird ein grafisches Objekt des bearbeitbaren Feldes der gewünschten Konfiguration mit dem aktuellen Wert in die Benutzeroberfläche eingefügt, mit dem Sie unter anderem mit dem Eingabepuffer arbeiten können (es gibt keine Möglichkeit, ohne ihn in der Schnittstelle zu arbeiten),

beim Unschärfe-Ereignis wird der Wert des Feldes gespeichert (und das Systemgraphenobjekt - Bearbeiten wird gelöscht). Und der Wert wird auf dem bmp als Text angezeigt.

Aha, ich habe es verstanden. Vielen Dank für die Klarstellung.

Ich denke, dass dies die beste Option ist, aber ich möchte versuchen, alles so zu realisieren, dass alles auf ein Objekt gezeichnet wird. Das würde es erlauben, volle Unabhängigkeit und Erfahrung zu bekommen, wenn es egal ist, in welcher Umgebung man eine GUI erstellt. Sagen wir mal, es gibt nur eine Leinwand und sonst nichts. )

 
Anatoli Kazharski:

Sieht cool aus. Danke für das Beispiel. )

Es gab hier ein Thema, bei dem Ihre Empfehlungen nützlich sein könnten: Ein Crowdsourced Canvas-Projekt durchführen

Vielen Dank! Wenn ich mir ansehe, wie viel Arbeit du in die Schnittstelle gesteckt hast, kann ich dir nur ein großes Lob aussprechen. Ich wäre nicht in der Lage gewesen, das zu tun. Erstens Werbung, zweitens Konsistenz.

Crowdsourced? Riskant. Natürlich kann man, wenn man ein stabiles Einkommen und Freizeit hat, zum Nutzen der Gesellschaft arbeiten. Aber die MMS-Gesellschaft wird sie für kommerzielle Produkte verwenden, nicht für kostenlose. Und die GPL-Lizenz allein wird das nicht verbieten.

Kurz gesagt, ich sehe keinen Gewinn für mich.

 
Anatoli Kazharski:

Aber irgendwann möchte ich versuchen, alles so zu realisieren, dass alles auf ein Objekt gezeichnet wird. Das würde es ermöglichen, volle Unabhängigkeit zu erlangen und die Erfahrung zu machen, dass es keine Rolle spielt, in welcher Umgebung man eine grafische Schnittstelle erstellt. Sagen wir mal, es gibt nur eine Leinwand und sonst nichts. )

Fragen Sie Renate nach Funktionen, die mit dem Systempuffer arbeiten, und Sie können alles zeichnen.