Форум: "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