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

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

ЗаDisabl'ить все формы кроме одной


TUserClass ©   (2008-05-29 10:38:00) 

Доброе всем утро...Встала такая проблема...есть функция вызывающая окошко диалога (с кнопками типа "Да", "Нет", "Отмена"). В функции вызова есть кусок кода:

 If Form.ShowModal = mrOK then begin
   Value := cmResult;
 end;


Но дело в том, что при "показывании" данного окна Disabl'ится только та форма, из unita которого была вызвана сия функция. Встает вопрос: как бы задисаблить все формы проги при вызове этой функции, а по закрытию этого, не побоюсь этого слова, модального окна, все формы снова приобретали значение Enabled = true; ?

Вот принтскрин описанного выше http://img100.imageshack.us/img100/2536/delphims1.jpg


TUserClass   (2008-05-29 12:49:00) [1]

{RASkov}, спасибо ... реально выручил ... поток продолжает выполняЦа после PostMessag'а, как и было задуманно. :)


{RASkov}   (2008-05-29 12:36:00) [2]

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

const MY_MES = WM_USER+1;

type
 TThr = class(TThread)
 public
   FHWND: THandle;
   procedure Execute; override;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   procedure My_Message(var Mes: TMessage); message MY_MES;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
{ TForm1 }
procedure TForm1.My_Message(var Mes: TMessage);
begin
 case Mes.WParam of
  0: ShowMessage('Передали "ноль"');
  1: Application.Minimize;
  2: ShowMessage('Hello from thread');
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(Handle, MY_MES, 0, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 PostMessage(Handle, MY_MES, 1, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 with TThr.Create(True) do begin
  FHWND:=Self.Handle;
  FreeOnTerminate:=True;
  Resume;
 end;
end;
{ TThr }
procedure TThr.Execute;
begin
 inherited;
 PostMessage(FHWND, MY_MES, 2, 0);
end;

end.


TUserClass   (2008-05-29 11:48:00) [3]


> {RASkov} ©   (29.05.08 11:44) [9]


Ух ... вот чем не умею пользовацо, так это PostMessage'ом ... Вот как бы мне послать MainForm'у сообщение вызвать процедуру типа такой:

CuteMessage.Show ('Ошибка', ' Вы получили следующие ошибки:' + #13 + ErrorMessage, [cmOK], Res, b_Exit, MainForm.msgim_Error.Picture.Bitmap);


{RASkov}   (2008-05-29 11:44:00) [4]

> [8] TUserClass   (29.05.08 11:28)

Кстати, я сейчас "пробегся по инету", и натыкался на такой совет:
Модальную форму вызывай из основного потока, а не из доп, как ты сейчас делаешь....
Из доп. потока шли сообщение основной форме(PostMessage)... и там уже вызывай диалог...


TUserClass   (2008-05-29 11:28:00) [5]


> {RASkov} ©   (29.05.08 11:20) [7]


Мда...о модальности в потоках особо ничего не нашел ... но вроде проблема решилась путем использования в потоке процедуры Synchronize. Продолжаю тестировать :)


{RASkov}   (2008-05-29 11:20:00) [6]

> Может окна не "блочаться" потому что эта ф-ция вызывается
> из отдельного Thread'а, может быть такое?

Эх потоки.... потоки..
Скорее всего в этом и дело, да и не скорее, а в этом и дело ....наверное :)
Я с потоками в плотную не возился, т.е. знаю поверхностно, но не тонкости...
Найди в инете и почитай что-нибудь о модальности и потоках.... Потом расскажешь сам тут)

> Да что это за "ошибка в 17 строке" ?

Это абстрактное выражение.... т.е. № строки взят "от балды", дабы превратить в стабильное выражение...
Означает, что в коде содержится либо синтаксическая, либо логическая ошибка - но место ошибки сказать невозможно, из-за недостаточной информации...


TUserClass   (2008-05-29 11:08:00) [7]


> {RASkov} ©   (29.05.08 11:04) [5]


1. fsStayOnTop - ни у одной формы не стоит.
2. Да что это за "ошибка в 17 строке" ? - везде вижу это выражение и никак не допру что это такое :)
3. А скрин.формс - просто никогда раньше не использовал, поэтому решил уточнить :)


{RASkov}   (2008-05-29 11:04:00) [8]

> [3] TUserClass   (29.05.08 11:00)
> Вот он скрин, который наглядно опровергает все мои логические догадки:

Подозреваю, что.... во первых у тебя там СтэйОнТопы понавыставлены везде, во вторых, и главных, ошибка в 17 строке.... т.е. алгоритм работы программы в целом - хромает.

> А Screen.Forms - это список всех форм моего приложения или как?

Если не веришь участникам форума, нажми F1.....


TUserClass   (2008-05-29 11:02:00) [9]

Может окна не "блочаться" потому что эта ф-ция вызывается из отдельного Thread'а, может быть такое?


TUserClass   (2008-05-29 11:00:00) [10]


> {RASkov} ©   (29.05.08 10:53) [1]


Показывается модально, но как я уже написал, почему то дисаблиЦа только форма, вызвавшая эту функцию...А ежели ф-ция вызвана, например, скрытой формой, то видимые в данный момент формы спокойно перекрывают это самое модальное окошко при, напрмер, клике на них

А Screen.Forms - это список всех форм моего приложения или как?


> clickmaker ©   (29.05.08 10:54) [2]


Вот он скрин, который наглядно опровергает все мои логические догадки:

http://img230.imageshack.us/img230/2038/delphi2ux9.jpg


clickmaker   (2008-05-29 10:54:00) [11]

> при "показывании" данного окна Disabl'ится только та форма,
> из unita которого была вызвана сия функция

неправда. При показе модального окна все остальные недоступны


{RASkov}   (2008-05-29 10:53:00) [12]

Дык модально же она у тебя показывается, что тебе еще нужно-то?
В прочем есть список форм (Screen.Forms).... Можно бегать по нему(списку), и делать с каждой формой все, что захочешь...


Наверх

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