MDI правильне закриття вікон та зникненням їх

Шановні, Майстри. Хтось може дати приклад, який правильно реалізовував закриття дочірніх вікон MDI з повідомленням, і щоб вікна зникали, а не висіли (вікна залишаються). Заздалегідь спасибі.

>щоб вікна > зникали, а не висіли

procedure TForm1Close(. ); begin Action := acFree; end;

> Хтось може дати приклад, який правильно >реалізовував > закриття дочірніх вікон MDI з повідомленням

Тут би не заважало розшифрувати зміст сказаного.

tio (2006-05-27 15:16) [2]

у процедурі закриття вікно більше 1 маємо: for i:=0 to Screen.Forms.Count-1 do Screen.Forms[i].Close; І з Action:=cafree в OnClose; Або для i:=0 до Application.MainForm.MdiChildCount-1 do Application.MainForm.MdiChild[i].Close;

Обидва коди працюють некоректно, якщо запитувати onCloseQuery case Application.Messagebox(0,"Закрити вікно?","Повідомлення",mb_YesNOCancel) of >ID_Cancel:Abort; ID_Yes: вставити код закриття з охороною // у вікна і залишаються, навіть якщо вікна були закриті з "Так" - вони висять, як ні в чому не бувало.

Як бути, а потрібно видати повідомлення про закриття багатьох вікон?

Жуков Олег (2006-05-27 18:04) [3]

var QueryResult: Integer;

if SilentMode then // SilentMode: Boolean - глобально оголошена змінна-прапор. Якщо її встановити у True, питань при збереженні не буде. QueryResult := ID_YES; // або ID_NO, дивлячись що потрібно else QueryResult := Application.Messagebox(0, "Зберегти зміни?", "Повідомлення", mb_YesNOCancel);

case QueryResult of > > ID_Yes: begin CanClose:=True; вставити код збереження end; end;

tio (2006-05-30 10:49) [4]

Шановні майстри. Ви трохи не зрозуміли. . Як з головного вікна закривати дочірні із закриттям та зникненням їх, коли натискаєш ТАК або НІ діалогу про закриття даного MDIChild вікна.

Обидва коди працюють некоректно, якщо

тому, що цикл організований невірно, хоча б так зроби: for i: = Application.MainForm.MdiChildCount-1downto 0do Application.MainForm.MdiChild [i]. Close;

Хоча й так не можна. Краще просто While Application.MainForm.MdiChildCount > 0 do Application.MainForm.MdiChild[0].Close

розруливши вихід із циклу, якщо натиснули Скасувати

tio (2006-05-30 11:24) [7]

А якщо кілька MDIChild, то тоді як? Адже цикл тільки з першим членом масиву на Вашу. MdiChild[0] На мій і цей приклад не вдалий. Я подивився Access - там така ж фігня. А напевно рішення є. Треба піддати це питання колегіальному обговоренню.

>Адже цикл тільки з першим членом масиву за Вашим. MdiChild[0]

А хто, цікаво, стане першим членом масиву (хоча це й не масив, а індексна властивість) після знищення екземпляра, який раніше був як MdiChild[0]?

>Я подивився Access - там така сама фігня.Вихідники? :)

А напевно рішення є. Треба піддати це питання колегіальному обговоренню.

Навіщо взагалі якісь цикли? Ми закриваємо головну форму MDI докладання. Вона сама спробує закрити всі дочірні форми.

procedureTDocumentForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var mbr: TModalResult;>PChar( "Документ """ + Caption + """ було змінено! Зберегти зміни ?" ), "Закриття документа", MB_YESNOCANCEL + MB_DEFBUTTON3 + MB_ICONQUESTION ); mbr = IDYES then begin if Assigned(FOnBeforeSave) then FOnBeforeSave(Self, mbr) else mbr := mrOk; CanClose := (mbr = mrOk) або (mbr = mrYes); if CanClose then try CanClose := true; except CanClose := false; end else CanClose := false; end else CanClose := (mbr = IDNO); end else CanClose := true; if CanClose then OnResize := nil; end;

На це можна не дивитися:іf Assigned(FOnBeforeSave) then FOnBeforeSave(Self, mbr)

просто форма використовується в багатьох додатках і подекуди були потрібні деякі додаткові. перевірки (маніпуляції)

tio (2006-05-31 08:53) [10]

Ще раз перепрошую. А що таке FOnBeforeSave?

На це можна не дивитися === Це можна викинути

Це власний обробник події. Якщо теж хочеться, то робиться елементарно, наприклад:

TDocumentForm = class(TForm) private FOnBeforeSave: TNotifyEvent; . Якщо одного параметра Sender мало можна "придумати" свій тип, наприклад

TDialogEvent = procedure(Sender: TObject; з ModalResult: TModalResult) of object; тоді буде FOnBeforeSave: TDialogEvent ;

і public property OnBeforeSave: TDialogEvent read FOnBeforeSave write FOnBeforeSave;

тепер в іншій формі після створення екземпляра TDocumentForm я призначу власний обробник.