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

Вниз

Програмное закрытие формы из Dll   Найти похожие ветки 

 
206196131 ©   (2008-03-29 20:05) [0]

есть приложение оно подгружает dll
в dll  2 формы, загружается сразу форма1

после разных всяких проверок либо открывается форма2 либо не открыватся.

   в родительском окне    
   Application.CreateForm(Tform1,form1);    

в form1

if (что с чемто = 1) then
   Application.CreateForm(Tform2,form2)
else
   form1.close;

form1.close вылетает по access  violation at address 12345678 in module my.dll

при этом если закрываеть
  form1 крестиком то никаких  проблем....


 
Сергей М. ©   (2008-03-29 20:17) [1]


>    в родительском окне    


Что за зверь ?


 
206196131 ©   (2008-03-29 20:22) [2]

обычное fsMDIForm все остальные окна fsMDIChild


 
Сергей М. ©   (2008-03-29 20:28) [3]

Т.е. ты пытаешься в dll-коде закрыть форму, код которой находится в хост-проекте и которая там же и создается, так ?


 
206196131 ©   (2008-03-29 20:34) [4]

типа того если парваильно поняли друг друга,
и родиделской формы я выхываю форму1  из dll  в свою очередь
форму1  вызывает форму2 и дожна закрыться
но закрытие не получается


 
trubin ©   (2008-03-29 20:37) [5]


> типа того если парваильно поняли друг друга,
> и родиделской формы я выхываю форму1  из dll  в свою очередь
>
> форму1  вызывает форму2 и дожна закрыться
> но закрытие не получается


Пытался сосчитать орфографические ошибки и не смог - переполнение стека :)))


 
Сергей М. ©   (2008-03-29 20:37) [6]

Приложение и dll используют ран-тайм пакеты ?


 
206196131 ©   (2008-03-29 20:42) [7]


> Приложение и dll используют ран-тайм пакеты ?


что имеете виду под ран-тайм пакетами

  никаких пакетов я неиспользую если правильно понял


 
Сергей М. ©   (2008-03-29 20:43) [8]


> что имеете виду под ран-тайм пакетами


В оциях сборки в свойствах проекта крыжик "Build with run-time packages" я имею ввиду


 
206196131 ©   (2008-03-29 20:44) [9]

trubin  ты бы по делу чемто помог когда стек освободишь ))


 
206196131 ©   (2008-03-29 20:45) [10]

сейчас посмотрю, специально я туда на лазил


 
Сергей М. ©   (2008-03-29 20:46) [11]


> 206196131 ©   (29.03.08 20:44) [9]


Формы в dll - блажь вообще.
Для озабоченных этим придуманы bpl.


 
206196131 ©   (2008-03-29 20:46) [12]

нет его там, как по умолчанию было так и осталось


 
Сергей М. ©   (2008-03-29 20:47) [13]


> специально я туда на лазил


Зачем же ты полез со своими формами в dll, если не в курсе крайне важных при этом вещей ?


 
206196131 ©   (2008-03-29 20:48) [14]

это отдельный разговор Формы в dll ))


 
Сергей М. ©   (2008-03-29 20:48) [15]


> нет его там


Плохо.


 
206196131 ©   (2008-03-29 20:51) [16]

полез из соображени  таких
 в случае каких либо изменений в модуле просто менять  dll  файл
при этом не трогать основной проект

(чуствую сейчас опять начнется война идиологии)


 
Сергей М. ©   (2008-03-29 20:51) [17]


> это отдельный разговор Формы в dll


Ты не оригинален.
До тебя в форуме уже туева туча кулибиных пыталась на полном серьезе доказать серьезность этого отдельного разговора)
И, смею заметить, все они получали одними и теми же граблями по своим кулибинским лбам)


 
Германн ©   (2008-03-29 20:55) [18]


> война идиологии

Забавная очепятка.


 
Сергей М. ©   (2008-03-29 20:55) [19]


> в случае каких либо изменений в модуле просто менять  dll
>  файл


На здоровье, я не против)

Но нужно четкое, а не поверхностное понимание работы внутренних механизмов Делфи.


 
206196131 ©   (2008-03-29 20:57) [20]

и не сомниваюсь ))
 но по сути дела есть какие нить предложения, или нет


 
206196131 ©   (2008-03-29 20:59) [21]

Германн вам бы на каком нить irc  канале сидеть трафик гонять  ))


 
Palladin ©   (2008-03-29 21:00) [22]

ага... bpl создавать, а не dll. и эффект тот же и все работает.


 
206196131 ©   (2008-03-29 21:05) [23]

мужики причем здесь bpl

есть конкретная проблема, программное закрытие формы загруженной из  dll
сама себя форма должна закрыть


и неуместны тут ни  blp ни соm


 
Сергей М. ©   (2008-03-29 21:08) [24]


> есть конкретная проблема


Эта "проблема" может зависеть от множества факторов !


> неуместны тут ни  blp ни соm


Вот com точно не уместен, а bpl оч даже уместен)


 
206196131 ©   (2008-03-29 21:11) [25]

странно то что по крестику форма нормально зарывается ни начто не материться


 
Сергей М. ©   (2008-03-29 21:14) [26]

Странно другое - неумение или нежелание пользоваться отладчиком.


 
206196131 ©   (2008-03-29 21:22) [27]

если бы все все умели, половино человечества сидело бы без работы))


 
Loginov Dmitry ©   (2008-03-29 21:49) [28]

> обычное fsMDIForm все остальные окна fsMDIChild


> Application.CreateForm(Tform2,form2)


Это дочернее окно так создается, или что?


> form1.close вылетает по access  violation at address 12345678
> in module my.dll
>
> при этом если закрываеть
>  form1 крестиком то никаких  проблем....


Вот и отлаживай! F7 и F8 рулят! Если не в состоянии, то укажи более ЧЕТКО, в чем проблема? И прислушайся к совету насчет пакетов. Это избавляет от колоссальной доли геморроя, поверь...


 
206196131 ©   (2008-03-29 22:06) [29]

Application.CreateForm(Tform2,form2)
на последнии момент было так, есть другие предложения


 
206196131 ©   (2008-03-29 22:13) [30]

var
form2:Tform2;
begin
form2:=  Tform2.Create(application);
form2.show;
form1.Close;//слетат тут
end;

так ничего не меняется


 
Loginov Dmitry ©   (2008-03-29 22:15) [31]

> Application.CreateForm(Tform2,form2)
> на последнии момент было так, есть другие предложения


Дочерние окна fsMDIChild обычно создают следующим образом:
Tform2.Create(Owner);
и никаких переменных типа form2 не используют. Можно конечно использовать, но только если будет создана всего одна форма Tform2.


 
Loginov Dmitry ©   (2008-03-29 22:19) [32]

> var
> form2:Tform2;
> begin
> form2:=  Tform2.Create(application);
> form2.show;
> form1.Close;//слетат тут
> end;
>
> так ничего не меняется


что такое TForm1? Где данный объект создается (в EXE или DLL)?
где создается TForm2?
Что у тебя должно происходить при вызове form1.Close?


 
206196131 ©   (2008-03-29 22:28) [33]

обе формы из  dll  

ничего не должно происходить, должна зарыться форма form1

после того как отыкрыта  form2


 
Palladin ©   (2008-03-29 22:37) [34]

вот незадача... application в dll и в хост приложении разный бааалин... сколько можно твердить сохдавай bpl, там application одинаковый. и да будет тебе известно что bpl никакого, ну ни малейшего абсолютно, отношения к com не имеет. эта та же самая dll. просто грузится специальными средствами, благодара которым например TForm из bpl тот же самый класс что и Tform в хлст приложении. и еще много вкусностей о которых довольно подробно описано в справке.


 
206196131 ©   (2008-03-29 22:38) [35]

руками form1 закрывается без проблем
а по form1.Close нет


 
Loginov Dmitry ©   (2008-03-29 22:38) [36]

1. приведи код инициализации dll-ки.
2. попробуй переименовать в инспекторе объектов форму Form1 во что-нибудь другое (например Form3)


 
Loginov Dmitry ©   (2008-03-29 22:40) [37]

> вот незадача... application в dll и в хост приложении разный
> бааалин... сколько можно твердить сохдавай bpl, там application
> одинаковый. и да будет тебе известно что bpl никакого, ну
> ни малейшего абсолютно, отношения к com не имеет. эта та
> же самая dll. просто грузится специальными средствами, благодара
> которым например TForm из bpl тот же самый класс что и Tform
> в хлст приложении. и еще много вкусностей о которых довольно
> подробно описано в справке.


зачем bpl создавать? Куда проще поставить заветную галочку в опциях обоих проектов!


 
206196131 ©   (2008-03-29 22:46) [38]

)) уже что то, здесь и сейчас это както решаемо ?

 или все переписывать


 
Loginov Dmitry ©   (2008-03-29 22:48) [39]

> )) уже что то, здесь и сейчас это както решаемо ?


Тебе решать!


 
206196131 ©   (2008-03-29 22:57) [40]

Palladin то что bpl и ком ничего общего не имеют это факт
но визуально, то я хоч у в итоге получить можно сделать на 4 способами  (com,bpl, dll, И все в одном) )) насколько я знаю...

На тему bpl убедили окончательно но всёже поскажите как
раз и навсегда как закрыть это злополучное окно )) в случае в  dll


 
Loginov Dmitry ©   (2008-03-29 23:00) [41]

> как
> раз и навсегда как закрыть это злополучное окно ))


очень просто - не открывай, и не придется его ни разу закрывать!


 
206196131 ©   (2008-03-29 23:03) [42]

так оно уже отрыто )) нужно закрыть


 
Loginov Dmitry ©   (2008-03-29 23:10) [43]

Ты реального кода ни граммы не привел! Не известно, что все-таки у тебя там не получается. Так что других советов пока дать невозможно!


 
206196131 ©   (2008-03-29 23:16) [44]

вот так вызываю форму из dll

FLiba := LoadLibrary(PChar(dll_file_name));
      @Init := GetProcAddress(FLiba, PChar("InitPlugin"));
      @Done := GetProcAddress(FLiba, PChar("DonePlugin"));
      @CreateMDI  := GetProcAddress(FLiba, PChar("CreateMDI"));
   
Init(integer(Application), integer(Screen));
Fplugin:= TForm(CreateMDI);
Fplugin.Show;


 
Loginov Dmitry ©   (2008-03-29 23:21) [45]

Приведи текст функции InitPlugin


 
206196131 ©   (2008-03-29 23:21) [46]

на форме 1 кнопка  
 по который пытаюсь закрыть окно, (2 окно как бы не при делах), тк ни одно из  dll  програмно не могу закрыть


 
206196131 ©   (2008-03-29 23:23) [47]

procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin
 DS := Screen;
 Screen := TScreen(Scr);
 DA := Application;
 Application := TApplication(App);
end;


 
Loginov Dmitry ©   (2008-03-29 23:31) [48]

ну хоть объект Application у тебя везде одинаковый. Это радует! :D


 
Loginov Dmitry ©   (2008-03-29 23:35) [49]

Еще раз напомню: переименуй форму Form1 в dll-ке.
Ибо если в exe-шнике уже есть Form1, а в dll-ке создается форма с тем же именем с помощью Application.CreateForm(Tform1,form1), и Application у них один, то это может привести к неприятным последствиям.


 
206196131 ©   (2008-03-29 23:38) [50]

перименовал, никаких пересечений имен небыло,  но результат тотже


 
206196131 ©   (2008-03-29 23:39) [51]

чем отличаются события  frm.Close; от нажатие крестика


 
206196131 ©   (2008-03-30 00:21) [52]

по итогу все оказалось в следующем в методе создания этого окна

вариант 1
   Tfrm.Create(Application)

окошко рисуется но

Tfrm.close  не работает

вариант 2
     Application.CreateForm(Tfrm,frm);
так все работает


 
Johnmen ©   (2008-03-30 00:52) [53]

Чудны дела твои, Господи (с)


 
Германн ©   (2008-03-30 01:11) [54]


> Johnmen ©   (30.03.08 00:52) [53]
>
> Чудны дела твои, Господи (с)
>

Не. Все эти формы в ДЛЛ - от лукавого.


 
Johnmen ©   (2008-03-30 01:15) [55]


> Германн ©   (30.03.08 01:11) [54]

Понял. Господь не причем. Лукавый рулит... :)


 
206196131 ©   (2008-03-30 01:21) [56]

аха


 
206196131 ©   (2008-03-30 06:45) [57]

вариант 1
  Tfrm.Create(Application)
окошко рисуется но
Tfrm.close  не работает

вариант 2
    Application.CreateForm(Tfrm,frm);
так все работает

и никакого отношения к  dll неимет, любоё оно сзданное  1 способом не закрывается ))

 а что касается DLL  начал переписывать все на  bpl пока доволен ))


 
Loginov Dmitry ©   (2008-03-30 21:00) [58]

> и никакого отношения к  dll неимет, любоё оно сзданное  
> 1 способом не закрывается ))


Странно... как это TForm1(nil).Close не работает. Да?
А у тебя именно это и получается.


 
Сергей М. ©   (2008-03-31 08:27) [59]


> 206196131 ©   (29.03.08 23:23) [47]
>
> procedure InitPlugin(App, Scr: integer); StdCall;


Это что за танцы с бубном ?



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

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

Наверх




Память: 0.61 MB
Время: 0.02 c
15-1205829243
DVM
2008-03-18 11:34
2008.04.27
Помогите с переводом на русский одной фразы из SDK


15-1205404261
sds
2008-03-13 13:31
2008.04.27
Шрифты


15-1205587844
Виктор007
2008-03-15 16:30
2008.04.27
В Delphi2007 перестала работть клавиша Ctrl


2-1207094959
snake-as
2008-04-02 04:09
2008.04.27
Не меняется курсор на форме


2-1206948837
IntruderLab
2008-03-31 11:33
2008.04.27
MDI форма