Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Управление 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.067 c
15-1348514300
Дмитрий С
2012-09-24 23:18
2013.03.22
Маленькая игра для уничтожения клавиатуры :)


2-1328784120
ds
2012-02-09 14:42
2013.03.22
DbGrid программная очистка ячейки


15-1328614695
Ptr
2012-02-07 15:38
2013.03.22
Посоветуйте литературу по JavaScript.


15-1350641276
Ega23
2012-10-19 14:07
2013.03.22
А вот вам, пятничная задачка


15-1332788348
IceKhan
2012-03-26 22:59
2013.03.22
как включить отображение системных файлов в OpenDialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский