Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.032 c
15-1172430056
Nic
2007-02-25 22:00
2007.03.25
ЖК-монитор, WinXP, проблемы


2-1172685152
aha
2007-02-28 20:52
2007.03.25
Как можно изменить mainmenu - предположим есть два варианта


2-1172746478
Mashenka_84
2007-03-01 13:54
2007.03.25
создание файла


15-1172479522
xayam
2007-02-26 11:45
2007.03.25
Музыка из фильма Призрачный гонщик


2-1172919728
TIF
2007-03-03 14:02
2007.03.25
Регион и XP стиль: как их совместить вместе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский