Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
11-1110826662
dimaxx
2005-03-14 21:57
2005.11.13
Несколько вопросов по KOL


2-1129890460
Шурик Ш
2005-10-21 14:27
2005.11.13
Вопрос по TXMLDocument


3-1128317628
RUYurik
2005-10-03 09:33
2005.11.13
IBReplicator


2-1129815297
Vladimir88
2005-10-20 17:34
2005.11.13
ControlAtPos


4-1126693655
Still Swamp
2005-09-14 14:27
2005.11.13
Надо в CallBack API функции передать метод TObject





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский