![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление z-order окон
Чайник © (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
И чо то теперь делать?