MDI, Deactivate

2 отговора 0 прегледа
#1

MDI, Deactivate

Пиша MDI програма и искам при преминаване от един прозорец към друг въведените в първия прозорец данни да се записват в БД. Ако въведените данни са некоректни трябва първият прозорец да остане активен и да излезе съобщение. Обикновено прозорците са максимизирани. Правя:

procedure ...FormDeactivate
if (некоректни данни) then
begin
Show;
WindowState := wsMaximized;
Exit;
end;

Обаче събитието идва чак след като вторият прозорец се е показал и съобщението излиза над него. Още по-зле става, ако се отвори нов прозорец. Windows-a започва да го анимира, но в някакъв междинен момент настъпва събитието и всички прозорци се раз-максимизират и разместват. От Visual effects съм спрял Animate windows... и за всички програми е ОК, но за MDI не важи.

Някакви идеи?

Отговор
в отговор на Йopдaн #2

Re: MDI, Deactivate

Незнам дали това е правилното решение, но опитай следното нещо: създавай си децата, като в публик секцията си сложиш някакъв идентификатор.Това, което си написал, мисля че при МДИ формите не ти върши работа.
Ако искаш прозореца да ти излезе като активен(но трябва да знаеш, кои CHILD прозорец да ти излезе и за това на помощ ти идва идентификатора):
procedure ...Show...
if (некоректни данни) then
begin
Windows.MessageBox(...);
PostMessage(....);
end;
end

Отговор
в отговор на NoWay #3

Re: Re: MDI, Deactivate

Това, което съм написал, работи с дефекта, който съм се опитал да обясня. С две думи първо се показва следващия прозорец, върху него излиза съобщението от деактивирания, и след ОК се връща. Явно проблема е, че това съобщение е TNotifyEvent, т.е. уведомяване какво е станало вече.

Няма как да направя процедури ShowForm1, ShowForm2, ..., защото самото превключване става или от меню Window (дето ОС-а си слага и маха авт. Menu Item-ите), или с Control+Tab.

Мисля да пробвам обаче нещо друго. Сега прихващам WM_MDIACTIVATE (чрез OnDeactivate) на формите fsMDIChild. Другия вариант е да прихвана това съобщение във формата fsMDIForm и да проверявам преди да се изпълни inherited.

Отговор