Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL немодальный вызов, MDI [D7, Win2k, WinXP]


Страницы:   1 2 3 4

IntruderLab ©   (2008-03-11 15:32:00) 

Задачка такова, необходимо разработать MDI приложение, все формы хранятся в dll. Не получается вызов формы как Child формы, как сделать?
Привожу кусочек из DLL
var
 DLLForm  : TDLLForm;
 CallForm : THandle;
implementation

 {$R *.DFM}
//******************************************************************************
function ShowModalForm: Integer;
//Modal Call
begin
 DllForm := TDllForm.Create(Application);
 Result  := DLLForm.ShowModal;
 DLLForm.Free;
end;
//******************************************************************************
procedure ShowForm(Appl, Form: THandle);
//NonModal Call
begin
 Application.Handle := Appl;
 DllForm            := TDllForm.Create(Application);
 DLLForm.FormStyle  := fsMDIChild;
 DLLForm.Color      := clMoneyGreen;
 CallForm           := Form;
 DLLForm.Show;
end;
//******************************************************************************

и кусочек из приложения
procedure TTestMain.Button1Click(Sender: TObject);
// Модальный вызов
begin
  Button2.Enabled := False;
  label1.Caption := 'ModalResult = '+IntToStr(ShowModalForm);
  label1.Show; // Показываем результат вызова
  Button2.Enabled := True
end;

procedure TTestMain.Button2Click(Sender: TObject);
// Немодальный вызов
begin
 Button1.Enabled := False;
 Button2.Enabled := False;
 Button3.Enabled := True; label1.Hide;
 ShowForm(Application.Handle, Self.Handle) ;
end;


Сергей М.   (2008-03-13 16:43:00) [21]

Пробуй:

try
Application.CreateForm(TfrmTest,frmTest);
except
 on e:exception do ShowMessage(e.Classname + ' ' + e.Message);
end;

Что видишь ?


Сергей М.   (2008-03-13 16:41:00) [22]


> frmTest.Show;


Это лишнее.

При создании MDIChild-формы она автоматически станет видимой


IntruderLab   (2008-03-13 16:40:00) [23]

Application.CreateForm(TfrmTest,frmTest); - программа просто висит - никаких реакций


Сергей М.   (2008-03-13 16:39:00) [24]


> frmTest.FormStyle := fsMDIChild;


Что мешает выставить FormStyle=fsMDIChild у формы прямо в дизайн-тайм ?


IntruderLab   (2008-03-13 16:36:00) [25]

я такого не говорил, сейчас все нормально, Application.MainForm := frmMain;
Application.MainForm.FormStyle := fsMDIForm; Теперь как мне форму вызвать чтобы она стала дочерней, делаю как ранее:
frmTest := TfrmTest.Create(Application);
frmTest.FormStyle := fsMDIChild;
frmTest.Show;
он не ругается - но подвисает


Сергей М.   (2008-03-13 16:36:00) [26]


> Все нормально! теперь fsMdiForm


Ну раз fsMdiForm, то пробуй так:

Application.CreateForm('TfrmTest', frmTest);


Сергей М.   (2008-03-13 16:34:00) [27]

А с чего ты взял, что причиной AV явилось именно Application=nil ?

Ты давай уже не мудри, а воспользуйся для проверки отладчиком)
А кустарщину с ShowMessage оставь для иных случаев)


IntruderLab   (2008-03-13 16:33:00) [28]

Что дальше?


IntruderLab   (2008-03-13 16:32:00) [29]

Все нормально! теперь fsMdiForm


IntruderLab   (2008-03-13 16:28:00) [30]

В вызове написал
if Application.MainForm.FormStyle = fsMDIForm then ShowMessage('1');
выскочило access violation


Сергей М.   (2008-03-13 16:24:00) [31]

Ну ?!

А говоришь nil)


> то есть как и должно быть


Еще должно быть Application.MainForm.FormStyle = fsMDIForm - давай, проверяй ...


IntruderLab   (2008-03-13 16:22:00) [32]

Вот ShowMessage(Application.MainForm.Name) у меня frmMain, то есть как и должно быть


Сергей М.   (2008-03-13 16:18:00) [33]


> Application = nil


Да быть того не может !
Что угодно, но только не nil там должно быть.

Если, конечно же, над этим не потрудились твои очумелые ручки)


IntruderLab   (2008-03-13 16:12:00) [34]

В состоянии :) Application = nil так что я думаю, что все остальное тоже nil


Сергей М.   (2008-03-13 16:07:00) [35]

О боже)...

Ты в состоянии средствами отладчика отсановиться на строчке

Result := LongInt(TfrmTest.Create(Application);

и посмотреть, чему равно значения Application.MainForm, Application.MainForm.Visible, Application.MainForm.FormStyle ?


IntruderLab   (2008-03-13 16:00:00) [36]

Мне параметром ему хендл главной формы присваивать?


Сергей М.   (2008-03-13 15:08:00) [37]

Чему равно

Application.MainForm

непосредственно перед вызовом

TfrmTest.Create(Application)

?


IntruderLab   (2008-03-13 15:02:00) [38]

Хелп, ничего не понимаю. Напишите просто тупо как вызвать форму из DLL чтобы она стала Child для mdi
у меня в exe frmMain.FormStyle := fsMDIForm;
в dll frmTest.FormStyle := fsMDIChild;
функция вызова формы frmTest из dll
function ShowTest:LongInt;StdCall;
var frmTest : TfrmTest;
begin
Result := LongInt(TfrmTest.Create(Application); --навреное тут не так, как сделать не знаю
end;
в exe:
var LibHandle : THandle;
****
LibHandle := LoadLibrary('iHercules.dll');
if LibHandle <> 0 then
begin
@ShowTest := GetProcessAddress(LibHandle,'ShowTest);
ShowTest;
end;
FreeLibrary(LibHandle);

Что я не так делаю.... в не MDI приложении с модальным вызовом форм все работет, не могу понять как это реализуется в MDI


IntruderLab   (2008-03-13 14:51:00) [39]

Не понимаю, пишет - Нет возможности создать форму, ни одна MDI форма не является активной, все таки хоче указания Application


IntruderLab   (2008-03-13 14:09:00) [40]


> Сергей М. ©   (13.03.08 14:06) [34]
>
>
> > это exe? а как указать в dll?
>
>
> Сказка про белого бычка)
>
> Говорили-говорили про единый объект Application - и все
> впустую)
>
> Ты пойми, что при BwRTP-опции объект Application и, соотв-
> но, объект Application.MainForm и в ехе и в длл - это один
> и тот же объект !


Сергей, сорри... просто привык к одной системе - очень сложно представить как в MDI просто это переделать - вот и куча вопросов из -за этого... Сейчас попробую


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо