Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

dll : вторая форма и выгрузка.   Найти похожие ветки 

 
Александра   (2006-07-02 02:03) [0]

А есть ли возможность добавить вторую форму в dll? Я кидаю KolForm и ... ничего не происходит. Пришлось library переименовать в program - тогда всё получилось. Но всё равно работает криво - не формируется сообщение WM_PAINT (OnPaint).

И ещё - при динамической выгрузке надо ещё что-то уничтожать, а то генерируется ошибка. Если выгружать в _4.inc - без ошибок, что настораживает.

Всё сделано по рекомендациям демки. Но она грузится статически.


 
ECM ©   (2006-07-03 13:26) [1]

> Всё сделано по рекомендациям демки

Какой конкретно демки?


 
Александра   (2006-07-03 21:04) [2]


> Какой конкретно демки?

Ну которая на этом ресурсе лежит - demomodalvcl2koldll

С WM_PAINT следующая несостыковочка.
Если вызывать ShowModal, то всё прекрасно рисуется. Но эта функция не возвращает управления, а ждёт действия юзера. Но у меня нет ни единого контрола на форме - просто информация. А закрывать окно должен exe через определённое время.
Управление возвращает Show, но он без Run (Applet) бессмыслен - не обрабатываются сообщения, но Run (Applet), естественно, не возвращает управление.
Можно обойтись и без MCK - тогда с созданием следующих форм проблем не будет, если интерфейс не перегружен. Но вот почему возникает AV - не понимаю.
В данной ситуации выход вижу один - писать на голом WinApi, там и DialogBox есть.


 
ECM ©   (2006-07-04 10:19) [3]

Ну и что Вы хотели?
Демка называется demomodalvcl2koldll.

> ShowModal, то всё прекрасно рисуется


> Show, но он без Run (Applet) бессмыслен - не обрабатываются
> сообщения, но Run (Applet), естественно, не возвращает управление.

Естественно. Потому, что во первых в ShowModal(Ex) присутсвует цикл выборки-обработки сообщений (как и в Run), во вторых этот цикл у Вас выполняется в вызывающем потоке - и соответсвенно не будет возвращать управление до своего завершения. Для того что бы форма в DLL была не модальной (что Вам как я понял и нужно - в DLL нужен отдельный поток, в котором и будет работать цикл выборки-обработки сообщений для окна DLL)
Я не зря спросил, какая конкретно демка.

http://www.kolnmck.ru/files/demo/demo2nonmodalformsdll.zip
Пример работы с немодальными KOL формами, расположенными в DLL.


 
Александра   (2006-07-04 21:25) [4]

Или я полная дура или что-то не допонимаю. Не отлавливается в dll WM_Paint. Но уже прогресс - не появляется AV при выгрузке. Видимо, dll и MCK не совместимы. Вот код dll (exe слегка подправленный из примера):

procedure Show; //exports stdcall
begin
 Applet := NewApplet ("");
 Applet.Visible := false;
 W := NewForm( Applet, "" );

 W.HasCaption := False;

 W.HasBorder := False;
 W.Margin := 0;
 W.CanResize := False;

 W.OnPaint := TOnPaint( MakeMethod( nil, @Paint ) );

 W.CenterOnParent;
 W.Height := 253;
 W.Width := 340;
 W.Show;

 Run( Applet );
end;

procedure Paint (Sender: PControl; DC: HDC);
begin
 ....                   //  <-- Сюда не попадаем
end;


 
Александра   (2006-07-04 21:55) [5]

Ура!!!, я победила. После переоткрытия проекта проблема исчезла. Но есть другая. Внимательно смотрим рисунок.
http://img54.imageshack.us/img54/8872/dc8yo.png


 
ECM ©   (2006-07-04 23:27) [6]

> Видимо, dll и MCK не совместимы.

Полная чушь....

> слегка подправленный из примера

Пример опять тот же... Ответ [3] читаем? Нет?
Ну и ладно....


 
Хнекто   (2006-07-05 05:15) [7]


> procedure Paint (Sender: PControl; DC: HDC);

procedure Paint (Dummy: Pointer; Sender: PControl; DC: HDC);


 
Александра   (2006-07-05 10:29) [8]

А вот и нет, exe из примера [3]. Стоит только вызвать из dll форму _MCK_, вываливается AV.


 
ECM ©   (2006-07-05 11:30) [9]

Сам пример тоже даёт AV ?


 
Александра   (2006-07-05 21:17) [10]

А там в dll нет mck. Там только KOL.


 
ECM ©   (2006-07-05 21:43) [11]

Засылайте простейший проект (мыло в анкете) в котором этот эффект есть


 
mdw ©   (2006-07-05 22:23) [12]


> А там в dll нет mck. Там только KOL.


Да нет, разницы нет mck или чистый kol. У меня в DLL форм 15 лежит и все работает нормально.


 
Александра   (2006-07-06 00:53) [13]

Мдя, путаница полная получилась. Первая форма должна загрузится и ждать действий юзера. После того, как он нажмёт кнопку, форма закрывается и открывается вторая, которая должна вернуть управление. Бррр. Вообщем сижу и ловлю AV. Лучше пойду спать. Завтра всё на рельсы WinApi поставлю. Там всё прозрачно и просто.


 
ECM ©   (2006-07-06 10:47) [14]

> Там всё прозрачно и просто

В KOL (MCK) тоже всё прозрачно и просто... Просто надо не бояться разобраться... Удачи!


 
Александра   (2006-07-06 20:29) [15]


> mdw ©   (05.07.06 22:23) [12]
> > А там в dll нет mck. Там только KOL.Да нет, разницы нет
> mck или чистый kol. У меня в DLL форм 15 лежит и все работает
> нормально.

И как же Вы их туда добавляете и вызываете?

Ничего у меня не получается с этими потоками. Я в них не шарю.

function TForm2.LoadRunDll (Sender : PThread) : Integer;
type
TShow = procedure; stdcall;

const
MessageBoxTitle = "text";
Mess = "text";

var
Show :  TShow;

begin
// HandleDLL_Res := LoadLibrary ("bin/OJRes"); ..Она уже загружена

if HandleDLL_Res <= HINSTANCE_ERROR
 then
  begin
   MessageBox (0, Mess, MessageBoxTitle, MB_ICONERROR or MB_SYSTEMMODAL);
   exit;
  end;

@Show := GetProcAddress (HandleDll_Res, "Show");
if @Show <> nil then Show; // Убиваем форму через вызов другой процедуры. В dll обработчик Form.Close;
//if FreeLibrary (HandleDll_Res) then HandleDll_Res := 0; //Она ещё мне нужна
Thread.Terminate;
end;

procedure ShowConnect ;
begin
Thread := NewThread; // Thread объявлен глобально.
Thread.OnExecute := Form2.LoadRunDll;
Thread.Resume;
end;


Ну и после вызова этого кода при вызове (в основном потоке) первой модальной формы она появляется на миг и тут же исчезает. А потом AV.


 
mdw ©   (2006-07-07 11:28) [16]

примерно так, кусок из вызывающей программы:

function RunParamsExecute(Dummy, Sender : PThread): Integer;
var DLLInst: THandle;
   RunParams: TRunParams;
begin
   if IsRunParams then Exit;
   IsRunParams:= True;

   DLLInst:= LibraryManager.LoadLibrary("JMControls.dll");
   @RunParams:= GetProcAddress(DLLInst, "RunParams");
   RunParams(Applet);
   LibraryManager.FreeLibrary("JMControls.dll");
   IsRunParams:= False;
end;

procedure RunParams;
var Thread: PThread;
begin
   Thread:= NewThreadAutoFree(nil);
   Thread.OnExecute:= TOnThreadExecute(MakeMethod(Thread, @RunParamsExecute));
   Thread.Resume;
end;

кусок из DLL:

procedure RunParams(App: PControl);
begin
   Applet:= NewApplet("Параметры верстки");
   Applet.Icon:= App.Icon;
   Applet.Visible:= True;
   NewJMParamsMainForm(JMParamsMainForm, Applet);
   Applet.Add2AutoFree(JMParamsMainForm.Form);
   Run(Applet)
   Free_And_Nil(Applet);
end;


 
mdw ©   (2006-07-07 11:32) [17]

Но кстати немодальная форма получается и так:

вызов:
procedure RunTVEditor(AJournal: PJournal; var ANumber, AYear: Integer);
var DLLInst: THandle;
   RunTVEditor: TRunTVEditor;
begin
   DLLInst:= LibraryManager.LoadLibrary("JMControls.dll");
   @RunTVEditor := GetProcAddress(DLLInst, "RunTVEditor");
   RunTVEditor(Applet, AJournal);
   LibraryManager.FreeLibrary("JMControls.dll");
end;

DLL:

procedure RunTVEditor(App: PControl; AJournal: PJournal);
begin
   Applet:= NewApplet("Верстка прграммы ТВ");
   Applet.Icon:= LoadIcon(HInstance, "TVIcon32x32");
   Applet.Visible:= True;
   NewMainTVForm( MainTVForm, Applet);
   MainTVForm.Journal:= AJournal;
   MainTVForm.JournalNum2Ini(ifmRead);
   MainTVForm.Form.ShowModal; //форма не модальная
//    MainTVForm.Form.ShowModalEx; //а так модальная  

   MainTVForm.Form.Free;
   Free_And_Nil(Applet);
end;


 
Александра   (2006-07-07 21:51) [18]

Подкорректировала как в [16]. Симптомы те же. С выпадением AV. Написала на апях (через CreateDialog) - всё стабильно.
А модальная, не модальная - мне всё равно, лишь бы управление возвращала.



Страницы: 1 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
9-1145986128
guitarist
2006-04-25 21:28
2007.03.25
Оформление шахмат


15-1172479216
NailMan
2007-02-26 11:40
2007.03.25
WinXP 32-бит и 4Гб памяти


1-1170323963
Alex2006
2007-02-01 12:59
2007.03.25
Создание сложных меню


1-1170365613
Ольчик
2007-02-02 00:33
2007.03.25
Проблема с файлами DEL1.MB,DEL2.MB...


15-1171114436
Cyrax
2007-02-10 16:33
2007.03.25
Смысл параметров эллиптической дуги в vdx-формате Visio 2003