Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фокус перескакивает на другое окно, при вызове ShowModal  
:(
    Опции темы
Delphist
  Дата 11.1.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Есть главное окно, делаю так:
Код

TFormDoc = class(TForm)
...
procedure TMainForm.LoadDoc;
begin
//фокус стоит на MainForm
MainForm.Enabled := False;
try
  Dlg := TFormDoc.Create(Self); //вот здесь диал. окно инициализируется секунда 10-15, 
                                             //и пользователю для спокойствия выдается окно с TProgressBar'ом
  Dlg.ShowModal;
finally
  MainForm.Enabled := True;
  //фокус не попадается на MainForm, а переходит совершенно на другое окно
end;
end;

Можете возникнуть вопрос - зачем делаем Enabled := False; Enabled := True; 
ответ прост: дело в том, что MainForm имеет меню, а также панель инструмент
и вот когда идет загрузка TFormDoc не хочу, чтобы он имел возможность
кликать по ним.
Вопрос: как можно заблокировать на время загрузки FormDoc, но при этом,
чтобы фокус не терялся?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akella
Дата 11.1.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Delphist @  11.1.2011,  21:02 Найти цитируемый пост)
MainForm.Enabled := False;

а зачем это????

Добавлено @ 22:21
Цитата(Delphist @  11.1.2011,  21:02 Найти цитируемый пост)
 MainForm.Enabled := True;

и это?

Добавлено @ 22:22
я бы сделал примерно так
Код

Dlg := TFormDoc.Create(Self);
try
  Dlg.ShowModal;
finally
  FreeAndNil(Dlg); 
 end;

PM MAIL   Вверх
Delphist
Дата 11.1.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Akella @  11.1.2011,  23:21 Найти цитируемый пост)
а зачем это????
MainForm.Enabled := True;
и это?


Дело в том, что TFormDoc создается в MainForm при нажатии определенной кнопочки, а это я уже писал
Код

И MainForm имеет меню, а также панель инструментов.
И вот когда идет создание TFormDoc.Create не хочу, чтобы пользователь 
возможность кликать по панели инструментов и меню МainForm.
Вопрос: как можно заблокировать MainForm на время загрузки FormDoc, но при этом,
чтобы фокус не терялся? 


Это сообщение отредактировал(а) Delphist - 11.1.2011, 22:53


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
БелАмор
Дата 12.1.2011, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



Используйте TActionList и назначайте пунктам главного меню  и кнопкам панели инструментов не обработчики OnClick, а свойство Action.
Тогда кроме других приятностей появляется возможность централизованно управлять доступностью действий и можно написать примерно так:
Код

procedure TForm1.Action1Execute(Sender: TObject);
begin
  try
    ActionList1.State := asSuspended;
    with TForm2.Create(nil) do
    try
      ShowModal;
    finally
      Free;
    end;
  finally
    ActionList1.State := asNormal;
  end;
end;

PM   Вверх
Delphist
Дата 12.1.2011, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(БелАмор @  12.1.2011,  01:48 Найти цитируемый пост)
е обработчики OnClick, а свойство Action.

 smile , кх..кх  smile 

естественно я использую Action, 

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

Вопрос: Как заблокировать окно, а затем разблокировать, но чтобы фокус не потерялся

Это сообщение отредактировал(а) Delphist - 12.1.2011, 01:45


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akella
Дата 12.1.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Delphist @  11.1.2011,  22:48 Найти цитируемый пост)
И вот когда идет создание TFormDoc.Create не хочу, чтобы пользователь 
возможность кликать по панели инструментов и меню МainForm.

а что, создание формы так сильно затягивается?

Добавлено через 1 минуту и 30 секунд
Цитата(Delphist @  12.1.2011,  01:42 Найти цитируемый пост)
мне необходимо заблокировать все окно, потому что в окне грид, чтобы пользователь
не пытался по нему елозить, и что-нить открыть.

добавь ещё 2 строки кода
DataSet.DisableControls
и
DataSet.EnableControls
PM MAIL   Вверх
БелАмор
Дата 12.1.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



Цитата(Delphist @  12.1.2011,  01:42 Найти цитируемый пост)
естественно я использую Action, 

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

Ну, я основываюсь на той информации, которая была предоставлена в вопросе. А в вопросе было сказано про меню и панель инструментов...
Что касается запрета самой формы - лично мне этот вариант не нравится на интуитивном уровне. В этом случае будет закладка на поведение, которое может измениться как в следующих версиях Windows, так и в следующих версиях Delphi. Если бы эту задачу нужно было решать мне, то я, в дополнение к вышеприведённому коду, либо запрещал бы саму грид, либо панель, на которой лежит грид и всё остальное. Плюс, если такой трюк используется больше, чем в одном месте, вынес бы по две строчки в методы формы вроде DisableAll/EnableAll.

Цитата(Akella @  12.1.2011,  09:59 Найти цитируемый пост)
добавь ещё 2 строки кода
DataSet.DisableControls
и
DataSet.EnableControls 

На мой взгляд, это чересчур сурово. В модальной форме могут понадобиться, например, DataAware-контролы... Плюс вложенность DisableControls/EnableControls, отключение Master-Detail и т.д.

Это сообщение отредактировал(а) БелАмор - 12.1.2011, 12:27
PM   Вверх
Akella
Дата 12.1.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Ну заблокируешь ты форму, а если пользователь нажмёт на горячую клавишу?

Добавлено через 1 минуту и 8 секунд
Цитата(БелАмор @  12.1.2011,  12:09 Найти цитируемый пост)
На мой взгляд, это чересчур сурово. В модальной форме могут понадобиться, например, DataAware-контролы... Плюс вложенность DisableControls/EnableControls, отключение Master-Detail и т.д.


это чтобы не блокировать всю форму, а только гри, привязанный к набору данных, ведь:

Цитата(Delphist @  12.1.2011,  01:42 Найти цитируемый пост)
 в окне грид, чтобы пользователь
не пытался по нему елозить, и что-нить открыть.


PM MAIL   Вверх
Delphist
Дата 12.1.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(БелАмор @  12.1.2011,  13:09 Найти цитируемый пост)
Ну, я основываюсь на той информации, которая была предоставлена в вопросе. А в вопросе было сказано про меню и панель инструментов...

Я не стал все описать, а сказал кратко как заблокировать окно - значит на это была надобоность


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.