MDI, Deactivate
2 отговора
0 прегледа
MDI, Deactivate
Пиша MDI програма и искам при преминаване от един прозорец към друг въведените в първия прозорец данни да се записват в БД. Ако въведените данни са некоректни трябва първият прозорец да остане активен и да излезе съобщение. Обикновено прозорците са максимизирани. Правя:
procedure ...FormDeactivate
if (некоректни данни) then
begin
Show;
WindowState := wsMaximized;
Exit;
end;
Обаче събитието идва чак след като вторият прозорец се е показал и съобщението излиза над него. Още по-зле става, ако се отвори нов прозорец. Windows-a започва да го анимира, но в някакъв междинен момент настъпва събитието и всички прозорци се раз-максимизират и разместват. От Visual effects съм спрял Animate windows... и за всички програми е ОК, но за MDI не важи.
Някакви идеи?
procedure ...FormDeactivate
if (некоректни данни) then
begin
Show;
WindowState := wsMaximized;
Exit;
end;
Обаче събитието идва чак след като вторият прозорец се е показал и съобщението излиза над него. Още по-зле става, ако се отвори нов прозорец. Windows-a започва да го анимира, но в някакъв междинен момент настъпва събитието и всички прозорци се раз-максимизират и разместват. От Visual effects съм спрял Animate windows... и за всички програми е ОК, но за MDI не важи.
Някакви идеи?
Re: MDI, Deactivate
Незнам дали това е правилното решение, но опитай следното нещо: създавай си децата, като в публик секцията си сложиш някакъв идентификатор.Това, което си написал, мисля че при МДИ формите не ти върши работа.
Ако искаш прозореца да ти излезе като активен(но трябва да знаеш, кои CHILD прозорец да ти излезе и за това на помощ ти идва идентификатора):
procedure ...Show...
if (некоректни данни) then
begin
Windows.MessageBox(...);
PostMessage(....);
end;
end
Ако искаш прозореца да ти излезе като активен(но трябва да знаеш, кои CHILD прозорец да ти излезе и за това на помощ ти идва идентификатора):
procedure ...Show...
if (некоректни данни) then
begin
Windows.MessageBox(...);
PostMessage(....);
end;
end
Re: Re: MDI, Deactivate
Това, което съм написал, работи с дефекта, който съм се опитал да обясня. С две думи първо се показва следващия прозорец, върху него излиза съобщението от деактивирания, и след ОК се връща. Явно проблема е, че това съобщение е TNotifyEvent, т.е. уведомяване какво е станало вече.
Няма как да направя процедури ShowForm1, ShowForm2, ..., защото самото превключване става или от меню Window (дето ОС-а си слага и маха авт. Menu Item-ите), или с Control+Tab.
Мисля да пробвам обаче нещо друго. Сега прихващам WM_MDIACTIVATE (чрез OnDeactivate) на формите fsMDIChild. Другия вариант е да прихвана това съобщение във формата fsMDIForm и да проверявам преди да се изпълни inherited.
Няма как да направя процедури ShowForm1, ShowForm2, ..., защото самото превключване става или от меню Window (дето ОС-а си слага и маха авт. Menu Item-ите), или с Control+Tab.
Мисля да пробвам обаче нещо друго. Сега прихващам WM_MDIACTIVATE (чрез OnDeactivate) на формите fsMDIChild. Другия вариант е да прихвана това съобщение във формата fsMDIForm и да проверявам преди да се изпълни inherited.