Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
Алексей
1565
Алексей 2007.06.22 20:58 

В одной из экспортируемых функций хочу создать не модальное окно-форму с помощью Делфи

interface

type

TMTDllForm = class(TForm)
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
public
end;

var
MTDllForm: TMTDllForm;

procedure Initialize(); stdcall;

implementation

procedure Initialize();
begin
MTDllForm := TMTDllForm.Create(nil);
MTDllForm.Show;
end;

Окно на миг появляется и исчезает при вызове в коде советника на MQL4

void init() {

Initialize();

}

Из-за чего это может быть?

У меня две догадки

1. Я не правильно создаю окно и показываю его.

2. MT терминал отслеживает все окна созданные в его адресном пространстве - например в длл и закрывает их.

Скорее всего первый случай но второй тоже не могу отрицать.

Вообщем посоветуйте как создать окно в Delphi Dll которая загружается в советнике.

Alexey Lopatin
32998
Alexey Lopatin 2007.06.23 15:45  
У меня есть что то подобное на делфи. Только у меня окно привязывалось к конкретному графику. Вообщем в dll в экспртируемую функцию dll я передавал хэндл окна графика., а дальше эта функция создавала дочернее окно по отношению к графику.
Код на делфи такой:
function CreateMyPicture(chart_hwnd:HWND):HWND;stdcall;
var h_wnd:HWND;
rect:TRect;
capt:string;
begin
h_wnd:=0;
SetLength(capt,7);
if (chart_hwnd>0) then
begin
h_wnd:=GetParent(chart_hwnd);
if(h_wnd>0) then
GetWindowText(h_wnd,PAnsiChar(capt),7);
h_wnd:=GetParent(h_wnd);

h_wnd:=GetParent(h_wnd);

if h_wnd>0 then
begin
Form1:=TForm1.CreateParented(h_wnd);
GetWindowRect(chart_hwnd,rect);
Form1.SetBounds(rect.Left+6,rect.Top-16,Form1.Width, Form1. Height);
Form1.Show;
Form1.Caption:=capt;
h_wnd:=Form1.Handle;
end;
end;
Result:=h_wnd;
end;
Это часть кода. Если нужно вышлю полный проект.
В mql я сделал индикатор:
#property indicator_chart_window
#import "MyPictDll.dll"
int CreateMyPicture(int h_wnd);
void CloseMyPicture();
#import
int wnd=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   wnd=CreateMyPicture(WindowHandle(Symbol(),Period()));
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   if(wnd>0)
      CloseMyPicture();
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   
   return(0);
  }
//+------------------------------------------------------------------+

Все работает.
Да забыл, экспортируемые функции должны быть stdcall.
Сергей Мурзинов
159
Сергей Мурзинов 2007.06.23 17:42  
Luptator:
У меня есть что то подобное на делфи. Только у меня окно привязывалось к конкретному графику. Вообщем в dll в экспртируемую функцию dll я передавал хэндл окна графика., а дальше эта функция создавала дочернее окно по отношению к графику.
Код на делфи такой:

Это часть кода. Если нужно вышлю полный проект.



 Если не трудно, очень интересует эта тема.
E-mail:msp(гав)vitebsk.by

ICQ 428715765

P.S. Буду очень признателен
Alexey Lopatin
32998
Alexey Lopatin 2007.06.23 18:11  
Я имел в виду выложил на форум. Вот архив с проектом. Проект сделан в делфи7.
И индикатор, загружает dll и создает окно.
Окно должно показывать картинку лежащую по определенному пути.
В общем, я думаю, разберешся в коде.
Файлы:
Алексей
1565
Алексей 2007.06.23 18:20  

Спасибо за проекты. Щас попробую. А ты вызываешь функции из длл только из кода индикатора или так же вызывал советника или скрипта чтобы в длл создать форму?

Кстати ты пробовал что создание формы в длл работает на последнем билде 206 от 6 июня ?

Alexey Lopatin
32998
Alexey Lopatin 2007.06.23 19:14  
Вызывал только из индикатора.
На последнем билде работает.
Сергей Мурзинов
159
Сергей Мурзинов 2007.06.23 19:26  
Luptator:
Вызывал только из индикатора.
На последнем билде работает.


Из эксперта все равно вываливается
Алексей
1565
Алексей 2007.06.23 22:23  
Sergey_Murzinov:
Luptator:
Вызывал только из индикатора.
На последнем билде работает.


Из эксперта все равно вываливается


Да проверить щас не могу полноценно. Тики не идут.

А вообще можно попробовтаь создать окно в длл с помощью Win32 GUI API. Это как запасной вариант.

Сергей Мурзинов
159
Сергей Мурзинов 2007.06.23 23:00  
elritmo:
Sergey_Murzinov:

Luptator:
Вызывал только из индикатора.
На последнем билде работает.


Из эксперта все равно вываливается


Да проверить щас не могу полноценно. Тики не идут.


А вообще можно попробовтаь создать окно в длл с помощью Win32 GUI API. Это как запасной вариант.


2elritmo
Стукнись ко мне в Аську, плиз
Alexey Lopatin
32998
Alexey Lopatin 2007.06.24 18:39  
elritmo:
Sergey_Murzinov:
Luptator:
Вызывал только из индикатора.
На последнем билде работает.


Из эксперта все равно вываливается


Да проверить щас не могу полноценно. Тики не идут.

А вообще можно попробовтаь создать окно в длл с помощью Win32 GUI API. Это как запасной вариант.

Можно. Я сначала пробовал библиотеку писать в VisualС++. Там как раз средствами WinApi создавалось окно. Создаешь окно также как
и приложениях, написанных с использованием WinApi. Dll-ка работала, я проверял.
Но мне нужно было в этом окне отобразить jpeg. Можно было сделать средствами GDI+, воспользоваться библиотекой Intel JPEG Library.
Но я решил не заморачитваться и использовал delphi.
Алексей
1565
Алексей 2007.06.25 10:29  

Luptator , скажи а почему ты три раза вызываешь GetParent

Как я понимаю ты поднимаешься в иерархии окон на три выше ? Только вот зачем?

h_wnd:=GetParent(chart_hwnd);
if(h_wnd>0) then
GetWindowText(h_wnd,PAnsiChar(capt),7);
h_wnd:=GetParent(h_wnd);
h_wnd:=GetParent(h_wnd);

Sergey_Murzinov, спрашивай в этой теме если что интересует

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий