Проблем с " ShowModal "
2 отговора
0 прегледа
Проблем с " ShowModal "
Здравейте на всички , проблемът е малко странен и се състои в следното :
В приложението има форма която се ползва за извеждане на съобщения към потребителите (не се ползва "ShowMessage" нарочно) , случва се понякога когато се извика тази форма чрез "ShowModal" и се попълни съответния текст на съобщението само понякога формата със съобщението остава под прозореца който я е извикал и съответно ако не се натисне "ALt+Tab" не може да се продължи работа , случва се на Win XP - Windows XP Style интересно е че ако е настроен на Windows Classic Style не се случва или поне така си мисля . На формата за съобщения е настроен " FormStyle -> fsStayOnTop ".
В приложението има форма която се ползва за извеждане на съобщения към потребителите (не се ползва "ShowMessage" нарочно) , случва се понякога когато се извика тази форма чрез "ShowModal" и се попълни съответния текст на съобщението само понякога формата със съобщението остава под прозореца който я е извикал и съответно ако не се натисне "ALt+Tab" не може да се продължи работа , случва се на Win XP - Windows XP Style интересно е че ако е настроен на Windows Classic Style не се случва или поне така си мисля . На формата за съобщения е настроен " FormStyle -> fsStayOnTop ".
Re: Проблем с " ShowModal "
След кратко търсене успях да намеря това , не е точното решение но :
"OnShow" на формата ->
"
procedure TForm1.FormShow(Sender: TObject);
begin
SetWindowPos(Form1.Handle,
HWND_TOPMOST,
0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
end;
"
Ако има диалог с потребителя т.е. формата за съобщение до него е показана с "ShowModal" то тя ще е винаги най-отгоре на десктопа му докато не и отговори с ОК или Да/НЕ .
Дано има и други решения !!!
"OnShow" на формата ->
"
procedure TForm1.FormShow(Sender: TObject);
begin
SetWindowPos(Form1.Handle,
HWND_TOPMOST,
0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
end;
"
Ако има диалог с потребителя т.е. формата за съобщение до него е показана с "ShowModal" то тя ще е винаги най-отгоре на десктопа му докато не и отговори с ОК или Да/НЕ .
Дано има и други решения !!!
Редактирано от el_niqui на
Re: Проблем с " ShowModal "
Пробвай да викнеш Application.ProcessMessages точно преди MyForm.ShowModal. Това при мен помага. Проблема изниква когато има някакво забавяне в главния thread преди изобразяването на формата. След това тя се изобразява отдолу и не е модална. Незнайно за защо за мен, но Appication.ProcessMessages помага. Ако някой има повече инфо нека сподели.
За диалози не ползвай ShowMessage, а windows-кото API.
function MessageDlgEx(WindowHandle: HWND; Msg: String; DlgType: TMsgDlgType;
Buttons: Cardinal; Cap: String = '';
DefButton: Cardinal = MB_DEFBUTTON1): Word;
var
DlgParams: Cardinal;
begin
DlgParams := Buttons OR DefButton OR MB_TASKMODAL;
case DlgType of
mtWarning: begin
DlgParams := DlgParams OR MB_ICONWARNING;
end;
mtError: begin
DlgParams := DlgParams OR MB_ICONERROR;
end;
mtInformation: begin
DlgParams := DlgParams OR MB_ICONINFORMATION;
end;
mtConfirmation: begin
DlgParams := DlgParams OR MB_ICONQUESTION;
end;
mtCustom: begin
end;
end;// case DlgType
if Cap = '' then
Cap := Application.Title;
Result := Windows.MessageBox(WindowHandle, PChar(Msg), PChar(Cap), DlgParams);
end;
пример:
MessageDlgEx(Self.Handle, 'Hello', mtInformation, MB_OK);
За диалози не ползвай ShowMessage, а windows-кото API.
function MessageDlgEx(WindowHandle: HWND; Msg: String; DlgType: TMsgDlgType;
Buttons: Cardinal; Cap: String = '';
DefButton: Cardinal = MB_DEFBUTTON1): Word;
var
DlgParams: Cardinal;
begin
DlgParams := Buttons OR DefButton OR MB_TASKMODAL;
case DlgType of
mtWarning: begin
DlgParams := DlgParams OR MB_ICONWARNING;
end;
mtError: begin
DlgParams := DlgParams OR MB_ICONERROR;
end;
mtInformation: begin
DlgParams := DlgParams OR MB_ICONINFORMATION;
end;
mtConfirmation: begin
DlgParams := DlgParams OR MB_ICONQUESTION;
end;
mtCustom: begin
end;
end;// case DlgType
if Cap = '' then
Cap := Application.Title;
Result := Windows.MessageBox(WindowHandle, PChar(Msg), PChar(Cap), DlgParams);
end;
пример:
MessageDlgEx(Self.Handle, 'Hello', mtInformation, MB_OK);