![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование MDIChild [D6]
Lower_ © (2005-09-04 08:54:00)Уважаемые мастера!
Помогите решить проблему.
Имеется глвный проект (exe) - он же MDIMainForm;
имеется MDIChildForm, расположенная в dll.
Главный проект ее прекрасно импортирует - все работает, но
одно но..
При перечислении MDIChild -
for i:=Application.MainForm.MdiChildCount-2 downto 0 do
if Application.MainForm.MdiChildren[i] = (окно в Dll - то самое MDIChild) - не могу этого
сделать, не используя uses в главном проекте, хочется, чтобы
она ссылалась через DLL, без подключения uses этой формы.
Кто знает решение, пожалйста напишите.
Заранее спасибо.
Код dll:
library evr_in;
uses
SysUtils,
Classes,
forms,
windows,
evr_inf_u in 'evr_inf_u.pas' {evr_inf_f};
var
DA3 : TApplication;
DS3 : TScreen;
{$R *.res}
procedure Init3(App3, Scr3: integer); StdCall;
begin
DS3 := Screen;
Screen := TScreen(Scr3);
DA3 := Application;
Application := TApplication(App3);
end;
procedure Done3; StdCall;
begin
Screen := DS3;
Application := DA3;
end;
procedure evr_info;stdcall;
begin
LockWindowUpdate(Application.MainForm.ClientHandle);
evr_inf_f:=Tevr_inf_f.Create(Application);
evr_inf_f.frReport.ShowReport;
LockWindowUpdate(0);
end;
exports
Init3,
Done3,
evr_info;
begin
end.
Код из главного проекта:
***
type
TInitProc3 = procedure(App3, Scr3: integer); StdCall;
TDoneProc3 = procedure; StdCall;
TCreateProc3 = function: integer; StdCall;
**
public
FLib3 : THandle;
Init3 : TInitProc3;
Done3 : TDoneProc3;
evr_info : TCreateProc3;
***
procedure TMain_dll_f.FormCreate(Sender: TObject);
FLib3 := LoadLibrary(PChar('evr_in.dll'));
@Init3 := GetProcAddress(FLib3, PChar('Init3'));
@Done3 := GetProcAddress(FLib3, PChar('Done3'));
@evr_info := GetProcAddress(FLib3, PChar('evr_info'));
Init3(integer(Application), integer(Screen));
***
procedure TMain_dll_f.FormDestroy(Sender: TObject);
begin
Done3;
FreeLibrary(FLib3);
end;
Вызывает так:
var:
Fm1:TForm;
procedure TMain_dll_f.N24Click(Sender: TObject);
Fm1 := TForm(evr_info);
Digitman (2005-09-05 08:56:00) [1]
> Lower_ (04.09.05 08:54)
а зачем весь этот огород с stdcall и с передачей ссылок на TApplication и TScreen как Integer ?
ты же все равно не сможешь использовать свою dll в хост-проиложениях, собранных не в Делфи и не в ВСВ ..
Defunct (2005-09-04 20:38:00) [2]Lower_ (04.09.05 20:24) [3]
> С контейнером форм будет туго.
А в чем сложность? Прямо внутри DLL создать счетчик открытых форм, и считывать его.
> специально сделал, хочу, если форма существует пропускать шаг, если отсутствует - создавать.
Допустим экспортируется
CreateMDIForm;
что мешает экспортировать из той же DLL
MDIChildEnum:Integer - которая будет возвращать количество незакрытых MDIChild форм, созданных внутри DLL.
Zacho (2005-09-04 20:35:00) [3]Lower_ (04.09.05 8:54)
if Application.MainForm.MdiChildren[i] =
Проверяй имя формы или ещё какое-либо св-во.
Например, if Application.MainForm.MdiChildren[i].Name=...
А вообще, DLL для подобной задачи - не лучшая идея. Лучше используй BPL.
Lower_ (2005-09-04 20:24:00) [4]Пользователь может много раз создавать данное окно, находящее в dll.
for i:=Application.MainForm.MdiChildCount-1 downto 0 do
специально сделал, хочу, если форма существует пропускать шаг, если отсутствует - создавать.
С контейнером форм будет туго.
Defunct (2005-09-04 19:13:00) [5]> for i:=Application.MainForm.MdiChildCount-2 downto 0 do
Из-за чего возникла такая необходимость?
> Главный проект ее прекрасно импортирует - все работает
Сделай свой контейнер форм. По признакам, которые возвращает TCreateProc3 = function: integer; StdCall;
GanibalLector (2005-09-04 12:14:00) [6]ну,можно использовать FindWindowEx например.Хотя...