Diskussion zum Artikel "Graphisches Interface X: Textauswahl im mehrzeiligen Textfeld (build 13)"

 

Neuer Artikel Graphisches Interface X: Textauswahl im mehrzeiligen Textfeld (build 13) :

In diesem Artikel erreichen wir, Text mittels verschiedener Tasten auszuwählen, und markierten Text zu löschen, genau so, wie man das von einem Texteditor kennt. Zusätzlich wird der Code weiter optimiert, und es werden die Klassen für die zweite Stufe in Richtung der endgültigen Version der Bibliothek vorbereitet, die alle Elemente als Einzelbilder vor einem Hintergrund darstellt.

Die Methode CTextBox::DeleteSelectedText() wird nicht nur aufgerufen, wenn die Taste Backspace gedrückt wurde, sondern auch: (1) wenn ein neuer Buchstabe eingegeben wurde und (2) wenn die Taste Enter gedrückt wurde. In diesem Fall wird zuerst der Text gelöscht und dann die Aktion gemäß der gedrückten Taste ausgeführt.

So sieht es in der fertigen Anwendung aus:

 Fig. 7. Demonstration des Löschens einer Textauswahl.

Fig. 7. Demonstration des Löschens einer Textauswahl.


Autor: Anatoli Kazharski

 
Super! Wie sieht es mit dem Einfügen aus dem Puffer aus?
 
Igor Volodin:
Super! Wie ist der Status des Einfügens aus dem Puffer?


Ich habe die Entwickler bei servicedesk noch nicht mit einer solchen Anfrage kontaktiert.

Wahrscheinlich ist es notwendig, nicht nur aus dem Puffer einzufügen, sondern auch an den Puffer zu senden, so dass Sie Text zwischen Ihren Eingabefeldern übertragen können, wenn ein solcher Bedarf entsteht.

Höchstwahrscheinlich brauchen wir die Fähigkeit, Systemereignisse zu verarbeiten, die durch Drücken von Strg + X (Ausschneiden), Strg + C (Kopieren) und Strg + V (Einfügen) ausgelöst werden.

 
Werden Sie die neu gezeichneten Elemente im nächsten Artikel zeigen? Das wäre sehr neugierig:)

Wahrscheinlich werden Sie sie auf der Basis der CCanvas-Klasse implementieren?
 
Реter Konow:
Das wird neugierig machen:)
Lassen Sie mich erklären, warum ich neugierig darauf bin.

Aus meiner eigenen Entwicklungserfahrung weiß ich, dass es viel einfacher und schneller ist, neue "Spielereien" zu erfinden und zu implementieren, als die Grundlagen der eigenen Technologie zu reparieren und neu zu gestalten.

Für jeden Übergang zu einer qualitativ neuen Ebene ist jedoch zwangsläufig eine Umgestaltung der grundlegenden Mechanismen erforderlich. Dies hat schwerwiegende Folgen für das gesamte System. Die große Umgestaltung ist die gefährlichste Phase der Entwicklung. Alles bricht fast in sich zusammen und wird dann wieder neu aufgebaut. Das kann sich nicht jeder trauen.

Bisher haben Sie sich nur vorwärts bewegt, d.h. den einfachen Teil der Entwicklung realisiert - neue Dinge auf der alten Basis zu erfinden. Es gab keine ernsthaften Umgestaltungen in den Grundmechanismen. Aber jetzt, wo der Übergang zu gezeichneten Elementen dringlich geworden ist, kommt man um ein globales Redesign nicht herum. Eine gezeichnete Schnittstelle erfordert zumindest eine Objektkarte, und die haben Sie nicht. Aber das sind nur die Blumen. Die Technologie ist völlig anders, und man kommt nicht um sie herum.

Ich weiß nicht, ob Sie es wagen werden, diese globale Umgestaltung vorzunehmen, und wie es für Sie ausgehen wird. Deshalb bin ich neugierig.

Ich wünsche Ihnen viel Glück.
 
Реter Konow:
Werden Sie die neu gezeichneten Elemente im nächsten Artikel zeigen? Das wäre sehr neugierig:)

Wahrscheinlich wirst du sie auf der Basis der CCanvas-Klasse implementieren?

1. Ja. Alle Elemente werden letztendlich gezeichnete Elemente sein. Als Teil der zweiten Entwicklungsstufe: 1 Element=1 Objekt (Leinwand zum Zeichnen).

2. Ja. Genau wie alle Elemente, die bereits gezeichnet werden, verwendet diese CCanvas-Klasse. Sie hat bereits fertige Methoden zum Zeichnen einfacher grafischer Formen. Es ist eine gute Klasse, die man, wenn es sie nicht gäbe, selbst implementieren müsste. In den Elementen der Bibliothek, die bereits gezeichnet sind, werden Methoden zum pixelweisen Zeichnen und Linien, Textausgabe, sowie Formen wie Rechteck, Rechteck mit Füllung verwendet.

 
Реter Konow:
...

Ich weiß nicht, ob Sie sich für diese globale Umverteilung entscheiden werden und wie sie für Sie ablaufen wird. Deshalb bin ich ja neugierig.

Der OOP-Ansatz ist viel einfacher als Sie beschrieben haben. Die Änderungen an dem bereits beschriebenen Bibliotheksschema sind minimal. Am Ende wird alles noch bequemer und viel besser sein als jetzt.
 
Anatoli Kazharski:
Der OOP-Ansatz ist viel einfacher als von Ihnen beschrieben. Die bereits beschriebenen Änderungen am Bibliotheksschema sind minimal. Am Ende wird alles noch bequemer und viel besser sein als jetzt.

Genau dieses Rezept der Systementwicklung ohne seine interne Wiedergeburt ist mir völlig unbekannt. Es ist wie ein Gral - ich würde gerne glauben, dass es einen gibt, aber es ist unwahrscheinlich....


Natürlich ist es nicht sehr schwierig, ein Element zu zeichnen. Fast alles kann aus Rechtecken gezeichnet werden (außer Farbverläufen), aber es muss ein anderes Ereignismodell erstellt werden. Die Funktion OnChartEvent() wird nicht mehr die Fixierung von Klick-Ereignissen auf das gezeichnete Elementmuster bieten. Auch Zorder zur Priorisierung wird nicht mehr helfen. Vor langer Zeit habe ich Ihnen von der Erstellung einer Objektkarte erzählt und ihre Vorteile aufgezählt, aber dann haben Sie diese Lösung abgelehnt, und jetzt kommen Sie nicht mehr ohne sie aus.


Es besteht kein Zweifel daran, dass gezeichnete Elemente mehr Eigenschaften haben und die Interaktion mit ihnen viel komplexer ist. Bei dieser Technologie sollte das System ganzheitlicher und die Mechanismen universeller sein. So sollte es beispielsweise einen gemeinsamen Speicher für alle Schnittstellenelemente geben, der die Werte aller ihrer Eigenschaften enthält. Dies ist eine effizientere Lösung als die Erstellung vieler separater Arrays und Variablen in verschiedenen Strukturen und Klassen. Alle OOP-Konventionen (Referenzobjekte, um auf Variablen anderer Klassen zuzugreifen, von denen man z. B. den Wert einer Eigenschaft eines bestimmten Objekts abrufen muss) verlangsamen und verkomplizieren die Arbeit nur, anstatt sie zu vereinfachen. OOP hat noch einen weiteren Nachteil, weshalb ich es nicht bedauere, dass ich nicht den Vorteil habe, die Klassen anderer Leute zu verwenden, wie Sie es tun. Ein Entwickler, der in seiner Entwicklung Blöcke verwendet, die von anderen Leuten erstellt wurden, kennt seine Entwicklung schlechter als derjenige, der alles selbst erstellt hat, und außerdem ist er in der Möglichkeit der Verbesserung seiner Entwicklung eingeschränkter, nicht nur, weil er sie schlechter kennt, sondern auch, weil er die Blöcke anderer Leute nicht umgestalten wird, da dies nicht durch den "professionellen Stil" der Entwicklung vorgesehen ist.


All das ist nur meine Meinung und ich habe sie abgeschlossen.


Ich werde mit Interesse die weitere Entwicklung der Bibliothek verfolgen.

 
Реter Konow:

Natürlich ist das Zeichnen eines Elements nicht sehr schwierig. Fast alles kann aus Rechtecken gezeichnet werden (außer Farbverläufen), aber es muss ein anderes Ereignismodell erstellt werden. Die Funktion OnChartEvent() bietet keine Fixierung von Klickereignissen auf das gezeichnete Elementdetail mehr. Auch Zorder zur Priorisierung wird nicht mehr helfen. Vor langer Zeit habe ich Ihnen von der Erstellung einer Objektkarte erzählt und ihre Vorteile aufgezählt, aber dann haben Sie diese Lösung abgelehnt, und jetzt kommen Sie ohne sie nicht weiter.

Sie liegen falsch, wie immer. Hier sind Beispiele, bei denen ich auch im aktuellen Modell nicht die von Ihnen beschriebenen Probleme habe (siehe GIF-Animationen unten). Der Tisch ist gezeichnet und die Interaktion mit ihm ist eines der kompliziertesten aller existierenden Elemente, um nicht zu sagen das komplizierteste. Außerdem ist dies noch nicht die endgültige Version. Vielleicht gibt es schon im nächsten Artikel einen endgültigen Code für diese Tabelle.


//---

Bitte zeigen Sie mir, wie Sie das Gleiche implementiert haben.

//---

Retag Konow:

... Es besteht kein Zweifel, dass gezeichnete Elemente mehr Eigenschaften haben und die Interaktion mit ihnen viel komplexer ist. Bei dieser Technologie sollte das System ganzheitlicher und die Mechanismen universeller sein. Zum Beispiel sollte es einen gemeinsamen Speicher für alle Oberflächenelemente geben, der die Werte aller ihrer Eigenschaften enthält. Dies ist effizienter, als viele separate Arrays und Variablen in verschiedenen Strukturen und Klassen zu erstellen.

Ich finde es viel einfacher, mit gezeichneten Elementen zu interagieren. Nach und nach wird alles so universell wie möglich werden. Eigentlich sollte dieser Prozess von Artikel zu Artikel in dieser Serie spürbar sein, wenn man natürlich aufmerksam liest und nicht nur Bilder anschaut. Man kann einen gemeinsamen Speicher einrichten, oder man kann einfach einen einfachen Zugriff von einer Klasse auf die Eigenschaften der einzelnen Elemente ermöglichen, wie ich es getan habe. Man kann nicht kategorisch sagen, dass es so sein soll und nicht andersherum. Niemand ist irgendjemandem etwas schuldig. In Ihren Entwicklungen können Sie tun, was Sie für richtig halten. Ich ziehe es vor, meine eigene Meinung über dieses oder jenes Konto zu haben. Wie mir meine persönliche Praxis und Lebenserfahrung zeigt, ist vieles von dem, was andere sagen, falsch. Gleichzeitig schließe ich mich selbst von dieser Zahl nicht aus. Aber ich habe keine Angst, mich zu irren, und wenn ich mich irre, suche ich einfach nach einem Weg, den Fehler zu korrigieren.

Retag Konow:

... Alle OOP-Konventionen (Referenzobjekte für den Zugriff auf Variablen anderer Klassen, von denen man z.B. den Wert einer Eigenschaft eines Objekts erhalten muss) verlangsamen und verkomplizieren die Arbeit nur, sie vereinfachen sie nicht.

In Ihrem Fall - ja, in meinem - nein. )

Retag Konow:

OOP hat noch einen weiteren Nachteil, bei dem ich nicht bedauere, dass ich nicht wie Sie den Vorteil habe, die Klassen anderer Leute zu verwenden. Ein Entwickler, der in seiner Entwicklung Blöcke verwendet, die von anderen Leuten erstellt wurden, kennt seine Entwicklung schlechter als derjenige, der alles selbst erstellt hat, und außerdem ist er in der Möglichkeit, seine Entwicklung zu verbessern, stärker eingeschränkt, nicht nur, weil er sie schlechter kennt, sondern auch, weil er die Blöcke anderer Leute nicht umgestalten wird, da dies nicht durch den "professionellen Stil" der Entwicklung vorgesehen ist.

Beginnen Sie in diesem Fall von vorne und auf eigene Faust. Schreiben Sie Ihr eigenes Betriebssystem, dann ein Handelsterminal mit der MQL-Sprache, und beginnen Sie dann mit der Entwicklung Ihrer eigenen Bibliothek zur Erstellung grafischer Oberflächen. Wenn Sie das alles geschafft haben, können Sie sich stolz die Ferse in die Brust klopfen. )))

//---

P.S. Und für mich war die Aufgabe:

  1. Programmieren üben.
  2. Für mich selbst eine Bibliothek zu schreiben, mit der ich grafische Schnittstellen in einer Qualität erstellen kann, die mich zufrieden stellt.
  3. Diese Entwicklung mit der MQL-Gemeinschaft zu teilen.
  4. Zumindest teilweise die Arbeitskosten für die Entwicklung zu kompensieren. Dank an MQ für die Unterstützung des Projekts.

Ich denke, es hat sich sehr gut entwickelt. Wenigstens bin ich nicht der einzige, dem das Ergebnis gefällt. :)

 
Anatoli Kazharski:

Anatoly, ich habe meine Meinung gesagt, und ich habe keine Lust auf einen weiteren erbitterten Streit mit Ihnen.


Meine Tabellen sind noch nicht fertig, aber das Beispiel, das Sie gezeigt haben, funktioniert genauso. Die Tabelle ist interaktiv, es gibt Bilder in den Zellen, Kontrollkästchen, und sogar die Spalten ändern ihre Breite. Natürlich funktioniert noch nicht alles perfekt.... Das Aussehen ist ein wenig anders. Das Hinzufügen von Spalten und Spalten ist noch nicht implementiert. Ich werde es hier nicht zeigen, sonst werde ich wieder für PR gesperrt.

Ich spreche nur über die Erfahrungen, die ich in harter Arbeit gesammelt habe, und die Tatsache, dass ich sie teile, sollte nicht als feindselig empfunden werden. Denn wer sonst kann hier mit Ihnen auf gleicher Augenhöhe über all diese Themen diskutieren?


Ich wünsche Ihnen viel Glück.

 
Реter Konow:

Anatoly, ich habe meine Meinung geäußert, und ich habe keine Lust, mich noch einmal auf einen erbitterten Streit mit Ihnen einzulassen.

Also gut, ich werde Sie nicht ablenken. )

Meine Tabellen sind nicht fertig, aber das Beispiel, das Sie gezeigt haben, funktioniert genauso. Die Tabelle ist interaktiv, es gibt Bilder in den Zellen, Kontrollkästchen, und sogar die Spalten ändern ihre Breite. Natürlich funktioniert noch nicht alles perfekt.... Das Aussehen ist ein wenig anders. Das Hinzufügen von Spalten und Spalten ist noch nicht implementiert. Ich werde es hier nicht zeigen, sonst werde ich wieder für PR gesperrt.

Sie haben eine großartige Möglichkeit, Artikel zu diesem Thema zu lesen und sogar die im Quellcode geposteten Lösungen zu verwenden und einfach an Ihr Schema anzupassen.

Sie können die Ergebnisse in Ihrem Blog veröffentlichen. Ich verfolge Ihre Veröffentlichungen. ;)