|
Тема
|
Скрита модална форма
|
|
Автор |
NikB (любопитен) |
Публикувано | 25.12.03 21:07 |
|
Здравеите!
Честити празник, за тези, които го празнуват!
В мое приложение може да се стигне до ситуация, при която модална форма е закрита от друга форма на същото приложение. При това другата форма е активна (нейния Caption е засветен).
Може ли да се определи (в рамките на приложението) коя форма е модална?
Опитах с
for i:=0 to Screen.FormCount-1 do begin
xForm := tForm(Screen.Forms);
if xForm.Owner = Application.MainForm then begin
if fsModal in xForm.FormState then begin
но не се получи.
| |
Тема
|
Re: Скрита модална форма
[re: NikB]
|
|
Автор |
PhantomAS (няма) |
Публикувано | 26.12.03 10:28 |
|
Как точно си получил този резултат???? По принцип модалните форми се ползват под формата на стек - тази която е най-отгоре се затваря първа ?! - т.е. идеята е не просто да си стои най-отгоре в списъка с отворените прозорци - ами да не можеш да пипаш нищо друго освен нея. Не знам какво точно се опитваш да направиш, но идеята да активираш модална форма (не че се сещам дали това може да стане) която е по-назад в списъка с формите - не ми се струва добра. Друг въпрос е, че не е добра идеята да отваряш друга форма (немодална) от модална форма - без да затваряш модалната.
Я разкажи какво точно се опитваш да постигнеш - за да може да се даде смислено обеснение.
---
Колкото повече, толкова повече.
| |
Тема
|
Re: Скрита модална форма
[re: PhantomAS]
|
|
Автор |
NikB (любопитен) |
Публикувано | 26.12.03 11:21 |
|
Благодаря ти за вниманието и ме извини за многословието!
Преди три месеца, по най-лошия взъможен начин (без да зная накрая какво ще искат) направих една програмка обслужваща външно комуникационно устройство по Com порт (RS232). Това като оправдание .
Та при случка по Com-a трябваше моята програмка да изплува от трея и да се цопне най-отгоре. За целта ползвах
SetWindowPos(aForm.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE);
но се наложи да прихвана и
Application.OnDeactivate
Както и да е, поради промени в изискванията този механизъм отпадна и го премахнах от програмата, но най-вероятно някъде е останало някое активиране на немодална форма, докато има активна модална.
Възможната активна немодална форма е само една, а модалните са няколко и
исках да заобиколя проблема като при визуализиране на немодалнта форма проверявам дали приложението няма активна модална форма (и ако има - да я извеждам над немодалната).
Гледах сорсовете на ShowModal и горе-долу ми е ясен механизма, но до голяма част от полетата нямам достъп, щото са private.
Освен това не от модалната форма активирам немодалната. Модалната се активира от потребителя (напр. за настройка на параметри на програмата), а немодалната - при събитие (напр. от Com порта)
| |
Тема
|
Re: Скрита модална форма
[re: NikB]
|
|
Автор |
Formal (невежа) |
Публикувано | 30.12.03 15:18 |
|
Защо не опиташ с Application.Forms?
Освен това, кода, който си показал малко ме озадачава. Аз бих го написал:
for i:=0 to Screen.FormCount-1 do begin
xForm := Screen.Forms[ i ];
if xForm.Owner = Application {или Application.MainForm, не съм сигурен} then begin
if fsModal in xForm.FormState then begin
...
Защо не опиташ така?
| |
Тема
|
Grashkata si e moia
[re: Formal]
|
|
Автор |
NikB (любопитен) |
Публикувано | 30.12.03 18:13 |
|
To tva si e za chudene (xForm := tForm(Screen.Forms);) - greshka si e moia.
| |
Тема
|
Re: Скрита модална форма
[re: NikB]
|
|
Автор |
Dark_Dirk (+#+) |
Публикувано | 05.01.04 12:21 |
|
Като гледам как сте подхванали въпроса с модалните форми да питам и аз:
Моя проблем е различен от този на NikB. Появава се на Windows XP.
Ползвам Delphi 5.
Всеки път като някоя форма изпълнява код за по дълго време Windows-a маркира прозореца като Not-Responding, при което въпросната форма може да се движи. След това ако се опитам да изведа друга модална форма тя се появява, но не е модална и се намира под главната !!!
Единственото решение, което намерих е да виквам веднъж Application.ProcessMessages преди ShowModal на втората форма.
Да имате впечатления или повече инфо по този проблем ?
Може да го получите по следния начин:
една форма с един бутон.
procedure TForm1.Button1Click(Sender: TObject);
begin
Sleep(10);
Form2.ShowModal;
end;
Ако по време на заспиването движите формата след това се появяват 2 форми и не са модални, но ако имате:
procedure TForm1.Button1Click(Sender: TObject);
begin
Sleep(10);
Application.ProcessMessages;
Form2.ShowModal;
end;
всичко работи нормално ?!?
| |
Тема
|
При мен не е така
[re: Dark_Dirk]
|
|
Автор |
NikB (любопитен) |
Публикувано | 05.01.04 13:05 |
|
(най-вероятно имаш предвид Sleep(10000) - няма значение)
Пробвах примерът ти (и аз съм на XP/D5), но при мен (и през Делфито и като приложение) не можах да накарам Form1 да се движи през Sleep-a и да си остане над Form2.
Може би XP има опция, update, или цялата работа зависи от Owner или DefaulMonitor на формитe. Ще го пробвам по-късно.
(А и проблемите ни не са много различни)
| |
Тема
|
Re: При мен не е така
[re: NikB]
|
|
Автор |
Dark_Dirk (+#+) |
Публикувано | 05.01.04 16:43 |
|
Абсолютно си прав за sleep-a
Ефекта се появява ако първата форма извършва някаква дълга обработка или за по-просто sleep. Ако упорито пробваш да я местиш през това време след около 3 секунди тя ще се "откачи" и ще започне да се мести. На caption-a ще пише Alabala - Not responding. Ако не я местиш тя не се "откача" и проблем няма.
По наблюдения с програмата Grider, когато формата се "откачи", Windows-a дори променя classname-a на формата. Този ефект сме го получавали на повече от 100 компютъра с Win XP Pro или Home, така че 100% го има.
| |
Тема
|
Re: Скрита модална форма
[re: NikB]
|
|
Автор | Lando (Нерегистриран) |
Публикувано | 11.01.04 22:20 |
|
xForm.BringToFront;
| |
|
|
|
|