С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
1

Потеря Фокуса у формы

24.02.2015, 18:12. Показов 4631. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо что бы форма закрывалась по потери фокуса, сейчас это отлавливаю через таймер+GetForegroundWindow(). Возможно это как то сделать проще,может есть определенное событие у формы ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2015, 18:12
Ответы с готовыми решениями:

Потеря формой фокуса
Как сделать чтоб моя форма теряла фокус, а активной становилась предыдущая активная программа.

Потеря фокуса StringGrid
Обьясните как лучше сделать откат изменений в ячейке StringGrid если был переход мышкой на другую...

Потеря фокуса ячейки грида при вызове OpenDialog/SaveDialog
Только при данных действях(при вызове OpenDialog/SaveDialog) происходит выделение активной ячейки...

Какое событие формы отвечает на попадание фокуса к данному приложению?
Всем здравствуйте. Переключаюсь со стороннего приложения Windows на своё, например щёлкая по...

21
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
24.02.2015, 18:54 2
У формы есть событие OnDeactivate, там и закрывай форму...
1
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
24.02.2015, 19:37 3
volvo, я тоже так думал пока не проверил. OnDeactivate отрабатывает если переключатся между формами одного проекта, а если переключится на другую программу то не работает.

З.Ы. ХЕ3

Добавлено через 13 минут
Ловить WM_NCACTIVATE...

*.h
C++
1
2
3
4
5
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_NCACTIVATE, TMessage, OnNCActivateMessage)
END_MESSAGE_MAP(TForm)
void __fastcall OnNCActivateMessage(TMessage &Message);
*.cpp
C++
1
2
3
4
5
void __fastcall TForm1::OnNCActivateMessage(TMessage &Message)
{
 if (!Message.WParam) Close();
 TForm::Dispatch(&Message);
}
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
24.02.2015, 19:40 4
Ну и зря. Назначь:
C++
1
2
3
4
5
6
7
8
9
10
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
    Application->OnDeactivate = FormDeactivate;
}
 
void __fastcall TForm2::FormDeactivate(TObject *Sender)
{
    Close();
}
, и посмотри, что будет

Не надо лишнего делать. Подавляющее большинство вещей можно осуществить без отлова сообщений...
2
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
24.02.2015, 19:46 5
Цитата Сообщение от volvo Посмотреть сообщение
Application->OnDeactivate = FormDeactivate;


А как же OnActivаte/OnDeactivate формы? Интересно, это баг VCL или так задумано?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
24.02.2015, 19:49 6
По ссылке не ходил? Там написано:
Use OnDeactivate to perform special processing when the active form becomes inactive and another form in the same application becomes the active one. If activation goes to another application, this event is not triggered. To determine whether another application has become active, use the TApplication object's OnDeactivate event.
1
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
24.02.2015, 19:51 7
Цитата Сообщение от volvo Посмотреть сообщение
По ссылке не ходил?
Не ходил ))) Спасибо, что просветил
0
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
24.02.2015, 20:02  [ТС] 8
Цитата Сообщение от volvo Посмотреть сообщение
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
Application->OnDeactivate = FormDeactivate;
}
void __fastcall TForm2::FormDeactivate(TObject *Sender)
{
Close();
}
К сожалению применимо только к главной форме. Мне надо это свойство к постояно создоваемым формам, во время работы программы.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
24.02.2015, 20:22 9
С чего бы? Это применимо к любой форме, вот у меня как раз не главная была, когда я проверял. А можно вообще создать потомка от TForm:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// AutoCloseForm.hpp
 
#ifndef __AUTOCLOSE_FORM__
#define __AUTOCLOSE_FORM__
 
class TAutoCloseForm : public TForm
{
protected:
    void __fastcall FormDeactivate(TObject *Sender)
    {
        Close();
    }
 
public:
    __fastcall virtual TAutoCloseForm(Classes::TComponent* AOwner)
        : TForm(AOwner)
    {
        OnDeactivate = FormDeactivate;
        Application->OnDeactivate = FormDeactivate;
 
    }
};
 
#endif
, и использовать его в качестве предка твоих форм, тогда ничего вообще не нужно будет добавлять в сам класс формы.
1
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
24.02.2015, 20:38  [ТС] 10
Так я применял не к главной, но суть что если кликнуть вне проекта, то не чего не происходит, если кликнуть в программе, то все нормально.

На счет
Цитата Сообщение от volvo Посмотреть сообщение
// AutoCloseForm.hpp #ifndef __AUTOCLOSE_FORM__ #define __AUTOCLOSE_FORM__ class TAutoCloseForm : public TForm { protected: void __fastcall FormDeactivate(TObject *Sender) { Close(); } public: __fastcall virtual TAutoCloseForm(Classes::TComponent* AOwner) : TForm(AOwner) { OnDeactivate = FormDeactivate; Application->OnDeactivate = FormDeactivate; } }; #endif
Что не пойму как применить? Кидаю это в h файл, но при создании потомка, получаю ошибку
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
24.02.2015, 20:44 11
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Цитата Сообщение от Dinkin Посмотреть сообщение
если кликнуть вне проекта, то не чего не происходит
Ты точно добавил Application->OnDeactivate?
Цитата Сообщение от Dinkin Посмотреть сообщение
Что не пойму как применить?
Очень просто:
header-file
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
 
#ifndef Unit2H
#define Unit2H
 
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
 
#include "AutoCloseForm.hpp" // <--- Добавляем - раз
 
class TForm2 : public TAutoCloseForm // Изменяем предка - два
{
__published:
private:
public:
    __fastcall TForm2(TComponent* Owner);
};
 
extern PACKAGE TForm2 *Form2;
 
#endif
cpp-file
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
 
__fastcall TForm2::TForm2(TComponent* Owner)
    : TAutoCloseForm(Owner) // Изменяем предка еще и тут - три
{
}
 
// все остальное без изменений
1
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
24.02.2015, 21:16  [ТС] 12
Что то лыжи у меня не едут
Не могу собрать, что Вы написали.

Еще раз повторюсь, что мне надо что бы главная форма не закрывалась, а закрывались дочерние если с них снимали фокус. В Последнем даже не получилось собрать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
24.02.2015, 23:12 13
Вот проект (Builder XE2, собирается, работает). Пришлось чуть подправить, иначе была проблема при создании больше чем одной дополнительной формы...
Вложения
Тип файла: 7z thread1381760.7z (60.1 Кб, 16 просмотров)
1
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
24.02.2015, 23:26  [ТС] 14
Спасибо. Ну по логике не должно быть больше двух форм,так как фокус теряется, и форма закрывается......все таки разобрался с Вашим предыдущим примером.
0
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
26.02.2015, 15:08  [ТС] 15
Возникла небольшая проблема с данной формой.

Если присвоить ей свою функцию закрытия

C
1
2
TCloseAutoForm *f = new TCloseAutoForm(this);
f->OnClose= closeform;
C
1
2
3
4
5
void __fastcall TMAIN::closeform(TObject *Sender, TCloseAction &Action)
{
        Action = caFree;
}
//---------------------------------------------------------------------------
То в таком алгоритме будет выводить ошибку:

Создаем дочерку TCloseAutoForm
Жмем Alt+TaB (Что бы перейти в другое приложение, посуте фокус теряется, форма должна удалится)
Жмем Alt+TaB (Возвращаюсь к своему и формы нет, все как и надо)
Жмем Alt+TaB (Что бы перейти обратно к стороннему приложению,и вот тут ошибка)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
26.02.2015, 15:33 16
Так вот тот проект, который я прикрепил выше, в посте №13, подобной ошибки не вызывает. Сколько я пытался переходить по Alt+Tab и возвращаться - нигде не было сбоя...
1
744 / 531 / 133
Регистрация: 31.05.2013
Сообщений: 3,027
Записей в блоге: 3
26.02.2015, 15:58  [ТС] 17
Да-да, просто лежал в папке с проектом старый "AutoCloseForm.hpp", заменой на новый, все проблемы прошли, еще раз Благодарю!
0
5 / 5 / 2
Регистрация: 21.12.2015
Сообщений: 14
29.12.2015, 13:37 18
Всё это конечно хорошо, но как можно отловить переключение фокуса на другое приложение, если твое приложение занято длительным процессом, например загрузкой данных в гриде? Опыты показали, что событие OnDeactivate той формы, в которой идет загрузка данных срабатывает только после завершения загрузки данных.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33019 / 21321 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
29.12.2015, 14:16 19
Опыты еще не показали, что длительные процессы нужно выносить в отдельный поток, чтобы разгрузить GUI, и чтобы он корректно и вовремя обрабатывал события? Значит, ждем, пока покажут. Ну, или ProcessMessages (если процесс итеративный) на каждой итерации, чтобы хоть как-то не подвешивать форму.
0
5 / 5 / 2
Регистрация: 21.12.2015
Сообщений: 14
29.12.2015, 16:26 20
Спасибо, вынес загрузку грида в поток и проблема разрешилась. Но, конечно, удобнее было бы словить какое-нибудь соответствующее сообщение о потере приложением фокуса без использования потока.
0
29.12.2015, 16:26
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2015, 16:26
Помогаю со студенческими работами здесь

DBMemo наведение фокуса и его потеря (наработки есть)
Привет, ребята! Есть такой вопрос, как можно реализовать следующее. При наведения фокуса на DBMemo...

Закрытие формы по esc, не зависимо от фокуса
собственно в заголовке весь вопрос поместился. Я знаю как можно обработать нажатие если фокус...

Уход фокуса с одного Edit-а и получение фокуса другим
Доброе время суток, есть пара Edit, можно ли как то отловить момент когда человек закончил...

Потеря фокуса формы
form4.Visible:=true; form1.Enabled:=false; .......................................... ...

Потеря фокуса при заполнении формы
Доброе время суток! Нужна помощь. При заполнении в форме текстового поля 255 знаков курсор...

Потеря фокуса всплывающей формы при выполнении любой операции
Добрый день. Очередной вопрос, подскажите пожалуйста. При нажатии кнопки на всплывающем окне и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru