Как создать окно-форму в mt Dll с помощью Delphi? - страница 4

 
Maxim Kuznetsov:

я тут на форуме уже представлял : сделал и раздаю бесплатно, библиотеку ATcl, прицепил целый скриптовый движок с его инфраструктурой (и вебсокетами в том числе) http://nektomk.ru/atcl:start

ветка форума вот она : https://www.mql5.com/ru/forum/224745

Экспериментально даже Tk с его окнами и виджетами работает. Чтобы совсем захорошело, надо немного разобраться с оконными сообщениями виндовс, когда забирать/когда нет..
Сейчас текущие работы закончу, и продолжу. Уж больно "вкусная" штуковина получилась - море возможностей..Ради эксперимента даже генерацию и компиляцию модулей "на лету" из С++ пробовал, прямо из MT4

Максим, привет.

Ты провел огромную работы! Ты молодец, и я тебе об этом уже говорил.

Но в настоящий момент в твоем проекте для меня лично есть некоторые ограничения:

1. Для работы с библиотекой необходимо устанавливать на комп ATcl, что не совсем удобно, особенно потребителям

2. Библиотека работает пока только с 32 разрядными приложениями, то есть с МТ5 она стыковаться не будет, пока не будет.

3. Для создания форм нужно изучать сам ATcl, чтобы написать скрипт формы, который хранится в отдельном файле

4. Сами создаваемые формы являются все же свободными, а не прикрепленными к графикам.

Да, созданная и активно развивающаяся библиотека имеет мощный потенциал, но пока к практическим задачам ее сложно применить. Уверен что это пока, так как ты движешься семимильными шагами )))

 

Всем привет, подскажите что то у меня никак не получается форму делфи внедрить в MT4 build 1260. Получается она поверх всего терминала, при удалении советника виснет весь терминал. Хотелось бы чтобы форма было внутри окна графика.

Советник MQL4:

//+------------------------------------------------------------------+

//|                                                         test.mq4 |

//|                                                                  |

//|                                                                  |

//+------------------------------------------------------------------+

#property copyright ""

#property link      ""

#property version   "1.00"

#property strict

#import "form.dll"

int ShowIn(int hwnd);

#import

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//---

int hwnd=ChartGetInteger(0,CHART_WINDOW_HANDLE,0);

ShowIn(hwnd);

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//closeAForm();   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//---

   

  }

//+------------------------------------------------------------------+


Код DELPHI:

library form;


uses

  System.SysUtils,

  System.Classes,

  Windows,

  Vcl.Forms, Vcl.Dialogs,

  DLL in 'DLL.pas' {Form1};


{$R *.res}

function ShowIn(handle: HWND): integer; stdCall;

begin

  Application.Handle := Handle;

  Form1:=TForm1.CreateNew(Application);

  Form1.ShowModal;

  Form1.Free;

end;

exports ShowIn;

begin

IsMultiThread := true;

end.

 
Окно надо задавать с учётом родительского, найти его хэндл и использовать. И ещё надо использовать основной интерфейсный поток терминала, ну это чтобы конфликтов не было. При удалении советника не забывать отсылать сообщение о закрытии окна(SendMessage).
Примерно так, насколько я знаю.