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

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

Управление z-order окон


Страницы:   1 2

Чайник ©   (2012-02-21 19:16:00) 

Чувствую, что вопрос детский, но ответа не могу найти...
Итак, по ходу работы моё главное окно открывает несколько других окон (не MDI-приложение!). Все нормально, но главное окно почему-то всегда под "вторичными" окнами, даже когда активно.
Пробовал насильно перевести его наверх:

procedure TFMain.FormActivate(Sender: TObject);
var Hwn : HWND;
begin
  if BringWindowToTop(FMain.Handle) Then ShowMessage('Yesss!') Else ShowMessage('Ни фига');
end;


    вроде бы функция выполняется ('Yesss'), нона экране главное окно всё равно сидит под другими.

P.S. Пробовал через
SetWindowPos(FMain.Handle, HWND_TOP, Left, Top, Width, Height, SWP_SHOWWINDOW)
- то же самое.

Как сделать, чтобы главное окно, когда получает фокус, становилось поверх другиз окошек?


Чайник   (2012-02-22 16:14:00) [1]

Выкинул.
Мдя, вопрос, как оказалось, не совсем детский...


Плохиш   (2012-02-22 15:22:00) [2]


> Чайник ©   (22.02.12 13:22) [23]

Выкинь эту строчку нафик. Оно должно быть true, для описаного в [24] и в процессе начальной инициализации устанавливается в true.
Но если ещё и эту строку включить в проект, то там какой-то баг в обработке, который искать его создатели дальше не собираются или не в состоянии исправить :-(


Плохиш   (2012-02-22 15:07:00) [3]


> QAZ   (22.02.12 13:58) [24]
>
>
> >  Это известный баг новых версий
>
> это не баг,а наоборот его исправление

Ну да, одно исправили, другое покалечили.


QAZ   (2012-02-22 14:00:00) [4]


> QAZ   (22.02.12 13:58) [24]

плюс окна при минимизации не сворачиваюца а скрываюца и т.д.


QAZ   (2012-02-22 13:58:00) [5]


>  Это известный баг новых версий

это не баг,а наоборот его исправление
ибо в винде главное окно должно быть главным, а не порождением какогото application
и в висте\семерке это вылезло на поверхность, как невозможнось отобразить содержимое свернутого окна при наведении курсора на кнопку таскбара


Чайник   (2012-02-22 13:22:00) [6]


> Плохиш ©   (22.02.12 12:27) [20]
> > Ужос! Delphi 2010Открываешь файл проекта (dpr) и удаляешь
> там одну строчку, вроде первую после begin, с присвоением
> true, не помню какой переменной, а искать лень. Это известный
> баг новых версий, а создатели сказали "designed".PS. Здесь
> это тоже обсуждалось.


Уряяя! Заработало!!!

program MMLibrary;

uses
 Forms,
 UMain in 'Source\UMain.pas' {FMain},
 GlobalTypes in 'Source\GlobalTypes.pas' {Progress},
 MediaDB in 'Source\MediaDB.pas' {DataModule1: TDataModule},
 Options in 'Source\Options.pas' {FOptions},
 MediaLib in 'Source\MediaLib.pas' {FMedia},
 PlayList in 'Source\PlayList.pas' {FPlayList},
 Info in 'Source\Info.pas' {FInfoMedia};

{$R *.res}

begin
 Application.Initialize;
 Application.MainFormOnTaskbar := False; <<< Здесь было True
 Application.CreateForm(TFMain, FMain);
 Application.CreateForm(TProgress, Progress);
 Application.CreateForm(TDataModule1, DataModule1);
 Application.CreateForm(TFOptions, FOptions);
 Application.CreateForm(TFPlayList, FPlayList);
 Application.CreateForm(TFInfoMedia, FInfoMedia);
 Application.CreateForm(TFMedia, FMedia);
 Application.Run;

end.


Спасибо Плохишу!
(чувствовал. что решение где-то на поверхности...)


Плохиш   (2012-02-22 12:52:00) [7]


> sniknik ©   (22.02.12 12:43) [21]
>
> > то известный баг новых версий
> не такой уж и баг... никогда не боролся с западающим за
> главное окно сообщением типа "а для продолжения нажмите
> ok" ожидающим ввода, и соответственно "зависшим" основным?

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


sniknik   (2012-02-22 12:43:00) [8]

> то известный баг новых версий
не такой уж и баг... никогда не боролся с западающим за главное окно сообщением типа "а для продолжения нажмите ok" ожидающим ввода, и соответственно "зависшим" основным?

гораздо чаще бывает (было раза 3-4) чем нужда в том, чего желает автор этой ветки (имхо... ни разу не требовалось).
в общем не отказался бы от такого же поведения, гарантированного "незападения", в D7, т.к. пока вынужден писать на нем.


Плохиш   (2012-02-22 12:27:00) [9]


> Ужос! Delphi 2010

Открываешь файл проекта (dpr) и удаляешь там одну строчку, вроде первую после begin, с присвоением true, не помню какой переменной, а искать лень. Это известный баг новых версий, а создатели сказали "designed".
PS. Здесь это тоже обсуждалось.


QAZ   (2012-02-22 11:20:00) [10]


> никуда не тыкая запусти

никуда кроме visible=true в свойствах форм


QAZ   (2012-02-22 11:12:00) [11]


> Чайник ©   (22.02.12 01:48) [15]

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

а по поводу окон
создай новый проект,добавь 2 формы и больше никуда не тыкая запусти
посмотри что будет


Чайник   (2012-02-22 02:40:00) [12]


> Это не тестовый пример. Это ваша "выжимка", которая, как
> вы думаете способна что-то прояснить.


а там больше ничего и нет...


> Рекомендую к чтению: http://www.transl-gunsmoker.ru/2010/10/blog-
> post_25.html


Прочитал, спасибо.

Попробовал так:
во вторую форму в секцию паблик засунул процедуру:

procedure TFMedia.ForegroundWindow;
begin

IF SetForegroundWindow(FMain.Handle) Then Caption := 'Yess!' Else Caption := 'Ni hera!';
end;


а в главной форме в формактивайте поместил ее вызов:

procedure TFMain.FormActivate(Sender: TObject);
var Hwn : HWND;
begin
 FMedia.ForegroundWindow
end;


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


Германн   (2012-02-22 02:01:00) [13]


> Чайник ©   (22.02.12 01:48) [15]
>
>
> > Тестовый пример в студию!
>

Это не тестовый пример. Это ваша "выжимка", которая, как вы думаете способна что-то прояснить.

Но уже что-то более ясно. Рекомендую к чтению:
http://www.transl-gunsmoker.ru/2010/10/blog-post_25.html


Чайник   (2012-02-22 01:48:00) [14]


> Тестовый пример в студию!



type
 TmmlOptions = record
   ShowMedia, ShowPlayList, ShowInfo : Boolean;
 end;

{=== Обработчик нескольких пунктов MainMenu=================================}
procedure TFMain.mnShowWindowsClick(Sender: TObject);
begin
 (Sender as TMenuItem).Checked := not ((Sender as TMenuItem).Checked);
 mmOptions.ShowMedia := mnShowMedia.Checked;
 mmOptions.ShowPlayList := mnShowPlaylist.Checked;
 mmOptions.ShowInfo := mnShowInfo.Checked;
 UpdateWindows;
end;

{==========================================================}
procedure TFMain.UpdateWindows;
begin
 if Assigned(FMedia) then
    if mmOptions.ShowMedia then begin FMedia.Show end Else FMedia.Close;
 if Assigned(FPlayList) then
    if mmOptions.ShowPlayList then FPlayList.Show Else FPlayList.Close;
 if Assigned(FInfoMedia) then
    if mmOptions.ShowInfo then FInfoMedia.Show Else FInfoMedia.Close;

end;

Ну и собственно попытка выдвинуть главную форму на первое место:

{==========================================================}
procedure TFMain.FormActivate(Sender: TObject);
var Hwn : HWND;
begin
  if BringWindowToTop(FMain.Handle) Then ShowMessage('Yesss!') Else ShowMessage('Ни фига');

// Другой вариант:
//   if SetWindowPos(FMain.Handle, HWND_TOP, Left, Top, Width, Height, SWP_SHOWWINDOW) Then ShowMessage('Yesss!')
//   else ShowMessage('Ни фига!');

end;


Германн   (2012-02-22 01:04:00) [15]


> вроде бы функция выполняется ('Yesss'), нона экране главное
> окно всё равно сидит под другими.

Тестовый пример в студию!


QAZ   (2012-02-21 23:04:00) [16]


> Чайник ©   (21.02.12 22:50) [11]

это [10] был не совет, а вопрос

> в D7 никаких проблем

вот и я про то


sniknik   (2012-02-21 23:01:00) [17]

в D7 никаких проблем, даже с авто созданными формами...

а так если -  
procedure TForm1.Button1Click(Sender: TObject);
begin
 TForm.Create(nil).Show;
end;

???


Чайник   (2012-02-21 22:50:00) [18]


> а мошт все проще? понаставил у всех окон стиль выше всех
> и забыл?


Вы будете смеяться - те же яйца, только в профиль: главная форма все равно ниже порожденных, одна радость - они ВСЕ вместе ВЫШЕ всех остальных запущенных программ (включая дельфи)!


QAZ   (2012-02-21 22:45:00) [19]

а мошт все проще? понаставил у всех окон стиль выше всех и забыл?


Чайник   (2012-02-21 21:55:00) [20]


> когда тупо,тогда должно быть без проблемесли только в твоей
> версии дельфи не изменили чтото в плане Application что
> вполне вероятно для совместимости с аеро


Ужос! Delphi 2010
И чо то теперь делать?


Страницы:   1 2

Наверх

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