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

Вниз

Формочки... Много формочек!!!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-82386
Карелин Артем
2003-09-05 11:13
2003.09.25
Посоветуйте модем.


3-82115
AlexPul
2003-09-04 15:31
2003.09.25
Автоматическое обновление таблиц Interbase


8-82342
Intell
2003-05-27 09:17
2003.09.25
Как в TMediaPlayer.filename присвоить Wave из ресурса?


3-82131
ДмирийК
2003-09-05 23:53
2003.09.25
Как повысить скорость?


14-82466
MsGuns
2003-09-01 20:40
2003.09.25
Голосуем за партию дельфинов