Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Jedes Element eines Dialogs (Formular, Steuerelement (Schaltfläche, Liste, Bild)) hat einige Eigenschaften. In der prozeduralen Programmierung ist der Begriff "Eigenschaft" oder "Feld" nicht definiert. In der prozeduralen Programmierung haben wir Funktionen und Variablen (global oder lokal). Die Variablen sind jedoch allgemeiner Art, so dass sie nicht zur Beschreibung der Eigenschaften jedes einzelnen Steuerelements verwendet werden können. Was ist dann die Lösung? Eine einfache: Strukturen!
Ja, eine Struktur kann eine Beschreibung der notwendigen Eigenschaften eines Steuerelements sowie ein Array von verschachtelten (bis zu unendlich vielen) Steuerelementen enthalten.
All diese Informationen werden in einer Reihe von Dialogfeldern gespeichert.
Wir können sie universeller gestalten: Die Struktur der Kontrollbeschreibung besteht aus zwei Arrays: einem Array für die Eigenschaften und einem Array für die Slave-Elemente. Ein Eigenschafts-Array ist ein Array von Strukturen eines Eigenschafts-Wert-Paares. Bei diesem Ansatz kann jedes neue Steuerelement eine beliebige Menge von Eigenschaften haben. Dies ist jedoch für die Verarbeitung nicht günstig. Es wäre logischer, die spezifischen Eigenschaften des Steuerelements in der Struktur anzugeben: Abmessungen, Position, Farbe, Rahmen usw. - alles, was ein Steuerelement braucht.
Die Struktur enthält auch ein Array von Pixeln des Steuerelements.
Wenn ein Mausereignis empfangen wird, werden alle Arrays in einer Schleife durchlaufen, um zu prüfen, ob der Cursor ein bestimmtes Steuerelement berührt. Die Prüfung wird von der letzten bis zur ersten Kontrolle durchgeführt.
Sobald festgestellt wird, welches Steuerelement den Cursor hat, wird das gegebene Array-Element an die Repaint-Funktion gesendet, und dann wird das Ressourcen-Array aktualisiert und das Bild auf dem Diagramm wird aktualisiert.
Ich weiß nicht, was er gepostet hat und was er in Sachen GUI getan hat, aber in meinen Threads hat er keine technischen Vorschläge, keine Lösungen und keine Diskussionen zu diesem Thema gemacht. Nur leeres Getrolle, das auf Lösungen von Dritten hinweist und dazu auffordert, das Rad nicht neu zu erfinden.
Zurück zum eigentlichen Thema.
Soweit ich mit der Standardbibliothek vertraut bin (eigentlich sehr wenig), bestehen Elemente und Fenster aus MT-Objekten. Das heißt, in unserem Kontext werden sie nicht auf die Leinwand gezeichnet. Natürlich werden sie gezeichnet, aber nicht auf unserer Leinwand, was uns daran hindert, Pixelfarben zu steuern, Oberflächenverläufe zu erstellen und vieles mehr.
Theoretisch könnten wir die Struktur der Bibliothek kopieren und ein Analogon auf dem Kanvas erstellen. Theoretisch...
Das Problem ist, dass CCanvas selbst nicht geeignet ist, um eine GUI darauf zu erstellen. Und warum? Denn das Kanvas-System wird hauptsächlich für grafische Primitive verwendet. Diese Klasse bietet also im Grunde nichts anderes als Primitive. Der GUI-Archetyp muss von Ihnen selbst erstellt werden. Und in diesem Fall ist die Klasse nicht notwendig. Es ist bequemer, sich mit eigenen Lösungen zu begnügen. Schließlich können Sie eine rechteckige Markierung auch ohne die Klasse zeichnen. Genauso wie Sie eine Leinwand erstellen oder laden können. Es ist ganz einfach. Deshalb habe ich meine eigene Lösung bevorzugt.
Aber man kann nicht auf CCanvas verzichten. Deshalb bestehe ich auch nicht darauf.
Das Problem mit CCanvas ist, dass seine grafische Benutzeroberfläche streng an das Diagrammfenster gebunden ist.
Das heißt, Sie können kein vollwertiges Fenster als Terminalschnittstellenmodul erstellen.
Und es wäre sehr cool, wenn Sie Ihre eigenen Schnittstellenmodule schreiben könnten.
natürlich etwas falsch :-)
Ich habe eine Schnittstelle zur Tcl-DLL (Tool Common Language) gepostet, die Tk-Grafiken enthält, die als GUI in Python/Ruby/etc verwendet werden
das Ziel war nicht, eine GUI zu bekommen, sondern ein nettes Nebenprodukt :-)
tcl.Eval("button .pressme -text {Hello Peter}; pack .pressme") ;
meiner Meinung nach praktisch und vor allem kurz :-)
Ich will niemanden aufhetzen - ich kenne tcl/tk, ich benutze es, ich teile meine Erfahrungen (siehe sourceforge atcl)
Ja, Max, genau das meine ich mit TCL und deinem Prototyp, über den wir damals diskutiert haben. Die Einschränkung dabei war, dass der Benutzer die entsprechende Bibliothek auf seinem Computer installiert haben musste. Es schien nicht schwierig zu sein, aber es ist trotzdem eine gewisse Einschränkung.
Lassen wir das in der Vergangenheit. Max, beteilige dich an der Diskussion. Roman, mach auch mit ))).
Aus den obigen Ausführungen geht hervor, dass ein Strukturelement ein spezielles Dialogsteuerelement ist, das seine eigenen Eigenschaften hat und verschachtelte Steuerelemente enthalten kann. Die Menge der Eigenschaften eines solchen universellen Steuerelements ist nur durch die Phantasie des Entwicklers begrenzt.
Natürlich können wir die Struktur vermeiden und die Eigenschaften der Steuerelemente in einem mehrdimensionalen Array beschreiben, aber das ist anfangs nicht kosteneffizient, weil wir uns genau merken müssen, welcher Index des Steuerelements eine Eigenschaft speichert. Und das Array kann keine heterogenen Datentypen enthalten. Es zeigt sich, dass die Beschreibung des Steuerelements in der prozeduralen Programmierung nur durch die Strukturen möglich ist. Das heißt, das Strukturelement ist ein konkretes Steuerelement, d.h. das konkrete Objekt des Dialogs mit dessen Eigenschaften.
Das Problem mit CCanvas ist, dass seine grafische Benutzeroberfläche streng an das Diagrammfenster gebunden ist.
Das heißt, Sie können kein vollwertiges Fenster als Terminalschnittstellenmodul erstellen.
Und es wäre sehr cool, wenn Sie Ihre eigenen Schnittstellenmodule schreiben könnten.
Und dann gibt es noch den umgekehrten Weg - die Verknüpfung der Schnittstelle mit dem Diagramm. Zum Beispiel, um eine Schaltfläche, die streng auf die Zeit und den Preis verbunden ist zu machen.
Ein eigenes GUI kann im Handumdrehen geschrieben werden - mit allen Tabellen, Registerkarten, Menüs und allem Drum und Dran. In C# oder sogar BASIC. Und das Innere des Diagramms ist ein großes Problem für externe Anwendungen.
Jedes Element eines Dialogs (Formular, Steuerelement (Schaltfläche, Liste, Bild)) hat einige Eigenschaften. In der prozeduralen Programmierung ist der Begriff "Eigenschaft" oder "Feld" nicht definiert. In der prozeduralen Programmierung haben wir Funktionen und Variablen (global oder lokal). Die Variablen sind jedoch allgemeiner Art, so dass sie nicht zur Beschreibung der Eigenschaften jedes einzelnen Steuerelements verwendet werden können. Was ist dann die Lösung? Eine einfache: Strukturen!
Ja, eine Struktur kann eine Beschreibung der notwendigen Eigenschaften eines Steuerelements sowie ein Array von verschachtelten (bis zu unendlich vielen) Steuerelementen enthalten.
All diese Informationen werden in einer Reihe von Dialogfeldern gespeichert.
Wir können sie universeller gestalten: Die Struktur der Kontrollbeschreibung besteht aus zwei Arrays: einem Array für die Eigenschaften und einem Array für die Slave-Elemente. Ein Eigenschafts-Array ist ein Array von Strukturen eines Eigenschafts-Wert-Paares. Bei diesem Ansatz kann jedes neue Steuerelement eine beliebige Menge von Eigenschaften haben. Dies ist jedoch für die Verarbeitung nicht günstig. Es wäre logischer, die spezifischen Eigenschaften des Steuerelements in der Struktur anzugeben: Abmessungen, Position, Farbe, Rahmen usw. - alles, was ein Steuerelement braucht.
Die Struktur enthält auch ein Array von Pixeln des Steuerelements.
Wenn ein Mausereignis empfangen wird, werden alle Arrays in einer Schleife durchlaufen, um zu prüfen, ob der Cursor ein bestimmtes Steuerelement berührt. Die Prüfung wird von der letzten Kontrolle bis zur ersten durchgeführt.
Sobald festgestellt wird, welches Steuerelement den Cursor hat, wird das Element im Array an die Repaint-Funktion gesendet, die dann das Ressourcen-Array aktualisiert und das Bild im Diagramm aktualisiert.
1. Angenommen, Sie haben eine einfache Struktur mit grundlegenden Steuerelementen entworfen - ein Fenster, eine Schaltfläche, ein Kontrollkästchen. Jede besteht aus einer Reihe von Komponenten - Objekten. Kontrollkästchen - Basis, Text, Symbol. Schaltfläche - Basis, Text, Symbol usw. Jedes Objekt eines jeden Elements muss eine eigene Reihe von Eigenschaften haben. Man kann sie in einer Struktur oder Klasse schreiben, aber meiner Meinung nach ist das nicht sinnvoll. Und warum? - Denn wenn Sie sie in ein Fenster setzen, müssen Sie sie mit dem Cursor auf der Leinwand finden. Wenn Sie den Cursor bewegen, müssen sie scharf gestellt werden. Dazu müssen ihre aktuellen Koordinaten in einem Array stehen. Und es ist bequemer, wenn alle Eigenschaften (einschließlich der aktuellen Koordinaten) in einem Array enthalten sind. Auf diese Weise können Sie sofort auf jede Eigenschaft eines beliebigen Elements auf der Leinwand zugreifen, das den Fokus des Cursors bildet. Es ist auch einfacher, eine Schleife durch ein Array von Elementen zu ziehen.
Das heißt, es ist einfacher, EIN Array in einer Schleife zu durchlaufen, um das Element zu finden, auf das der Cursor gestoßen ist. Noch bequemer ist es, wenn dieses Feld global ist. Dann kann man in jeder Funktion die notwendigen Informationen daraus entnehmen und die Werte der notwendigen Eigenschaften, der notwendigen Elemente ändern.
Dies ist der kürzeste und effizienteste Zugang zu den Elementen und ihre schnellste Verarbeitung. Dies ist mein "Kern".
(2) Da ich jedoch die Launen der Fachleute kenne, die eine maximale Nachahmung der Standard-OOP anstreben, schlage ich diese Technologie nicht vor.
3. ein Array von Pixeln muss nirgendwo gespeichert werden. Sie wird im Moment der Notwendigkeit entsprechend den Parametern der Elemente im Array erstellt. Ein Beispiel: Sie müssen das Fenster neu zeichnen. Wir rufen die Funktion repaint auf. Die Funktion ruft das Array der Elemente auf, sieht alle seine Eigenschaften, deklariert das Array der Pixel, berechnet seine Größe, zeichnet seine Objekte nacheinander in der Schleife, ruft ResourceCreate() auf. Das war's.
Ein Element, das sich unter dem Cursor befindet, wird an dieselbe Funktion weitergeleitet, um neu gezeichnet zu werden. Es erhält eine Benachrichtigung (Repaint-Flag) und seine Nummer im Item-Array. Anschließend ruft die Funktion die benötigte Ressource über ResourceReadImage() auf, fügt sie in das Pixel-Array ein und findet dann innerhalb des Pixel-Arrays den Bereich des benötigten Elements und färbt alle seine Objekte neu. Das war's.
1. Angenommen, Sie haben eine einfache Struktur mit grundlegenden Steuerelementen entworfen - ein Fenster, eine Schaltfläche, ein Kontrollkästchen. Jede besteht aus einer Reihe von Bestandteilen - Objekten. Kontrollkästchen - Basis, Text, Symbol. Schaltfläche - Basis, Text, Symbol usw. Jedes Objekt eines jeden Elements muss eine eigene Reihe von Eigenschaften haben. Man kann sie in einer Struktur oder Klasse schreiben, aber meiner Meinung nach ist das nicht sinnvoll. Und warum? - Denn wenn Sie sie in ein Fenster setzen, müssen Sie sie mit dem Cursor auf der Leinwand finden. Wenn Sie den Cursor bewegen, müssen sie im Fokus sein, d.h. ihre aktuellen Koordinaten müssen in einem Array enthalten sein. Und es ist bequemer, wenn alle Eigenschaften (einschließlich der aktuellen Koordinaten) in einem Array enthalten sind. Auf diese Weise können Sie sofort auf jede Eigenschaft eines beliebigen Elements auf der Leinwand zugreifen, das den Fokus des Cursors bildet. Es ist auch einfacher, eine Schleife durch ein Array von Elementen zu ziehen.
Das heißt, es ist einfacher, EIN Array in einer Schleife zu durchlaufen, um das Element zu finden, auf das der Cursor gestoßen ist. Noch bequemer ist es, wenn dieses Feld global ist. Dann kann man in jeder Funktion die notwendigen Informationen daraus entnehmen und die Werte der notwendigen Eigenschaften, der notwendigen Elemente ändern.
Dies ist der kürzeste und effizienteste Zugang zu den Elementen und ihre schnellste Verarbeitung. Dies ist mein "Kern".
(2) Da ich jedoch die Launen der Fachleute kenne, die eine maximale Nachahmung der Standard-OOP anstreben, schlage ich diese Technologie nicht vor.
3. ein Array von Pixeln muss nirgendwo gespeichert werden. Sie wird im Moment der Notwendigkeit entsprechend den Parametern der Elemente im Array erstellt. Ein Beispiel: Sie müssen das Fenster neu zeichnen. Wir rufen die Funktion repaint auf. Die Funktion ruft das Array der Elemente auf, sieht alle seine Eigenschaften, deklariert das Array der Pixel, berechnet seine Größe, zeichnet seine Objekte nacheinander in der Schleife, ruft ResourceCreate() auf. Das war's.
Ein Element, das sich unter dem Cursor befindet, wird an dieselbe Funktion weitergeleitet, um neu gezeichnet zu werden. Es erhält eine Benachrichtigung (Repaint-Flag) und seine Nummer im Item-Array. Anschließend ruft die Funktion die benötigte Ressource über ResourceReadImage() auf, fügt sie in das Pixel-Array ein und findet dann innerhalb des Pixel-Arrays den Bereich des benötigten Elements und färbt alle seine Objekte neu. Das war's.
Eigentlich sollte dies unabhängig von der Bautechnologie funktionieren. Sie kann aber auch anders wahrgenommen werden. In Ihrem Fall übergeben Sie ein Array in der Schleife und bestimmen, welches Steuerelement zu diesem Zeitpunkt den Cursor hat. Wenn Sie also den Index definieren, sehen Sie sofort die Eigenschaften des gefundenen Objekts. Aber wie kann man verschiedene Arten von Daten in einem großen Array speichern?
Eigentlich sollte dies unabhängig von der Bautechnologie geschehen. Man kann sie nur auf unterschiedliche Weise wahrnehmen. In Ihrem Fall durchlaufen Sie das Array in einer Schleife und stellen fest, welches Steuerelement den Cursor im Moment hält. Wenn Sie also den Index definieren, sehen Sie sofort die Eigenschaften des gefundenen Objekts. Aber wie kann man verschiedene Arten von Daten in einem großen Array speichern?
Im Prinzip ist es möglich, die Typen zu verallgemeinern. Ich bin zu dem Schluss gekommen, dass nichts Schlimmes passieren wird, wenn die überwiegende Mehrheit der Objekteigenschaften vom Typ int ist. Alle anderen abgekürzten Typen (Double ist bei Eigenschaften grafischer Objekte praktisch nicht vorhanden) habe ich aus Gründen der Vereinfachung außer Acht gelassen. Die "Überschreitung" des Speichers ist so unbedeutend, dass es keinen Sinn hat, darüber nachzudenken. Natürlich können wir uns nicht auf ein solches Sakrileg einlassen, um der Professionalität willen))). Aber wir leben im 21. Jahrhundert, und ich lasse mich nicht von Lagerfeuern bedrohen.)
Ich habe die Namen der Objekte als Zahlen dargestellt und sie in die allgemeine Reihe der Eigenschaften von Objekten eingeordnet.
Die einzige Stelle, an der ich eine andere Art von Daten benötigte, waren Steuerparameter. Dort habe ich einen zweiten Kernel erstellt, der die Parametereigenschaften und die Werte selbst im String-Typ speichert, den ich leicht in irgendetwas umwandeln kann (oder besser gesagt, in das, was in den Parametereigenschaften vorgeschrieben ist).
TIPP: Mit "Parameter des Steuerelements" meinen Sie den PARAMETER, der vom Gerät verwaltet wird.1. Angenommen, Sie haben eine einfache Struktur mit grundlegenden Steuerelementen entworfen - ein Fenster, eine Schaltfläche, ein Kontrollkästchen. Jede besteht aus einer Reihe von Bestandteilen - Objekten. Kontrollkästchen - Basis, Text, Symbol. Schaltfläche - Basis, Text, Symbol usw. Jedes Objekt eines jeden Elements muss eine eigene Reihe von Eigenschaften haben. Man kann sie in einer Struktur oder Klasse schreiben, aber das ist meiner Meinung nach nicht sinnvoll. Warum? - Denn wenn Sie sie in ein Fenster setzen, müssen Sie sie mit dem Cursor auf der Leinwand finden. Wenn Sie den Cursor bewegen, müssen sie scharf gestellt werden. Dazu müssen ihre aktuellen Koordinaten in einem Array stehen. Und es ist bequemer, wenn alle Eigenschaften (einschließlich der aktuellen Koordinaten) in einem Array enthalten sind. Auf diese Weise können Sie sofort auf jede Eigenschaft eines beliebigen Elements auf der Leinwand zugreifen, das den Fokus des Cursors bildet. Es ist auch einfacher, eine Schleife durch ein Array von Elementen zu ziehen.
Das heißt, es ist einfacher, EIN Array in einer Schleife zu durchlaufen, um das Element zu finden, auf das der Cursor gestoßen ist. Noch bequemer ist es, wenn dieses Feld global ist. Dann kann man in jeder Funktion die notwendigen Informationen daraus entnehmen und die Werte der notwendigen Eigenschaften, der notwendigen Elemente ändern.
Dies ist der kürzeste und effizienteste Zugang zu den Elementen und ihre schnellste Verarbeitung. Dies ist mein "Kern".
(2) Da ich jedoch die Launen der Fachleute kenne, die eine maximale Nachahmung der Standard-OOP anstreben, schlage ich diese Technologie nicht vor.
3. ein Array von Pixeln muss nirgendwo gespeichert werden. Sie wird im Moment der Notwendigkeit entsprechend den Parametern der Elemente im Array erstellt. Ein Beispiel: Sie müssen das Fenster neu zeichnen. Wir rufen die Funktion repaint auf. Die Funktion ruft das Array der Elemente auf, sieht alle seine Eigenschaften, deklariert das Array der Pixel, berechnet seine Größe, zeichnet seine Objekte nacheinander in der Schleife, ruft ResourceCreate() auf. Das war's.
Ein Element, das sich unter dem Cursor befindet, wird zum erneuten Zeichnen an dieselbe Funktion weitergeleitet. Es erhält eine Benachrichtigung (Repaint-Flag) und seine Nummer im Item-Array. Als Nächstes ruft die Funktion die benötigte Ressource über ResourceReadImage() auf, fügt sie in das Pixel-Array ein und findet dann innerhalb des Pixel-Arrays den benötigten Elementbereich und malt alle seine Objekte neu. Das war's.
ugh diese ewige Negativität zu oop, direkt durch die Zeilen
Haben Sie sich jemals gefragt, wie es dazu kam? Der Punkt ist, dass viele Leute, die im prozeduralen Stil schreiben und keine Ahnung von OOP haben, mit dem Wunsch konfrontiert werden, Funktionen zu gruppieren, und dann entwickelt sich dieser Wunsch zu dem Wunsch, diese Funktionen in einem Speicherbereich zusammenzufassen und darauf zu verweisen, d.h. physisch auf den Bereich mit Funktionen zu verweisen, der in einer Variablen gespeichert ist. Dann wollen wir unsere ausgewählten Funktionen ändern, ohne Code zu duplizieren (wir erhalten Vererbung). So fragt eine Person, die zunächst nur mit dem prozeduralen Stil vertraut ist, einige Zeit später, warum es so viele Einschränkungen in einem mcl (Verweis auf Mehrfachvererbung) gibt.
Im Allgemeinen wird angenommen, dass es einfacher ist, OOP auf einmal zu lehren, denn wenn eine Person mit dem prozeduralen Stil vertraut wird, dann wird es sehr schwer sein, umzulernen (für die meisten Menschen), aber es gibt auch andere, da es ursprünglich nur den prozeduralen Stil gab... oben beschrieben.
ZS Es gibt eine Abwandlung von OOP im Allgemeinen, eine Art Vertrautheit mit OOP auf der Ebene des prozeduralen Codes, und eine wirklich umfassende Nutzung von OOP.
Eine Klasse ist ein Verweis auf einen Speicher (Tabelle) von Funktionen, die umgeschrieben und erweitert werden können, während das Hauptfeld + Verweis auf Variablen beibehalten wird. und ich habe vergessen, was noch.... (etwa 32 Bytes)
Mit der Suche ewigen Problem, ich habe vor kurzem verglichen eingebauten Sortierfunktion mit Red sortieren (eine der Vorlagen), Geschwindigkeitsverlust von 3-6 mal in bestimmten Bedingungen (built-in verloren =)
Für die GUI gibt es meines Erachtens Standardmethoden.
,
Igitt, diese ewige Negativität gegenüber dem OOP, auf ganzer Linie.
Haben Sie sich jemals gefragt, wie es dazu kam? Die Sache ist die, dass viele Leute, die im prozeduralen Stil schreiben und keine Ahnung von OOP haben, mit dem Wunsch konfrontiert werden, Funktionen zu gruppieren, dann wächst dieser Wunsch zu dem Wunsch, diese Funktionen in einem Speicherbereich zu kombinieren und darauf zu verweisen, d.h. physisch auf den Bereich mit Funktionen zu verweisen, der in einer Variablen gespeichert ist. Dann wollen wir unsere ausgewählten Funktionen ändern, ohne Code zu duplizieren (wir erhalten Vererbung). So fragt eine Person, die zunächst nur mit dem prozeduralen Stil vertraut ist, einige Zeit später, warum es in einem mql (Verweis auf Mehrfachvererbung) so viele Einschränkungen gibt.
Im Allgemeinen wird angenommen, dass es einfacher ist, OOP auf einmal zu lehren, denn wenn eine Person mit dem prozeduralen Stil vertraut wird, dann wird es sehr schwer sein, umzulernen (für die meisten Menschen), aber es gibt auch andere, da es ursprünglich nur den prozeduralen Stil gab... oben beschrieben.
ZS Es gibt eine Abwandlung von OOP im Allgemeinen, eine Art Vertrautheit mit OOP auf der Ebene des prozeduralen Codes, und eine wirklich umfassende Nutzung von OOP.
Eine Klasse ist ein Verweis auf einen Speicher (Tabelle) von Funktionen, die umgeschrieben und erweitert werden können, während das Hauptfeld + Verweis auf Variablen beibehalten wird. und ich habe vergessen, was noch.... (etwa 32 Bytes)
Mit der Suche ewigen Problem, ich habe vor kurzem verglichen eingebauten Sortierfunktion mit Red Sort (eine der Vorlagen), Geschwindigkeitsverlust von 3-6 mal in bestimmten Bedingungen (built-in verloren =)
Für die GUI gibt es meines Erachtens Standardmethoden.
,
Ich stehe dem Konzept der OOP nicht negativ gegenüber. Ich bin selbst ein Anhänger dieser Methode. Ich habe eine negative Einstellung zu Normen. Um genauer zu sein, ihnen gedankenlos zu folgen).
Abgesehen davon bin ich für OOP. Aber ich bin für ein vereinfachtes OOP.