Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];

Вниз

опять MDI и DLL   Найти похожие ветки 

 
SergeyDon   (2002-03-20 19:56) [0]

Почему при создании формы из DLL (MDIChild естественно) в параметре MainForm.MDIChildCount:=0;
вырезки прилагаю:
в DLL -

library paket;
var
OldApp:TApplication;
{$R *.RES}
function CreateDLLini(App: TApplication):boolean;
begin
{инициализация DLL для программы}
OldApp:=Application;
Application := App;
Result:=True;
end;
function DestroyDLLini():boolean;
begin
{инициализация DLL для уничтожения}
Application:=OldApp;
Result:=True;
end;
function CreateChildFormGraph(ShNumber:cardinal; ShName:string; ShDate:TDateTime):TFormGraph;
begin
Result := TFormGraph.Create(Application);
with Result do begin
Height:=280;
Width:=700;
...
end;
end;
exports CreateChildFormGraph, CreateDLLini, DestroyDLLini;

begin
end.
////////////////////////////////////////////////////////////

в проекте главного модуля -
...
function CreateDLLini(App: TApplication):boolean; external "paket.dll";
function DestroyDLLini():boolean; external "paket.dll";
function CreateChildFormGraph(ShNumber:cardinal; ShName:string; ShData:TDateTime):TForm; external "paket.dll";

procedure TMainForm.N301Click(Sender: TObject);
begin
CreateChildFormGraph(SelSh.IDSh, SelSh.NameSh, DateSel.Date);
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var i:byte;
begin
i:=MainForm.MDIChildCount; {тут i=0}
{тут по идеи надо бы удалить созданные формы иначе приложение не будет закрыто так как оно не может удалить формы созданные из DLL, причем если использовать массив указателе на формы например
описать ТТ:array of TForm; и в процедуре создания сделать
SetLength(TT,Length(TT)+1);
TT[high(TT)]:=CreateChildFormGraph(SelSh.IDSh, SelSh.NameSh, DateSel.Date);
и закрывать
for i:=0 to high(TT) do TT[i].Destriy;
работает на 99% - 100%
}
{инициализация DLL для уничтожения}
if not(DestroyDLLini()) then raise Exception.Create("DLL не удалена!");
end;


 
McSimm   (2002-03-21 10:43) [1]

Проблема исчезнет, если вместе с переназначением Apllication, таким же образом переназначать переменную Screen.
function CreateDLLini(App: TApplication; Scr: TScreen):boolean;
и далее, все аналогично.

Дело в том, что при создании формы, она добавляется в список:
Screen.AddForm(Self);
а у тебя Screen в DLL и программе - разные


 
deleon   (2002-03-21 10:51) [2]

А что мешает уничтожать MDIForms в Dll ?


 
SergeyDon   (2002-03-22 09:35) [3]

//deleon

когда это надо делать?

А если прогу снимают Ctrl+Alt+Del?


 
deleon   (2002-03-22 10:07) [4]

Я не думаю что програмист обязан обеспечивать корректное поведение программы при закрытии ее по C-A-D, так как по своей сути такое закрытие является ненормальным и в этом случае об освобождении ресурсов должна заботиться сама система. А MDI Child нужно создавать в dll от объекта dll, и тогда описания в OnClose: Action:=caFree будет достаточно! И еще: для нормальной работы, тебе нужно иметь один Application для приложения и dll.


 
Alx2   (2002-03-22 10:11) [5]

>А если прогу снимают Ctrl+Alt+Del?
Прога получит от системы уведомление, что ее хотят похоронить. Осталось его обработать.


 
McSimm   (2002-03-22 10:30) [6]

>SergeyDon (22.03.02 09:35)
Разве проблема осталась?


 
SergeyDon   (2002-03-22 22:02) [7]

> McSimm

под WinXP все работае даже без Tscreen а под 98 ни вкаую ни идёт!
-----------------
ПОМОГИТЕ КТО может (маленький рабочий примерчик) по работе MDIChild в DLL.

надо из DLL создавать MDIChild формы содержащие TChart которые можно закрывать и показывать снова для разных значений (эта часть работает) и после закрытия программы корректно выгрузится из памяти.
Избегаю ощибки типа project1 вызвало ошибку при обращении к DLL в в памяти по адресу...
и тому подобного.


 
SergeyDon   (2002-03-22 22:02) [8]

> McSimm

под WinXP все работае даже без Tscreen а под 98 ни вкаую ни идёт!
-----------------
ПОМОГИТЕ КТО может (маленький рабочий примерчик) по работе MDIChild в DLL.

надо из DLL создавать MDIChild формы содержащие TChart которые можно закрывать и показывать снова для разных значений (эта часть работает) и после закрытия программы корректно выгрузится из памяти.
Избегаю ощибки типа project1 вызвало ошибку при обращении к DLL в в памяти по адресу...
и тому подобного.

можно на мыло SergeyDon@mail.ru




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

Форум: "Основная";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
1-9459
Swinger
2002-03-24 00:26
2002.04.04
ICQ


14-9631
Fred
2002-02-23 08:02
2002.04.04
Как засинхронизироваться по времени от другого коммпьютера?


14-9640
Adder
2002-02-22 00:58
2002.04.04
Дыра в суперновом компоненте Microsoft Visual C++ .NET %О


1-9443
Gayrus
2002-03-22 17:28
2002.04.04
String


3-9369
Dil
2002-03-10 22:02
2002.04.04
Вопрос про редактирование в БД Access.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский