Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > активность главной формы


Автор: santilaas 26.10.2007, 10:29
вопрос такой: 
как сделать, чтобы главная форма была всегда активной независимо от других форм.
Заранее спасибо 

Автор: Alix 26.10.2007, 10:37
Не знаю зачем это надо, но попробуй делать MDI-форму... Или вызывать другие формы через Show, а не ShowModal.
А вообще поведай, зачем это?

Автор: Rennigth 26.10.2007, 10:48
santilaas, Может StayOnTop имеется в виду?

Автор: santilaas 26.10.2007, 16:06
нет, на самом деле у меня и так MDI-приложение, и относительно дочерних форм, моя главная форма
всегда активна, НО есть normal-форма, которая может быть открыта как на главной форме, так и вне её, - так вот - нужно чтобы, когда эта форма становится активной, активность с главной формы не пропадала. - помню, где-то раньше видел ответ на подобный вопрос, но найти не смог 

Автор: santilaas 6.11.2007, 08:29
 smile 

Автор: Alexeis 6.11.2007, 10:24
santilaas, у контрола активной формы есть фокус ввода. Фокус ввода не может быть у 2х контролов одновременно, отсюда вывод, что такое не возможно. Можно сделать лишь эмуляцию такого эффекта. Вообще, не ясна суть вопроса.

Автор: santilaas 6.11.2007, 17:49
Цитата
Вообще, не ясна суть вопроса
 - просто другими словами нужно, чтобы у главного окна, даже при потере им фокуса, заголовок был таким же цветом как и у активного окна, т.е. содать видимость того, что оно активно 
отсюда 
Цитата

Можно сделать лишь эмуляцию такого эффекта
 - как такое сделать?

Автор: ama_kid 7.11.2007, 16:50
Цитата(santilaas @  6.11.2007,  17:49 Найти цитируемый пост)
нужно, чтобы у главного окна, даже при потере им фокуса, заголовок был таким же цветом как и у активного окна, т.е. содать видимость того, что оно активно
Цитата(santilaas @  6.11.2007,  17:49 Найти цитируемый пост)
как такое сделать?
Ну, к примеру можно так:
Код
type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMNCActivate(var Message: TWMNCActivate); message WM_NCACTIVATE;
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
  public
    { Public declarations }
  end;
implementation

{$R *.dfm}

procedure TForm1.WMNCActivate(var Message: TWMNCActivate);
begin
 Message.Active:=true;
 inherited;
end;

procedure TForm1.WMNCPaint(var Message: TWMNCPaint);
begin
 inherited;
 Perform(WM_NCACTIVATE,0,0);
end;
end.

Автор: Rennigth 7.11.2007, 17:08
ama_kid, А фокус у контролов других окон не пропадет?  smile Что мне такой это не очень нравиться... Лутше уж сваять этому окну свой заголовок который будет независимо от того активно оно или нет выглядеть как активное.

Автор: ama_kid 7.11.2007, 18:09
Rennigth, у меня вродь ничо не пропадает... В этом коде ведь с фокусом не производится операций... А вообще, я и не говорю, что все это правильно; если честно, я вообще не понимаю зачем это надо...  smile 
Цитата(Rennigth @  7.11.2007,  17:08 Найти цитируемый пост)
Лутше уж сваять этому окну свой заголовок который будет независимо от того активно оно или нет выглядеть как активное
Ога, пытался я как-то такое организовать - кода получилось больше чем самой функциональной части программы, да к тому же зависело очень сильно от смены тем в системе, в итоге - забил на это дело... smile 

Автор: Rennigth 7.11.2007, 19:03
Цитата(ama_kid @  7.11.2007,  18:09 Найти цитируемый пост)
Ога, пытался я как-то такое организовать - кода получилось больше чем самой функциональной части программы, да к тому же зависело очень сильно от смены тем в системе, в итоге - забил на это дело... 

А если делать еще и под висту...  smile  smile

Автор: santilaas 8.11.2007, 17:50
Цитата
Ну, к примеру можно так: 

- ama_kid, спасибо большое - вроде то, что нужно, но у меня небольшой вопросик: а если нужно сделать, чтобы главная форма была визуально активной только в том случае, если в данный момент открыта (имеет фокус) строго определенная normal-форма, а иначе, чтобы главная  форма вела себя как обычно (стандартным образом)?

Автор: Rennigth 8.11.2007, 18:00
Цитата(santilaas @  8.11.2007,  17:50 Найти цитируемый пост)
чтобы главная форма была визуально активной только в том случае, если в данный момент открыта (имеет фокус) строго определенная normal-форма, а иначе, чтобы главная  форма вела себя как обычно (стандартным образом)? 

включаем телепатические способности... пытаемся понять что автор хотел сказать... smile

наверно имеется ввиду это?

Код

procedure TForm1.WMNCPaint(var Message: TWMNCPaint);
begin
  inherited;
  if Assigned(NormalForm) and  NormalForm.Visible and (NormalForm.FormStyle = fsNormal) then
    Perform(WM_NCACTIVATE,0,0);
end;




Автор: ama_kid 8.11.2007, 18:01
santilaas, ну тогда громозди условия на операнды Message.Active:=true; и Perform(WM_NCACTIVATE,0,0);

Добавлено через 53 секунды
Примерно как показал Rennigth

Автор: Alix 8.11.2007, 18:56
Возможно не прав, сейчас точно не помню. Но стиль окна WS_POPUP не за это ли отвечает?

Автор: santilaas 9.11.2007, 17:22
в общем в итоге получилось так (процедуры WMNCPaint даже не потребовалось):
Код

private
   procedure WMNCActivate(var Message: TWMNCActivate); message WM_NCACTIVATE;
...
procedure TFMain.WMNCActivate(var Message: TWMNCActivate);
begin
   //если форма "FPopup" показана, тогда главная форма визуально активна
   //иначе главная форма ведет себя стандартным образом
   if FPopup.Showing then
      Message.Active:=true;
   inherited;
end;


так что ama_kid, получай прибавку
Всем остальных большое спасибо!








Автор: ama_kid 9.11.2007, 17:50
Цитата(santilaas @  9.11.2007,  17:22 Найти цитируемый пост)
процедуры WMNCPaint даже не потребовалось
Попробуй в режиме показа normal-окна перекрыть заголовок главного окна(который должен быть "всегда активным") каким-нибудь третьим окном и потом оттащи его обратно - та часть, которую ты перекроешь, опять приобретет задизейбленный (серый) цвет - для предотвращения этого WM_NCPAINT и был собсно предназначен  smile 

Автор: santilaas 11.11.2007, 15:47
Цитата
Цитата(santilaas @  9.11.2007,  17:22 ) 
процедуры WMNCPaint даже не потребовалось 

Попробуй в режиме показа normal-окна перекрыть заголовок главного окна(который должен быть "всегда активным") каким-нибудь третьим окном и потом оттащи его обратно - та часть, которую ты перекроешь, опять приобретет задизейбленный (серый) цвет - для предотвращения этого WM_NCPAINT и был собсно предназначен

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)