Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Вниз
Dll и немодальные формы правильно создать и убить Найти похожие ветки
← →
Rianon © (2005-10-18 20:38) [0]Может я повторяюсь в который раз но мне интерестно
, и не надо говорить что такое невозможно и надо использовать пакеты - посмотрите на Тотал Комм-р там это есть и работает
Кто может показать полный код, который покажет как правильно использовать немодальные формы в Dll и потом вызывать их в программе. На разных форумах иного всего написано но не до конца.
А проблема в чем:
Есть Dll в ней немодальная форма, в которую надо потом при вызове передать ряд параметров и потом по завершению тоже ряд других забрать.Dll связывается динамически
Так вот создал 2 функции CreateForm(...), FreeForm но если вызов происходит более или менее нормально то завершить корректно немодальную форму не удается никогда то вообще проэкт закроет то ошибку выдаст.. Делфи то на Free матюгом кричит то на FreeLibrary...
Помогите плз... но лучше всего реально работающим проектом Всю эту муть хочется использовать в некоторое подобие плагинов..
← →
Piter © (2005-10-18 21:05) [1]Чтобы DLL отобразила форму? А в чем собственно проблема?
← →
Rianon © (2005-10-18 21:20) [2]Проблема в том что форма немодальная и я могу ее создать но не знаю как корректно ёё прибить и тут же освободить библиотеку...
Образно:
-Клик на кнопке библиотека дин-ки прилинковалась
- вызвал процедуру с формой из Длл
- тут вот и проблема форма закрыться тожет когда угодно и только по ее закрытию надо делать ей Фри и Фри библиотеке пробовал по разному
даже сообщение на OnClose библиотечная форма главной отсылала
все равно прога кричит что я ее насилую
Помогите тут советуют пакетами и никак но Тотал Кмд же работает.
Нужен листинг как длл так и Майнформ плз...
← →
ё1 (2005-10-18 21:23) [3]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function CreateEdit(aParent: HWND): TEdit; external "CreateControlInDLL.dll";
procedure DeleteEdit(Edit: TEdit); external "CreateControlInDLL.dll";
function CreateFormInDLL: TForm; external "CreateControlInDLL.dll";
procedure DeleteFormInDll(Form: TForm); external "CreateControlInDLL.dll";
var
Form1: TForm1;
Ed: TEdit;
f: TForm;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(f) then f := CreateFormInDLL;
f.Show;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(f) then DeleteFormInDll(f);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(f) then
begin
DeleteFormInDll(f);
f := nil;
end;
end;
end.
library CreateControlInDLL;
uses
windows,
Classes,
Controls,
Forms,
Dialogs,
StdCtrls;
type
TDummy=class
private
class procedure BtnClick(Sender: TObject);
end;
var
onClick: TNotifyEvent;
function CreateEdit(aParent: HWND): TEdit;
begin
Result := TEdit.Create(nil);
Result.ParentWindow := aParent;
end;
procedure DeleteEdit(Edit: TEdit);
begin
Edit.Free;
end;
class procedure TDummy.BtnClick(Sender: TObject);
begin
ShowMessage("ok");
end;
function CreateFormInDLL: TForm;
var
L: TButton;
begin
Result := TForm.Create(nil);
Result.Position := poScreenCenter;
Result.Width := 200;
Result.Height := 180;
OnClick := TDummy.BtnClick;
L := TButton.Create(Result);
L.OnClick := OnClick;;
L.Parent := Result;
L.Width := 60;
L.Caption := "ClickMe";
L.Left := (Result.Width-L.Width) div 2;
L.Top := Result.Height-L.Height-30;
end;
procedure DeleteFormInDll(Form: TForm);
begin
Form.Free;
end;
exports
CreateEdit,
DeleteEdit,
CreateFormInDLL,
DeleteFormInDll;
end.
← →
Piter © (2005-10-18 21:30) [4]Rianon © (18.10.05 21:20) [2]
тут вот и проблема форма закрыться тожет когда угодно и только по ее закрытию надо делать ей Фри и Фри библиотеке пробовал
в ЧЕМ ПРОБЛЕМА?
Да, форма закрыться может когда угодно - как выберет пользователь. Но в чем проблема? в OnClose надо поставить параметр caFree - тогда форма при закрытии уничтожится.
Библиотека при этом не выгрузится, естественно. Саму себя библиотеке не стоит выгружать.
Если хочешьл выгрузить библиотеку после закрытии формы - то пусть тогда библиотека сообщает программе о том, что форма закрылась - и приложение выгрузит тогда библиотеку. В чем проблема?
← →
evvcom © (2005-10-19 09:50) [5]
> ё1 (18.10.05 21:23) [3]
Нельзя так делать. Нельзя передавать в dll классы. Даже если сейчас кажется, что это работает, завтра откажет, а ты будешь сидеть, репу чесать и не понимать почему.
← →
ё1 (2005-10-19 09:55) [6]
> Нельзя так делать. Нельзя передавать в dll классы. Даже
> если сейчас кажется, что это работает, завтра откажет, а
> ты будешь сидеть, репу чесать и не понимать почему.
Где ты передачу классов увидел? Покажи мв коде?
← →
ё1 (2005-10-19 09:58) [7]
> evvcom © (19.10.05 09:50) [5]
А-а, понял. Ты имеешь ввиду возврат TFOrm.
Дело в том, что это вся работа с памятью происходит в коде DLL, поэтому я репу чесать не буду и все это будет работать.
Все зависит от того, как писать - зная, что делаешь, или нет.
← →
REA (2005-10-19 10:25) [8]Должно работать. ShareMem еще частенько помогает.
← →
Rianon © (2005-10-19 19:30) [9]Да собственно ответ я нашел
Вкратце:
в модуле который который входит d Dll пишется 3 процедуры
2 отдельные в класс TForm вообще не входят:
типа
proc..re CreateForm(AHandle:THandle;Fhandle:THandle;Msg:Integer) ;
var PlugIn:TFormDll;
begin
Application.handle:=AHandle;
PlugIn:=TFormDll.Create(Nil);
MyHandle:=LongInt(PlugIn);
PlugIn.FHandle:=FHandle;
PlugIn.Msg:=Msg;
end;
и
procedure FreeForm(AForm:LongInt);
begin
if AForm<>0 then TFormDll(AForm).Free;
end;
в классе формы создать переменные
Fhandle: :THandle - указатель на гл.форму вызыв-й проги
MyHandle :THandle - собственный указатель формы
Msg:Integer - сообщение
и в OnClose TFormDll нашкрябать PostMessage(FHandle,Msg,MyHandle,Hinstance);
в гл.форме приложения написать обработчик сообщения
if Msg.WParam<>0 then
@CloseForm:=GetProcAddress(Msg.LParam,"FreeForm");
CloseForm(Msg.WParam);
FreeLibrary(Msg.LParam)
и в принцепе все
ну и в гл.форме проги создайте соотв. типы процедур
даже при NewDll:=LoadLibrary(.....) этот NewDll можно послать нафиг
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c