Вверх ↑
Этот топик читают: Гость
Ответов: 2466
Рейтинг: 696
#1: 2025-11-09 23:20:29 ЛС | профиль | цитата
Если открыть два дочерних окна (мать-дочка-внучка), то после закрытия двух дочерних окон, основное окно станет не доступным (заблокированным).
Тестовая схема:


Add(MainForm,13496199,182,140)
{
Width=560
Height=385
Caption="Главная форма"
}
Add(Button,1875975,238,140)
{
Left=135
Top=130
Width=260
Height=40
Caption="Открыть дочернее окно"
link(onClick,14474557:doShowModal,[])
}
Add(ChildFormEx,14474557,315,140)
{
link(onClick,12190338:doShowModal,[])
}
BEGIN_SDK
Add(EditMultiEx,7301879,21,21)
{
WorkCount=#11:doShowModal|
EventCount=#7:onClick|
Width=587
Height=431
link(doShowModal,14415229:doShowModal,[(87,27)(87,160)])
}
Add(MainForm,14415229,154,126)
{
Left=35
Top=105
Width=335
Height=251
Visible=1
Caption="Первая дочерняя"
Point(doShowModal)
}
Add(Button,13300658,203,126)
{
Left=25
Top=85
Width=260
Height=60
Caption="Открыть второе дочернее окно"
link(onClick,7301879:onClick,[(421,132)(421,27)])
}
END_SDK
Add(ChildFormEx,12190338,385,140)
{
}
BEGIN_SDK
Add(EditMultiEx,6593503,21,21)
{
WorkCount=#11:doShowModal|
Width=587
Height=431
link(doShowModal,3794323:doShowModal,[(87,27)(87,160)])
}
Add(MainForm,3794323,154,126)
{
Left=35
Top=105
Width=278
Height=197
Visible=1
Caption="Вторая дочерняя"
Point(doShowModal)
}
Add(Label,6111778,133,210)
{
Width=262
Height=158
Align=5
Caption="Теперь закрыть два дочерних окна"
Alignment=2
VerticalAlign=0
}
END_SDK

Не важно в каком режиме окна (свойство Mode: Standart или OnlyOnce), достаточно что они вызваны как дочерние doShowModal
Виной код в function THIMainForm._onClose;

begin
p := FParent;
{$ifndef SUPER_PARENT}
while not p.isForm do p := p.Parent;
{$endif}
if p.ModalForm ‹› Control then
Control.Hide
else Control.ModalResult := -1;
end;

Не понял для какого случая такие навороты, если достаточно проверить окно на модальность. Могу ошибаться, но вот такая правка избавляет от этой ошибки:

function THIMainForm._onClose;
var i:integer;
//p:PControl;
begin
Result := true;

if Accept and(ToIntegerEvent(_data_Close)‹›0) then exit;
for i := 0 to Control.ChildCount-1 do
with Control.Children[i]{$ifndef F_P}^{$endif} do
if isForm then Perform(WM_CLOSE,0,1);
if CurForm ‹› nil then
PostMessage(CurForm.Handle,WM_ACTIVATE,WA_ACTIVE,0 );
CurForm := nil;

if isMain then
begin
Result := false;
_hi_OnEvent(_event_onClose);
// EventOff;
end
else
begin
//Fix 09.11.2025 sla8a
if Control.Modal then
Control.ModalResult := -1
else
Control.Hide;
//p := FParent;
//{$ifndef SUPER_PARENT}
//while not p.isForm do p := p.Parent;
//{$endif}
//if p.ModalForm ‹› Control then
// Control.Hide
//else Control.ModalResult := -1;
end;
SavePosition;
Showed := False;
end;
карма: 11

0
Разработчик
Ответов: 26321
Рейтинг: 2147
#2: 2025-11-10 00:50:06 ЛС | профиль | цитата
sla8a писал(а):
Не понял для какого случая такие навороты

Для чего-то они же были сделаны. Так просто взять и херить директиву SUPER_PARENT я бы не стал. Хотя, хрен его знает, для чего она нужна.
карма: 22

0
Разработчик
Ответов: 26321
Рейтинг: 2147
#3: 2025-11-10 02:00:23 ЛС | профиль | цитата
Я кажется понял для чего нужен SUPER_PARENT. Может быть два режима работы модальности: 1-й -- это модальная форма строго привязана к родителю, и не влияет на другие формы, те к ним есть доступ; 2-й -- это когда модальная форма влияет на все формы приложения, и к ним нет доступа. Но насколько я понял, этот режим толком не работает у нас. Я пытался имитировать этот режим и ничего не изменилось. Все они работают во 2-ом режиме, те другие формы не доступны.

--- Добавлено в 2025-11-10 02:42:37

Думаю, оставим пока твою правку, если что, то будем думать дальше.

--- Добавлено в 2025-11-10 02:48:53

Пофиксил на SVN

Редактировалось 8 раз(а), последний 2025-11-10 02:49:11
карма: 22

0
Ответов: 2466
Рейтинг: 696
#4: 2025-11-10 17:42:24 ЛС | профиль | цитата
nesco, а что это за зверь такой, этот режим? Не могу себе представить когда он может понадобится и не припомню ни оного приложения чтоб было такое реализовано. Не утверждаю что он не нужен, но вот понять бы что это вообще такое и для чего.
карма: 11

0
Разработчик
Ответов: 26321
Рейтинг: 2147
#5: 2025-11-10 23:24:16 ЛС | профиль | цитата
sla8a писал(а):
Не могу себе представить когда он может понадобится

Вот я тоже, кстати, не могу понять -- зачем это надо? Хотя вчера я добивался результата, что только форма вызова становилась недоступна, а вторая, параллельная форма оставалась доступной.
карма: 22

0
Ответов: 2466
Рейтинг: 696
#6: 2025-11-10 23:31:01 ЛС | профиль | цитата
Правильно понимаю, это так должно выглядеть:
Add(MainForm,13496199,329,203)
{
Width=560
Height=385
Caption="Главная форма"
}
Add(Button,1875975,385,203)
{
Left=135
Top=130
Width=260
Height=40
Caption="Открыть дочернее окно"
link(onClick,14474557:doShowModal,[])
}
Add(ChildFormEx,14474557,462,203)
{
}
BEGIN_SDK
Add(EditMultiEx,7301879,21,21)
{
WorkCount=#11:doShowModal|
Width=587
Height=431
link(doShowModal,14415229:doShowModal,[(87,27)(87,160)])
}
Add(MainForm,14415229,154,126)
{
Left=35
Top=105
Width=335
Height=251
Visible=1
Caption="Первая дочерняя"
Point(doShowModal)
}
END_SDK
Add(ChildFormEx,14981753,462,133)
{
}
BEGIN_SDK
Add(EditMultiEx,478346,21,21)
{
}
Add(MainForm,1806220,35,105)
{
Left=550
Position=2
}
Add(Label,4907459,203,91)
{
Left=200
Top=90
Align=5
Caption="Окно которое должно остаться доступным после вызова модального"
Alignment=2
VerticalAlign=0
}
END_SDK


Если вместо
  //Control.ShowModalParented(p);
Control.ShowModal;
то будет как ты описал, но вроде как и моя правка работает без проблем.

Редактировалось 3 раз(а), последний 2025-11-10 23:51:59
карма: 11

0
Разработчик
Ответов: 26321
Рейтинг: 2147
#7: 2025-11-11 01:16:36 ЛС | профиль | цитата
sla8a писал(а):
Если вместо

Да, правильно

--- Добавлено в 2025-11-11 01:17:15

sla8a писал(а):
то будет как ты описал, но вроде как и моя правка работает без проблем.

Работает, пока так и оставим.

Редактировалось 1 раз(а), последний 2025-11-11 01:17:15
карма: 22

1
Голосовали:strannik_nebes
Ответов: 201
Рейтинг: 5
#8: 2025-11-12 08:55:27 ЛС | профиль | цитата
тоже сталкивался с этой проблемой. Вот, значит, откуда "ноги растут".
карма: 1

0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)