Mein Ansatz. Der Kern ist der Motor. - Seite 60

 
Igor Makanu:

...

Aber wenn Sie wissen, wie das Ereignismodell in Windows funktioniert, und Erfahrung mit Compilern und Formulardesignern haben, dann ist alles überall dasselbe

ZS: es ist das dritte Mal, dass ich Sharp sehe, aber ich habe gute Erfahrungen mit Delphi gemacht, ich sehe den Unterschied überhaupt nicht, alles funktioniert auf die gleiche Weise, was nicht funktioniert, wird beim ersten Mal gegoogelt

Ich weiß nicht mehr, wie das Windows-Ereignismodell funktioniert. Und ich habe seit langem Erfahrung mit Compilern und Designern.

Ich muss ein erstelltes Formular mit einer MT-Anwendung verbinden und ein Problem lösen. Sie sagten, es sei einfach.

 
Georgiy Merts:

Indem er sie nicht zeigt, sondern ihre Prinzipien ganz klar beschreibt. Das ist es, was sie beanstanden, das ist es, was sie sagen: "Der Weg ist falsch".

Außerdem ist es nicht für den Autor "falsch", sondern für diejenigen, die es ablehnen. Sie haben hühnerähnliche Gehirne und können sich nicht daran erinnern, wo und welche Objekte sie erschaffen haben, wo und wer sich auf sie bezieht, was jede Zelle in der Anordnung bedeutet, wo sie hinwechseln können und wo nicht... Es ist verständlich, dass die Gegner empört sind. Anstatt ihr Gedächtnis zu trainieren, so dass sie sich leicht ein paar tausend Objekte und Referenzen im Programm merken können, schneiden dumme Leute ihre eigenen Zugriffsrechte, definieren einige Unterscheidungen, einige Schnittstellen, einige polymorphe Funktionen... Sie foltern sich selbst, wie unter dem zaristischen Regime, eh...

Lassen Sie den Unsinn über die Coolness des Gedächtnisses beiseite. Manchmal ist zu beobachten, dass der Thread dieses Forumsdialogs nicht bis in die Tiefe von zwei Seiten verfolgt wird. Außerdem gibt es zu viele Verleugnungen, als dass das Gedächtnis so wunderbar funktionieren könnte, wie man uns weismachen will.

 
Dmitry Fedoseev:

Helfen Sie mir, ein Problem zu lösen.

  1. Wir müssen das Ereignis des Drückens von Schaltflächen und Kontrollkästchen an MT5 senden.
  2. Wir müssen den Zustand eines Kontrollkästchens oder einer Schaltfläche in einem Formular programmatisch ändern.
Wie kann man das tun?
 

Das Windows-Formular ist da. Er springt an und funktioniert. Schaltflächen und Kontrollkästchen sind anklickbar.

Jetzt brauchen Sie eine DLL für die Verbindung mit MT5. Wer weiß, wie man das macht?

 
Реter Konow:

Helfen Sie mir, ein Problem zu lösen.

  1. Wir müssen das Ereignis des Drückens von Schaltflächen und Kontrollkästchen an MT5 senden.
  2. Wir müssen den Zustand eines Kontrollkästchens oder einer Schaltfläche in einem Formular programmatisch ändern.
Wie kann man das tun?

2. Gestern hat Igor ein Beispiel gezeigt. Es zeigt, wie Sie im Expert Advisor die Methode einer Klasse aufrufen können, die in der importierten DLL enthalten ist. Das heißt, Sie müssen eine Funktion (Methode) in c# schreiben, die den Zustand der Checkbox ändert. Wie kann man die Eigenschaft des Kontrollkästchens ändern, ich erinnere mich nicht an den Namen der Methode, es ist einfach, durch die Dropdown-Liste zu navigieren, Sie müssen den Namen des Kontrollkästchens eingeben, drücken Sie einen Punkt...

1. Ich weiß es nicht. Wahrscheinlich nicht. Sie müssen eine DLL-Funktion vom Timer aus aufrufen und den Zustand der Kontrollkästchen überprüfen. Und was Ereignisse wie das Drücken von Tasten betrifft, könnten wir wahrscheinlich ein Array erstellen und Ereignisse darin speichern. Aber das ist nicht schwer, wenn man bedenkt, dass die Arbeit mit Steuerelementen einen visuellen Vorteil hat.

 
Реter Konow:

Installierte C#. Ein Projekt geöffnet. Ich habe ein Formular erstellt und ihm zwei Schaltflächen und drei Kontrollkästchen hinzugefügt.

Hier ist der Code im Editor:

Frage: Warum gibt es eine Funktion für eine Schaltfläche und wo sind die Funktionen für die zweite Schaltfläche und die Kontrollkästchen?

Ich habe diesen Code gefunden:

Wie kann ich es als Schnittstelle zum MT5 verwenden?

Sie müssen zeigen, dass die zweite Schaltfläche benötigt wird - machen Sie einen Doppelklick darauf, dann öffnet sich der Code und die Funktion wird hinzugefügt. Das Projekt wird mit einem Fehler kompiliert, wenn die Schaltfläche dann aus dem Formular entfernt wird, sollte der Code manuell aus einer Datei gelöscht werden, aber nicht aus der, die Sie geschrieben haben.

 
Dmitry Fedoseev:

2. Gestern hat Igor ein Beispiel gezeigt. Das Beispiel zeigt, wie ein Expert Advisor eine Methode einer Klasse in der importierten DLL aufrufen kann. Das heißt, Sie müssen eine Funktion (Methode) in c# schreiben, die den Zustand der Checkbox ändert. Wie kann man die Eigenschaft des Kontrollkästchens ändern, ich erinnere mich nicht an den Namen der Methode, es ist einfach, durch die Dropdown-Liste zu navigieren, Sie müssen den Namen des Kontrollkästchens eingeben, drücken Sie einen Punkt...

1. Ich weiß es nicht. Wahrscheinlich nicht. Sie müssen eine DLL-Funktion vom Timer aus aufrufen und den Zustand der Kontrollkästchen überwachen. Und was Ereignisse wie Tastendrucke angeht, schlage ich vor, ein Array zu erstellen und die Ereignisse darin zu stapeln. Aber es ist nicht schwer, wenn man den Vorteil der visuellen Handhabung der Kontrollen bedenkt.

Gut.

Das müssen wir also tun:

  1. Erstellen Sie eine DLL.
  2. Verbinden Sie es mit der Witwenanwendung mit Formular.
  3. Schreiben Sie Methoden, um die Ereignisse beim Drücken der Schaltflächen und Ankreuzen von Kästchen in der DLL zu übersetzen.
  4. Schreiben Sie Methoden, die den Zustand von Schaltflächen und Kontrollkästchen in der Witwenanwendung ändern.
  5. Gemeinsamen Speicher in der DLL erstellen. Damit beim Zugriff von MT5 das Flag für die Zustandsänderung von Buttons und Checkboxen gesetzt wird. Dann greift die Windows-Anwendung auf den gemeinsamen Speicher zu, liest Flags aus und verwendet sie, um den Zustand des einen oder anderen zu ändernden Formularelements zu ermitteln.
  6. Schreiben eines zyklischen Verweises auf die DLL vom Timer in MT5, um Flags von Funktionsaufrufen zu lesen oder Text in Felder einzugeben.

    Was ist, wenn es Hunderte von Elementen gibt?

    Wie kann man den gemeinsamen Speicher organisieren?

    Was ist, wenn es notwendig ist, nicht nur den gedrückten/freigegebenen Zustand von Elementen in einem Formular zu ändern, sondern auch ihre Farbe (z. B. bei Schaltflächen)?

    Was ist, wenn Sie den Text in den Eingabefeldern eines Formulars von MT5 aus programmatisch ändern müssen?


     
    Dmitry Fedoseev:

    Für Ereignisse wie das Drücken von Tasten ist es wahrscheinlich am besten, ein Array zu erstellen und die Ereignisse darin zu speichern. Aber es ist nicht schwer, wenn man den Vorteil der visuellen Arbeit mit Kontrollen bedenkt.

    Früher habe ich das auf einfachere Weise gemacht:

    Der Benutzer hat die Schaltfläche im Formular gedrückt - der Event-Handler OnClick() wurde angeklickt und Button1.Disable wurde erstellt;

    2. dann liegt es an MT5, wie der Austausch dort organisiert wird, ich mag es, wenn Tastenklicks in OnTick() abgefragt werden - Sie werden nichts tun, bis es keinen Tick gibt; Sie können einen neutralen Wert von ca. 300 ms im Timer einstellen - weder ein Benutzer wird einen Frizz bemerken, noch wird MT5 langsamer werden


    Aber der Punkt meines Beispiels ist, dass die Panel-Visualisierung in MT5 jetzt in 2 Klicks möglich ist, Button-Handler arbeiten in einer .dll, und ein Teil des Interface-Skripts kann auf ein Formular übertragen werden, die gleichen Tabellen, Daten-Handling... alles

    Und das Beste: Sie sparen Zeit beim Rendering, mit dem Form Designer ist alles in wenigen Stunden erledigt ;)


    Rehtag Konow:

    Erstellen Sie einen gemeinsamen Speicher in der DLL. Beim Zugriff von MT5 aus wird also das Flag für die Zustandsänderung der Schaltflächen und Kontrollkästchen gesetzt. Die Anwendung greift auf den gemeinsamen Speicher zu, liest Flags und weiß, dass der Zustand des einen oder anderen Formularelements geändert werden soll.

    Schreiben eines zyklischen Verweises auf die DLL vom Timer in MT5, um Flags von Funktionsaufrufen zu lesen oder Text in Felder einzugeben.

      Und wenn es Hunderte von Elementen gibt?

      Wie kann man den gemeinsamen Speicher organisieren?

      Du gehst wieder in die falsche Richtung, raus aus den zotteligen 2000ern! .... obwohl ich irgendwie denke, dass die 2000er nicht die Grenze für dich sind ))))

      keine Beleidigung, hoffe ich?

       
      Igor Makanu:

      Früher habe ich das auf einfachere Weise gemacht:

      1. der Benutzer drückte die Schaltfläche auf dem Formular - gab sofort den OnClick()-Handler ein und machte Button1.Disable dort;

      2. dann liegt es an MT5, wie der Austausch gestaltet wird; ich mag es, wenn Button-Klicks in OnTick() abgefragt werden - wie auch immer, bis ein Tick nicht erreicht wird, kann man einen neutralen Wert von ca. 300 ms im Timer einstellen - weder ein Benutzer wird ein Frizz bemerken, noch wird MT5 langsamer werden


      Aber der Punkt meines Beispiels ist, dass die Panel-Visualisierung in MT5 jetzt in 2 Klicks möglich ist, Button-Handler arbeiten in einer .dll, und ein Teil des Interface-Skripts kann auf ein Formular übertragen werden, die gleichen Tabellen, Daten-Handling... alles

      Das Beste daran ist die Zeitersparnis beim Rendering, mit dem Forms Designer ist alles in wenigen Stunden erledigt ;)


      Du gehst wieder in die falsche Richtung, raus aus den zotteligen 2000ern! .... obwohl ich denke, dass die 2000er nicht die Grenze für dich sind ))))

      Nichts für ungut, hoffe ich?

      Nichts für ungut, aber es ist schade, dass es nicht auf den Punkt ist.

      Sie nehmen das NÄCHSTE Beispiel und extrapolieren daraus, dass die Komplexität nicht zunehmen wird. Dies ist ein Irrtum.

      Selbst das einfachste Beispiel, das Sie angeführt haben, ist falsch. Denn zusätzlich zum erstellten Formular müssen Sie auch eine DLL erstellen. Und dann müssen Sie einen TOTAL-Speicher innerhalb der DLL erstellen.

      Wenn die Anzahl der Formularelemente wächst und die Funktionalität des Programms auf MT5 komplexer wird, wird diese Interaktion SEHR aufwändig und kompliziert.

      Ich habe all dies in der Praxis getestet.

       
      Реter Konow:

      GUT.

      Es ist also notwendig:

      1. Erstellen Sie eine DLL.
      2. Verbinden Sie die DLL mit einer Windows-Anwendung über ein Formular.
      3. Schreiben Sie Methoden, die Ereignisse beim Drücken von Schaltflächen und Kontrollkästchen in dll übersetzen.
      4. Schreiben Sie Methoden, um den Zustand von Schaltflächen und Kontrollkästchen in der Witwenanwendung zu ändern.
      5. Gemeinsamen Speicher in der DLL erstellen. Damit beim Zugriff von MT5 das Flag für die Zustandsänderung von Buttons und Checkboxen gesetzt wird. Dann greift die Windows-Anwendung auf den gemeinsamen Speicher zu, liest Flags aus und verwendet sie, um den Zustand des einen oder anderen zu ändernden Formularelements zu ermitteln.
      6. Schreiben eines zyklischen Verweises auf die DLL vom Timer in MT5, um Flags von Funktionsaufrufen zu lesen oder Text in Felder einzugeben.

        Was ist, wenn es Hunderte von Elementen gibt?

        Wie kann man den gemeinsamen Speicher organisieren?

        Was ist, wenn es notwendig ist, nicht nur den gedrückten/freigegebenen Zustand von Elementen in einem Formular zu ändern, sondern auch ihre Farbe (z. B. bei Schaltflächen)?

        Was ist, wenn wir den Text in Eingabefeldern eines Formulars programmatisch von МТ5 aus ändern müssen?


        Wenn die Ereignisse richtig gehandhabt werden, ist die Anzahl der Kontrollen kein Problem. In dll können wir ein Array oder zwei Arrays erstellen, eines für den Objektnamen und das zweite für den Ereignistyp. Schreiben Sie in der DLL eine Funktion mit zwei Parametern, ebenfalls Ereignisname und -typ. Rufen Sie diese Funktion von jedem gewünschten Ereignishandler aus auf, damit die Ereignisse in Arrays abgelegt werden. Eine andere Methode - zu verfolgen Ereignisse aus EA Timer, wie bequem oder wie es sich herausstellt - die gleichen Arrays durch Verweis oder was auch immer und auch eine Variable - mit der Anzahl der Ereignisse in das Array. Nach dem Aufruf dieser Methode werden die Arrays geleert.

        Oder vielleicht ist es einfacher, ein Array mit einem Array zu erstellen; es gibt ein Ereignisobjekt in c#, so dass ich sie in ein Array verwandeln kann. Vielleicht ist es auch möglich, irgendwie zu fiddeln und nicht eine Funktion von jedem Event-Handler selbst aufzurufen. Aber das spielt keine Rolle, denn im Vergleich zu den Möglichkeiten der Schnittstelle und der Leistungsfähigkeit von c# ist das eine Kleinigkeit.

        Grund der Beschwerde: