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

Вниз

Не модальная форма без фокуса   Найти похожие ветки 

 
kichrot ©   (2007-03-02 15:39) [0]

Если форма (не главная) создается автоматически на этапе запуска программы (т.е. ее создание задано в свойствах проекта) и свойство Visible = False , то при применении:

Form2.Form.Visible := True;

форма становится видимой и фокус ей не передается. Это положение меня устраивает. Не устраивает лишь факт, что форма (которая используется в качестве сигнализации) постоянно висит в памяти.
При изменении настроек проекта и создании формы через код, после применения:

Form2.Form.Visible := True;

форма становится видимой, но ей еще передается фокус, что меня совершенно не устраивает.

В чем разница и как реализовать, что бы во втором случае форма не получала фокус.


 
Vladimir Kladov   (2007-03-02 18:26) [1]

API не отменяется, Handle у окна есть. ShowWindow( ..., SW_SHOW or SW_NOACTIVATE );

Что значит форма висит в памяти? Нешто она занимает так много памяти? Одна форма? На ней 10000 контролов? В машине < 4M оперативки?

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


 
kichrot ©   (2007-03-03 10:39) [2]


> API не отменяется, Handle у окна есть. ShowWindow( ...,
> SW_SHOW or SW_NOACTIVATE );
>
> Что значит форма висит в памяти? Нешто она занимает так
> много памяти? Одна форма? На ней 10000 контролов? В машине
> < 4M оперативки?
>
> Имеет смысл откладывать на будущее, до первого вызова, создание
> форм, когда их много. Но не имеет смысла каждый раз убивать
> и создавать форму только ради экономии. Я еще признаю такой
> метод в качестве ленивого способа сброса всех состояний.
>  Но тогда надо обеспечивать, чтобы в следующий раз она восстановила
> свое местоположение на экране, хотя бы, а это еще ленивей


Спасибо за ответ. Очень приятно, что на данной ветке форума всегда хоть, что-то да ответят, в отличие от других веток на данном форуме.

Я програмист-дилетант, хотя и с достаточно большим стажем. Как говорится "для себе". И всегда готов прислушаться к мнению професионалов и творчески пременить чужой опыт.

Почему я решил создавать форму кодом а не через настройки проекта? В одной из тем форума, в которой обсуждался размер оперативки занимаемой KOL-приложением по сравнению с VCL-приложением, Вы Владимир рекомендовали создавать формы по мере необходимости. Да это и логично.
Конечно экономия памяти в моем случае (в связи с тем, что форма используется в качестве визуальной сигнализации, при наступлении некого события, то контролов на ней нет вообще) минимальная, но нужно быть последовательным во всем (хотя отсутствие принципов, тоже принцип).
Управление визуализацией сигнальной формы у меня реализована в отдельном потоке. При создании сигнальной формы, если в качестве родителя брать аплет или главную форму, то при наступлении события по которому сигнальная форма начинает появлятся на экране через заданные промежутки времени (мигать), нет возможности обратится к главной форме через контекстное меню при нажатии правой кн. мыши на значке в трее, сигнальная форма при своем появлении забирает фокус. Этот эфект отсутствует если создавать форму через параметры проекта.
Пробовал ShowWindow( ..., SW_SHOW or SW_NOACTIVATE ); который Вы предлагаете, но получается офигенный тормоз. Почему не знаю.

Нашел свое решение:
Создаю форму: NewForm(nil, Form2);//форма без родителя
Задаю Form2.Form.ExStyle := WS_EX_TOOLWINDOWS;//не показывается значок на панели задач при применении Form2.Form.Visible := True
в событи onShow сигнальной формы:
Form.Focused := False;

D "njv ckexft dct hf,jnftn rfr vyt ytj,[jlbvj/


 
alex3   (2007-03-03 21:21) [3]

К примеру так:
form2.form.Visible:=true;
//Делаем форму2 неактивной
Postmessage(form2.form.Handle,wm_NCActivate,0,0);
//если надо, делаем форму1 активной
Postmessage(form1.form.Handle,wm_NCActivate,2,0);


 
имя   (2007-08-08 22:42) [4]

Удалено модератором



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.042 c
2-1204403005
максим
2008-03-01 23:23
2008.03.30
scrollbar memo


4-1185952234
leonidus
2007-08-01 11:10
2008.03.30
Определение факта нахождения курсора над треем


2-1204223376
arreke
2008-02-28 21:29
2008.03.30
Отправить письмо на email


8-1178178565
Fidel
2007-05-03 11:49
2008.03.30
Софт для Web камеры


2-1204112380
webpauk
2008-02-27 14:39
2008.03.30
определение констант





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский