Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение ShowModal...


Страницы:   1 2

TheEd ©   (2009-06-17 17:21:00) 

Господа мастера, заметил одну странность:
из form1 вызываем form2.ShowModal.
form2 появляется, но на form 1 можно переключиться, правда первым кликом. Остальные клики приводят к звуку, определяющему что форма залочена. В результате приходится переключаться на это же приложение Alt+Tab'ом, тогда form2 опять выходит с задних слоёв...
Что то припоминаю раньше пока модальную форму не закроешь, на породившую переключаться не получалось.

зы:
form2 сделал StayOnTop, пытался перехватить message WM_ACTIVATE и сделать SetForeground.


TheEd   (2009-06-24 19:33:00) [1]

закономерность кстати обнаружилась, вернее условие при котором глюк возникает:
с дровави карты шли мульки (см. конец поста 17), которые в окно вставляют дополнительные кнопки (типа отправить на монитор 1(2), и т.д.), по-моему n-view зовётся. Когда пошарился в настройках и оключил эти мульки, глюка исчез.


Ганя   (2009-06-18 11:50:00) [2]

Это не виндовый косяк, а VCL-евский
бывает редко, воспроизводится сложно


Virgo_Style   (2009-06-18 11:42:00) [3]

Бывает. Как правило, проявляется, если программа открывает модальное окно, не будучи активной, или если после открытия модального окна переключиться на другую программу, а затем вернуться в свою.

Однако никаких закономерностей типа "делай раз, делай два, делай три - вот он, баг" выявить не удается. Может возникнуть, может не возникнуть.

Причем с "чужими", несамописными программами такой ерунды afair не случалось.


Игорь Шевченко   (2009-06-17 21:11:00) [4]

oldman ©   (17.06.09 20:32) [21]

Видишь ли, оконная подсистема - она беззащитная.
Зато быстрая


oldman   (2009-06-17 20:32:00) [5]


> Игорь Шевченко ©   (17.06.09 18:39) [20]


А у меня все равно не кликает.
Ты думаешь у них такая уж масса "глобальных хуков"? Бред!
Ошибка в 17-й строке, однозначно.


Игорь Шевченко   (2009-06-17 18:39:00) [6]


> процентов на 95 винаваты дрова видеокарты, не совсем корректно
> ведущие себя с окнами!


Я тебе открою страшный секрет - дрова видеокарты к окнам обычно отношения не имеют. Ни малейшего. К окнам имеют отношения всякие улучшайзеры, иногда они поставляются вместе с дровами производителями видеокарт.

Описанное поведение (вероятно) может наблюдаться, когда установлена масса глобальных хуков. Это предположение.


Игорь Шевченко   (2009-06-17 18:35:00) [7]


> гм. код простейший, и помнится раньше он не глючил:


описанный эффект на этомкоде не наблюдается.

Turbo delphi 2006 professional, все патчи


TheEd   (2009-06-17 18:34:00) [8]

Не утерпел, у коллеги проверил :)

Так вот - глюка нет!:|
процентов на 95 винаваты дрова видеокарты, не совсем корректно ведущие себя с окнами!


TheEd   (2009-06-17 18:28:00) [9]

гм. код простейший, и помнится раньше он не глючил:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 form2.ShowModal;
end;

end.

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons;

type
 TForm2 = class(TForm)
   Label1: TLabel;
   BitBtn1: TBitBtn;
 private
   { Private declarations }
 protected
   procedure OnActivate(var msg : TWMActivate); message WM_ACTIVATE;
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.OnActivate(var msg: TWMActivate);
begin
 inherited;
(*  if msg.Active = WA_INACTIVE then
   if Visible then
     SetForegroundWindow(Handle);
*)
end;

end.


OnActivate - так, эксперимент, можете не обращать внимания.

Так вот мысль: может дрова видеокарты виноваты - они много нового в поведение окон добавляют, напр. кнопки лишние втискивают в заголовки. Я уже замечал что к примеру в IBExpert эти кнопки расширяют дочерние окна на свою ширину и приходится "доставать" стандартные кнопки закрытия окна из за пределов экрана... :(

возьму пример домой, проверю, там видео-наворотов нет, скорее всего данной глюки не будет. Результат завтра изложу.


turbouser   (2009-06-17 18:03:00) [10]


> Игорь Шевченко ©   (17.06.09 18:00) [12]

Частенько обычное модальное окошко в мди приложении так зависает..
Какой тут код может быть? Просто диалог.. и все.. и висит..


Игорь Шевченко   (2009-06-17 18:03:00) [11]


> Везет :)


код-то будет ? Можно не код, можно ссылку на QC.

Что касается форматирования, то я не знаю, как там вызывается диалог, поэтому не могу судить.

Впрочем здесь есть автор вопроса, его наверняка не затруднит выложить


Игорь Шевченко   (2009-06-17 18:01:00) [12]


> который код


который год


turbouser   (2009-06-17 18:01:00) [13]


> Игорь Шевченко ©   (17.06.09 18:00) [12]

Везет :)


Игорь Шевченко   (2009-06-17 18:00:00) [14]

turbouser ©   (17.06.09 17:56) [9]

Под примером имеется в виду код. Чтобы его можно было скомпилировать, запустить и лично удостоверится в проблеме.
А то мы уже который код пишем приложения в том числе, с модальными окнами, и не знаем о проблеме. Обидно.


Германн   (2009-06-17 17:59:00) [15]


> Игорь Шевченко ©   (17.06.09 17:51) [8]

Кликом не встречал. А вот со случаями, когда модальная форма иногда оказывается сзади вызывающей встречался.


turbouser   (2009-06-17 17:58:00) [16]

Зная сию проблему стараюсь использовать messagedlg c mb_systemmodal
работает железно, может показаться неправильным, однакож альтернативы нет


turbouser   (2009-06-17 17:56:00) [17]


> Игорь Шевченко ©   (17.06.09 17:51) [8]

Попасть на вызывающую форму можно - нет проблем, только диалоговое
окно будет висеть в фоне и толку от этой самой вызывающей формы - 0
пример? да тот же delforexp - форматтер кода.
Если в пустом не сохраненном проекте вызвать диалог форматирования -
будет конфуз..


Игорь Шевченко   (2009-06-17 17:51:00) [18]

turbouser ©   (17.06.09 17:42) [7]

Пример для демонстрации, что после вызова ShowModal можно кликом попасть на вызывающую форму, не затруднит выложить ?

Windows XP, SP3 если что.

Ну или ссылку на QC, если известная проблема.


turbouser   (2009-06-17 17:42:00) [19]


> oldman ©   (17.06.09 17:40) [6]

ничего странного.
проявляется сей глюк через раз..
странно, что не сталкивались с таким..


oldman   (2009-06-17 17:40:00) [20]


> Игорь Шевченко ©   (17.06.09 17:31) [2]
> странно, я и первым не могу


И я не могу, что странно...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо