Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизФормочки... Много формочек!!! Найти похожие ветки
← →
XopoSHiy (2003-09-11 19:41) [0]Hi All,
Возникла такая проблема.
Есть главная alwaysOnTop форма. Hа ней кнопочки, которые показывают разные другие формы. Допустим открыта главная форма и еще парочка других. Тогда при попытке перетащить главную форму, все остальные появляются на переднем плане, даже если они не были активны.
А мне хочется, чтобы если неглавное окошко было где-то позади других окон (не моего приложения), то при активаци главной формы вперед вылезало ТОЛЬКО главное окошко. Остальные чтоб где были, там и оставались.
Вот убился уже - не понимаю как это сделать. Перекопал все исходники VCL так и не понял :(
Может кто уже сталкивался - помогите....
← →
Андрей Сенченко (2003-09-11 20:41) [1]Ну дык ... убей Form N.Create из кода application и делай его по нажатию кнопки.
Память опять же сэкономишь.
← →
XopoSHiy (2003-09-11 21:45) [2]Совершенно очевидно, что я это уже попробовал, перед тем как в форум писать ;)
Разницы нет!
Я даже больше скажу. Я засёк какие мессаги приходят в WndProc "неглавной" формы, при активации главной формы. И отрубил их все! Так вот окошко перестало рисоваться нормально(WM_NCPAINT я тоже отрубил :), но все равно появляется (его становится видно, например, когда мышкой поводишь по тому месту где форма должна быть.
Так что появляется "неглавная" формочка НЕ в результате получения какого-либо сообщения :(
Куда дальше копать даже и не знаю...
← →
Андрей Сенченко (2003-09-11 21:56) [3]вот не нужно лазать слишком глубоко, если не уверен к чему это приведет.
Еще раз.
При добавлении формы ( юнита ) в проект Дельфя атоматом добавляет вот сюда :
program nnn;
uses
Forms,
nnn1 in "nnn1.pas" {FmMain},
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TFmMain, FmMain);
Application.Run;
end.
еще один
Application.CreateForm(TFmMain, FmMain);
Достаточно убрать эту процедуру на кнопку ( или какое то иное событие ее вызова ) и эта форма перестанет создаваться при старте.
Безусловно необходимо делать ей Free в момент выхода из нее.
Есть конечно вариант, что вопрос был задан не совсем корректно.
← →
XopoSHiy (2003-09-12 06:00) [4]Я понял ;)
Видимо действительно я не совсем понятно выразился.
Еще разик:
У меня открыто две формы. Form1 и Form2 моего приложения. Form1 - главная форма. Открываем notepad, так, чтобы он загородил Form2. Теперь щелкаем по главной форме Form1. И наблюдаем, как вместе с Form1 на передний план (поверх notepad-а) вылезает также и Form2.
Вопрос: Как сделать так, чтобы в подобной ситуации вперед вылезала только та форма, по которой я щелкнул мышью, а все остальные оставались на заднем плане.
Hint: предложенный способ создания формы я испробовал первым же делом. Он не дает желаемого результата. То есть все формы лезут вперед разом, при активации хотя бы одной.
← →
XopoSHiy (2003-09-12 09:44) [5]Ну, что? Неужели никто не сталкивался с такой же проблемой?
ап!
← →
AGGRESSOR (2003-09-12 10:20) [6]Если это уж такая проблема- схитри. Отправляй свою вторую форму на задний план по хендлеру при активации главной формы :)
← →
XopoSHiy (2003-09-12 10:43) [7]Ну да.
Осталось только научится поределять, на каком месте вторая форма была до активации первой, и научится "отправлять на задний план" в точности в то место, где она была до активации основного... По-моему эта задачка еще покруче, чем первоначальная ;)
← →
Vlad (2003-09-12 10:50) [8]Попробуй при создании формы Form2, в качестве owner дать Application или nil
← →
XopoSHiy (2003-09-12 11:15) [9]Пробовал :) Эффект нулевой. Все как прежде.
← →
Плохиш_ (2003-09-12 11:25) [10]2XopoSHiy (12.09.03 06:00) [4]
Вообще-то, на передний план (поверх notepad-а) вылезает не форма, а приложение со всеми принадлежащими ему формами
Надеюсь так понятно?
А для твоей проблемы: минимизируй ненужные формы
← →
XopoSHiy (2003-09-12 12:53) [11]Больше всего я боялся, что мне ответят именно так :\
После небольшого расследования получилось вот что.
Окошки вылазят на передний план после того как Application в своем обработчике WndProc обрабатывает сообщение WM_WINDOWPOSCHANGING. Причем обрабатывает он его не сам, а передает некоему обработчику по умолчанию вот таким образом:
Result := DefWindowProc(FHandle, Msg, WParam, LParam);
А эта функция в свою очередь определена в модуле Windows.pas так:
function DefWindowProc; external user32 name "DefWindowProcA";
Так что, имхо, тупик.
С другой стороны совершенно не понятно, как этот самый DefWindowProc узнает о существовании всех моих остальных форм! Также следствие показало, что при вызове функции
function SetForegroundWindow; external user32 name "SetForegroundWindow";
с хэндлом главной или неглавной формочки, вытаскивает на передний план ВСЕ открытые формы приложения. :(
Так что я с чистым сердцем ставлю крест на этой затее.
Но если кто-то найдет выход - сообщите :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c