|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#46
|
|||
|
|||
Цитата:
ну у меня пока из dll и запускается форма в отдельном потоке софт MetaTrader4 со своим языком MQL4, в нем можно сделать скрипт, прикрутить dll к коду. вот только работает он хитро немного, надо обязательно чтобы форма в отдельном потоке была |
#47
|
|||
|
|||
Цитата:
не боишся разориться со своими познаниями в дельфи ? |
#48
|
|||
|
|||
Цитата:
"автопродавалки" пишутся на mql4, dll им не нужны |
#49
|
|||
|
|||
а ктонибудь знает как правильно уничтожать форму откртую в dll в отдельном потоке?
то есть открываю ее так Код:
procedure Start1; // вызываю из основной программы begin T1:=TMyThread.Create(false); end; procedure TMyThread.Execute; begin FormShow; end; procedure TMyThread.FormShow; begin Form1:=TForm1.Create(nil); Form1.ShowModal; end; а закрывать вот так надо? Код:
procedure TMyThread.FreeForm; begin Form1.Free; //Form1.Close; end; и надо ли мне уничтожать поток при закрытии типа Код:
T1.Terminate; а то вроде все работает, но иногда сыпит ошибки, причем сам борланд |
#50
|
|||
|
|||
Может кто поможет разобраться, как правильно сделать
могу весь проект выложить если надо вобщем в длл в отдельном потоке создаю форму, сразу же открываю memory map file, и по нажатию кнопки на форме, в файл должны записаться две переменные, но валится ошибка Access violation в моей длл write of adress 00000000 то есть ошибка уже при попытке записи наверное я как-то не так пишу, а что не так не знаю, видимо дело в обьявлении классов, я там как-то все почти наугад сделал из основной программы вызывается процедура Start1 код не сильно сложный, но у меня пока мало опыта и не пойму как все правильно связать, чтобы работало без ошибок.. Код:
unit DLL; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; const MMFID = '{D9CFD3BD-3E91-4748-B9F9-7A1825847DF7}'; type TMyThread = class(TThread) private { Private declarations } protected procedure FormShow; procedure FreeForm; procedure Execute; override; end; PTestStructure = ^TTestStructure; TTestStructure = packed record A: Integer; B: double; end; TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; RadioGroup1: TRadioGroup; ComboBox1: TComboBox; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure RadioGroup1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } CallForm: THandle; function OpenSendMMF: Boolean; function AddText: Boolean; function CloseSend: Boolean; function OpenRecMMF: Boolean; function ReadText: Boolean; function CloseRec: Boolean; public { Public declarations } end; procedure FreeForm; procedure Start1; var Form1: TForm1; T1: TMyThread; y:Pchar; SendMMF, RecMMF: THandle; SendData, RecData: PChar; oper: integer; // переменная для записи 1 lot: double; // переменная для записи 2 count:integer; implementation {$R *.dfm} procedure Start1; begin T1:=TMyThread.Create(false); end; procedure FreeForm; begin Form1.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin oper:=1; count:=count+1; Form1.AddText; end; procedure TForm1.Button2Click(Sender: TObject); begin oper:=2; count:=count+1; Form1.AddText; end; procedure TForm1.Button3Click(Sender: TObject); begin oper:=3; count:=count+1; Form1.AddText; end; procedure TForm1.Button4Click(Sender: TObject); begin oper:=4; count:=count+1; Form1.AddText; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin SendMessage(CallForm, wm_User, 0, 0); Form1.Free; T1.Terminate; //TForm1.CloseRec; end; procedure TMyThread.Execute; begin FormShow; end; procedure TMyThread.FormShow; // выполнение в потоке begin Form1:=TForm1.Create(nil); Form1.ShowModal; Form1.OpenSendMMF; end; procedure TMyThread.FreeForm; begin Form1.Free; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin DecimalSeparator := '.'; lot:= StrToFloat(RadioGroup1.Items[RadioGroup1.ItemIndex]); end; // ComboBox.Items.Add(edit.text) // Создаем Memory Mapped File ... // ============================================================================= function TForm1.OpenSendMMF: Boolean; begin SendMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4096, PChar(MMFID)); Result := SendMMF <> 0; end; // Добавляем в файл текст ... // ============================================================================= function TForm1.AddText: Boolean; var F: TTestStructure; Z: PTestStructure; begin F.A := oper; F.B := count; Z := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0); Result := Z <> nil; Z^ := F; end; // Разрушаем Memory Mapped File ... // ============================================================================= function TForm1.CloseSend: Boolean; begin UnmapViewOfFile(SendData); SendData := nil; CloseHandle(SendMMF); Result := True; end; // Открываем созданный ранее Memory Mapped File ... // ============================================================================= function TForm1.OpenRecMMF: Boolean; begin RecMMF := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MMFID)); Result := RecMMF <> 0; end; // Читаем из него данные ... // ============================================================================= function TForm1.ReadText: Boolean; var F: TTestStructure; Z: PTestStructure; begin Z := MapViewOfFile(SendMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0); F := Z^; Result := Z <> nil; end; // Закрываем (не разрушаем) Memory Mapped File ... // ============================================================================= function TForm1.CloseRec: Boolean; begin UnmapViewOfFile(RecData); RecData := nil; CloseHandle(RecMMF); Result := True; end; end. Последний раз редактировалось harbor, 03.02.2013 в 16:41. |
#51
|
|||
|
|||
хм, поменял местами вызовыи заработало все.
сделал сначала открытие файла, так: Form1.OpenSendMMF; Form1.ShowModal; только не понял в чем прикол |
#52
|
||||
|
||||
ShowModal ждет пока форма не закроется, следовательно код после ShowModal продолжи выполнение, когда форма захлопнется.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |