![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL немодальный вызов, MDI [D7, Win2k, WinXP]
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 просто это переделать - вот и куча вопросов из -за этого... Сейчас попробую