Форум: "Начинающим";
Текущий архив: 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