Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Управление z-order окон   Найти похожие ветки 

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

Чувствую, что вопрос детский, но ответа не могу найти...
Итак, по ходу работы моё главное окно открывает несколько других окон (не 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)
- то же самое.

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


 
sniknik ©   (2012-02-21 20:13) [1]

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.Show;
end;


 
Чайник ©   (2012-02-21 21:02) [2]

To sniknik

Я, видимо плохо объяснил.
У меня так окна и вызываются - Form2.Show; Form3.Show; и т.д.
Проблема в том, что когда они все показаны главное окно находится ПОД ними, даже если оно с фокусом.


 
QAZ   (2012-02-21 21:04) [3]

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


 
Чайник ©   (2012-02-21 21:13) [4]


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


Аааа, спасибо! А можно чуть поподробнее? Во-первых, как это сделать. А во-вторых, сейчас, когда я закрываю главное окно, все порожденные тоже закрываются. Если родитель будет Application - оно будет само убираться, или это я должен буду позаботиться?


 
QAZ   (2012-02-21 21:20) [5]

а как ты их создаеш?


 
Чайник ©   (2012-02-21 21:25) [6]


> а как ты их создаеш?


Тупо : Auto-create form


 
Чайник ©   (2012-02-21 21:34) [7]

Еще раз повторюсь - у мена НЕ MDI приложение. Все вторичные формы ложатся на десктор (т.е. не внутри главной формы). Проблема в том, что главная форма всегда ВНИЗУ

http://imageshack.us/photo/my-images/52/coreloz.jpg/


 
QAZ   (2012-02-21 21:51) [8]

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


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


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


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


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

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


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


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


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


 
sniknik ©   (2012-02-21 23:01) [12]

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

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

???


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


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

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

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

вот и я про то


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


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

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


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


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



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 02:01) [16]


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

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

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


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


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


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


> Рекомендую к чтению: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 проходит успешно, только ничего не меняется - как была вторая форма поверх главной, так и осталась.


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


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

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

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


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


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

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


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


> Ужос! Delphi 2010

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


 
sniknik ©   (2012-02-22 12:43) [21]

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

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


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


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

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


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


> Плохиш ©   (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.


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


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


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

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


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


> QAZ   (22.02.12 13:58) [24]

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


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


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

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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.051 c
11-1245312300
QAZ
2009-06-18 12:05
2013.03.22
Applet


15-1344959281
Рекрут
2012-08-14 19:48
2013.03.22
Что должен уметь сисадмин?


8-1230109371
Вера
2008-12-24 12:02
2013.03.22
графика


2-1339663763
Zheksonz
2012-06-14 12:49
2013.03.22
Не могу найти три отличия в коде


15-1337160836
Инокентий
2012-05-16 13:33
2013.03.22
Как получить почту с гугла 3 людям?