Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как убрать у окна свойство StayOnTop?


Автор: Нитонисе 15.11.2011, 16:19
Программа имеет несколько окон. Есть главное окно из которого можно показать любое второстепенное окно. При этом второстепенные окна перекрывают главное, хотя у них StayOnTop = false. Как убрать этот эффект? Я хочу чтобы при выборе главного окна - производные прятались за ним.

Автор: sawfish 15.11.2011, 20:07
Цитата

Я хочу чтобы при выборе главного окна

Как вы это делаете, если фокус ввода на второстепенной форме?

Автор: Нитонисе 15.11.2011, 21:40
Цитата(sawfish @  15.11.2011,  20:07 Найти цитируемый пост)
Как вы это делаете, если фокус ввода на второстепенной форме?

Так я активирую главную форму, кликом по ней. При этом та ее часть, которая была под второстепенной формой, там же и осталась. То есть главное окно не перекрыло второстепенное. Такое поведение было бы понятным, если бы у второстепенной формы было StayOnTop = true, но там установлено false.

Автор: sawfish 16.11.2011, 07:44
При получении главной формой фокуса ввода делать Close второстепенной форме.

Автор: Нитонисе 16.11.2011, 09:18
Цитата(sawfish @  16.11.2011,  07:44 Найти цитируемый пост)
При получении главной формой фокуса ввода делать Close второстепенной форме.

Ну так конечно можно делать, но не хотелось бы. Я хочу чтобы при активации любого окна программы оно перекрывало все остальные.
Тут вот еще какая странность. Я ставлю StayOnTop главной формы true, но оно все равно всегда находится под остальными второстепенными.

Автор: xvr 16.11.2011, 14:37
Цитата(Нитонисе @  15.11.2011,  16:19 Найти цитируемый пост)
При этом второстепенные окна перекрывают главное, 

Вы эти второстепенные окна делали динамически? Если да, то не передали ли им в конструктор this в качестве параметра? Если да, то поменяйте на NULL.

Автор: Нитонисе 16.11.2011, 16:04
Цитата(xvr @  16.11.2011,  14:37 Найти цитируемый пост)
Вы эти второстепенные окна делали динамически? Если да, то не передали ли им в конструктор this в качестве параметра? Если да, то поменяйте на NULL.

Все формы у меня автоматически создаются вместе с главной. Только у главной Visible = true, а увсех остальных - false.
Показываю окна командой Form1->Show().

Автор: xvr 16.11.2011, 18:32
Цитата(Нитонисе @  16.11.2011,  16:04 Найти цитируемый пост)
Все формы у меня автоматически создаются вместе с главной. 
Показываю окна командой Form1->Show().

Тогда такого эффекта быть не должно. Покажите исходники

Автор: Нитонисе 16.11.2011, 18:42
Цитата(xvr @  16.11.2011,  18:32 Найти цитируемый пост)
Тогда такого эффекта быть не должно. Покажите исходники

Они очень объемные, врядли там можно разобраться.
Вот главный файл:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("uMaterial.cpp", fMaterial);
USEFORM("uMain.cpp", fMain);
USEFORM("uSheme.cpp", fSheme);
USEFORM("uTemplate.cpp", fTemplate);
USEFORM("uSortament.cpp", fSortament);
USEFORM("uLoad.cpp", fLoad);
USEFORM("uLVL.cpp", fLVL);
USEFORM("uSnow.cpp", fSnow);
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->CreateForm(__classid(TfMain), &fMain);
        Application->CreateForm(__classid(TfSheme), &fSheme);
        Application->CreateForm(__classid(TfLoad), &fLoad);
        Application->CreateForm(__classid(TfTemplate), &fTemplate);
        Application->CreateForm(__classid(TfSortament), &fSortament);
        Application->CreateForm(__classid(TfLVL), &fLVL);
        Application->CreateForm(__classid(TfMaterial), &fMaterial);
        Application->CreateForm(__classid(TfSnow), &fSnow);
        Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    catch (...)
    {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
    return 0;
}
//---------------------------------------------------------------------------


Все формы запускаются одной и той же командой Show() из главной формы.

У меня тут еще одна неприятная проблема, может косвенно с этой связана. Одна из форм (fSheme) не отображается в редакторе. То есть я не могу ее отредактировать. Файлы *.cpp и *.h открываются, но по отдельности. Во время выполнения форма открывается как надо. Чтобы внести изменения в эту форму, я удаляю ее из проекта, создаю новую, копирую туда все компоненты с удаленной формы, заменяю файлы *.cpp и *.h, назначаю обработчики событий. Теперь можно редактировать форму в редакторе. Но стоит закрыть программу (RAD Studio XE) и открыть ее снова - с формой fSheme та же беда - она не открывается в редакторе.

Автор: sawfish 16.11.2011, 18:43
Свойство StayOnTop определяет взаимодействие формы с другими прложениями. Т.е. внутри приложения не важно, какая форма самая топовая, важно, что если у главной формы приложения выставлено StayOnTop, то она будет всегда поверх других запущенных приложений. А уже внутри приложения вам нужно "рулить" формами самому, а не полагаться на StayOnTop.

Автор: Нитонисе 16.11.2011, 18:50
Цитата(sawfish @  16.11.2011,  18:43 Найти цитируемый пост)
А уже внутри приложения вам нужно "рулить" формами самому, а не полагаться на StayOnTop.

И как заставить главную форму перекрыть второстепенную?

Автор: sawfish 16.11.2011, 18:59
Цитата

При получении главной формой фокуса ввода делать Close второстепенной форме.

Я другого метода не знаю. А чем плохо-то? На формах (второстепенных) ничего не меняется и не сбрасывается, просто они "убираются" с экрана. Точно так же их потом вызовите методом Show и всё.

Автор: Нитонисе 16.11.2011, 19:10
Цитата(sawfish @  16.11.2011,  18:59 Найти цитируемый пост)
Я другого метода не знаю. А чем плохо-то? На формах (второстепенных) ничего не меняется и не сбрасывается, просто они "убираются" с экрана.

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

Автор: sawfish 16.11.2011, 19:21
Раньше шла речь о перекрытии:
Цитата

И как заставить главную форму перекрыть второстепенную? 

А если нужно две рядом, тогда и размещайте рядом. Что мешает задать форме другие координаты, нужно будет пользователю - он подвинет/перетащит, как ему нужно.
Например, переключились на главную, а второстепенную перемещаете под/над/слева/справа от параметров, которые более детально задаются/отображаются во второстепенной.
ИМХО

Автор: Нитонисе 16.11.2011, 19:37
Это неудобно. Мне нужно чтобы активная форма всегда перекрывала все остальные, но при этом не надо чтобы все остальные закрывались. Например я открыл главную форму. Запустил второстепенную. Активировал главную и оттащил в угол. Подвинул второстепенную, чтобы не мешали друг другу. Затем развернул главную на весь экран - при этом второстепенныя скрылась под ней.
То есть обычное поведение окон.

Автор: sawfish 16.11.2011, 19:49
При разворачивании главной формы на весь экран нужно будет либо закрывать второстепенные, либо выносить их за пределы экрана (задавая координаты). Соответственно, при сворачивании их либо открывать, либо возвращать на прежнее место.

В общем, "сама-сама-сама" (С) "Вокзал для двоих"

Автор: sawfish 16.11.2011, 20:11
Нда, а Builder 6 StayOnTop работает так, как вам нужно...
А вот в XE такая бодяга.

Может, кто из гуру подскажет, где тут собака порылась.

Автор: Нитонисе 16.11.2011, 20:13
Так и у меня должно все работать как надо, это я просто где-то что-то подкрутил, сам не ведая того  smile  вот и проблема с тем, что одну из форм в редакторе открыть не могу видимо из этой же оперы.

Автор: sawfish 16.11.2011, 20:20
Нет, у меня ничего не "подкручено" в XE, а результат тот же. Он, видать, "сам себе режиссер".

Автор: Нитонисе 16.11.2011, 20:41
Действительно  smile  Не ожидал такой засады. Ну тогда гуру точно должны знать в чем там дело, раз это встроенный "косяк".

Автор: Нитонисе 16.11.2011, 20:57
Нашел в чем проблема. Оказывается головной *.cpp файл Билдера XE отличается от Билдера 6 наличием такой строчки 
Код

Application->MainFormOnTaskBar = true;

Не совсем понимаю что она означает, но если ее убрать, то формы перекрывают друг друга при активации, как мне и нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)