Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизИспользование MDIChild Найти похожие ветки
← →
Lower_ (2005-09-04 08:54) [0]Уважаемые мастера!
Помогите решить проблему.
Имеется глвный проект (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);
← →
GanibalLector © (2005-09-04 12:14) [1]ну,можно использовать FindWindowEx например.Хотя...
← →
Defunct © (2005-09-04 19:13) [2]> for i:=Application.MainForm.MdiChildCount-2 downto 0 do
Из-за чего возникла такая необходимость?
> Главный проект ее прекрасно импортирует - все работает
Сделай свой контейнер форм. По признакам, которые возвращает TCreateProc3 = function: integer; StdCall;
← →
Lower_ (2005-09-04 20:24) [3]Пользователь может много раз создавать данное окно, находящее в dll.
for i:=Application.MainForm.MdiChildCount-1 downto 0 do
специально сделал, хочу, если форма существует пропускать шаг, если отсутствует - создавать.
С контейнером форм будет туго.
← →
Zacho © (2005-09-04 20:35) [4]Lower_ (04.09.05 8:54)
if Application.MainForm.MdiChildren[i] =
Проверяй имя формы или ещё какое-либо св-во.
Например, if Application.MainForm.MdiChildren[i].Name=...
А вообще, DLL для подобной задачи - не лучшая идея. Лучше используй BPL.
← →
Defunct © (2005-09-04 20:38) [5]Lower_ (04.09.05 20:24) [3]
> С контейнером форм будет туго.
А в чем сложность? Прямо внутри DLL создать счетчик открытых форм, и считывать его.
> специально сделал, хочу, если форма существует пропускать шаг, если отсутствует - создавать.
Допустим экспортируется
CreateMDIForm;
что мешает экспортировать из той же DLL
MDIChildEnum:Integer - которая будет возвращать количество незакрытых MDIChild форм, созданных внутри DLL.
← →
Digitman © (2005-09-05 08:56) [6]
> Lower_ (04.09.05 08:54)
а зачем весь этот огород с stdcall и с передачей ссылок на TApplication и TScreen как Integer ?
ты же все равно не сможешь использовать свою dll в хост-проиложениях, собранных не в Делфи и не в ВСВ ..
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c