Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 17
1

Странное поведение окон

15.02.2015, 17:43. Просмотров 561. Ответов 5
Метки нет (Все метки)

Здравствуйте!

Демка с комментами [cut]

Суть. Мне нужно создать независимое окно с отдельной кнопкой в таскбаре, для этого прописывается следующая функция:
C++
1
2
3
4
5
6
void __fastcall TForm2::CreateParams(Controls::TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.ExStyle |= WS_EX_APPWINDOW;
    Params.WndParent = NULL;
}//---------------------------------------------------------------------------
Проблема в том, что если из этого независимого окна модально вызывается другое окно. А потом происходит переключение на родительское окно и выход из него Esc, то главное окно блокируется полностью. Подробнее смотрите демку.

Но я нашел как частично бороться с этой проблемой. А именно. Я проставляю CanClose в зависимости от того, есть ли у этого окна дочерние окна пробегаясь по массиву Components и ища InheritsFrom(__classid(TForm)). Если у окна есть хоть одно дочернее окно, то Esc не приведет к закрытию окна, т.к. CanClose проставится в false. Это работает с моими собственными окнами, но если вызываются окна каких-то стронних компонентов типа TRichView, то они вешаются на главное окно приложения и не попадают в массив Components. Поэтому приложение блокируется в таких случаях. Пользователи жалуются. Вообще в целом проблема странная. Вы не знаете в чем дело?

Добавлено через 11 минут
Есть ещё одна проблема связанная с Open и Save Dialog-ами. Если в этих Dialog-ах, вызванных из независимого окна, нажать Esc, то независимое окно проваливается под родительское. Если их вызывать так
C++
1
2
3
4
if(OpenDialog->Execute())
{
 
}
Но все нормально если вызывать так:
C++
1
2
3
4
if(OpenDialog->Execute(this->Handle))
{
 
}
Это все баги среды разработки?
0
Вложения
Тип файла: rar Demo.rar (95.0 Кб, 1 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2015, 17:43
Ответы с готовыми решениями:

Странное поведение!
Доброго времени суток! На лицо странное (на мой взгляд) поведение С++ Builder 6. Итак код:...

Странное поведение XE2
Как такое возможно(скриншот). И еще замечаю - не всегда происходит присваивание значений переменным.

Странное поведение UnicodeString.
С некоторого момента UnicodeString без особых на то причин начала вести себя странно. Variang...

Странное поведение Builder XE
Добрый день! При работе программы возникает ошибка типа acces violation в след куске кода: for...

5
119 / 141 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
16.02.2015, 10:33 2
Цитата Сообщение от execoma Посмотреть сообщение
Суть. Мне нужно создать независимое окно с отдельной кнопкой в таскбаре
Это как ?
0
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 17
16.02.2015, 13:00  [ТС] 3
Это так как в демке, чтобы у окна была своя кнопка в таскбаре и чтобы оно работало независимо от основного окна, например не сворачивалось при сворачивании главного окна. Я это сделал приведенной выше функций. Но похоже, что среда C++ Builder (XE) неверно обрабатывает такие окна, т.к. возникает ряд глюков. Думаю, вряд ли мне кто-то поможет тут с этим. Задача явно не тривиальная.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30269 / 19774 / 7736
Регистрация: 22.10.2011
Сообщений: 34,509
Записей в блоге: 6
16.02.2015, 13:27 4
Цитата Сообщение от execoma Посмотреть сообщение
Думаю, вряд ли мне кто-то поможет тут с этим. Задача явно не тривиальная.
Ну, куда уж нам. Ты ж показываешь окно модально, а потом, не дождавшись его закрытия, берешь и гробишь родителя. Чего ж тут тривиального? Это просто неправильно, а не нетривиально.

И уж как же догадаться нам до того, что надо просто вынести
C++
1
TForm3 *Form3 = NULL;
в глобальную области видимости (либо сделать ее приватным членом класса формы, это уж от задачи зависит), и перед тем, как закрывать Form2 - проверить, существует ли еще Form3, и если да - то сначала закрыть Form3, и только потом пытаться закрывать Form2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TForm2::AL_CloseExecute(TObject *Sender)
{
    if(Form3)
    {
        Form3->ModalResult = mrCancel;
    }
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    Form3 = new TForm3(this);
 
    __try
    {
        Form3->ShowModal();
    }
    __finally
    {
        delete Form3;
        Form3 = NULL;
    }
}
Нет, это все не про нас, мы тут только складывать 2+2 научились...
0
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 17
16.02.2015, 13:33  [ТС] 5
Я так делал. И сделал потом даже немного универсальнее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    CanClose = !IsExistsChildForms(this);
}
//---------------------------------------------------------------------------
bool __fastcall IsExistsChildForms(TForm *Form)
{
    for(int i = 0; i < Form->ComponentCount; i++)
    {
        if(Form->Components[i]->InheritsFrom(__classid(TForm)))
        {
            return true;
        }
    }
 
    return false;
}
//---------------------------------------------------------------------------
Проблема в том, что есть окна сторонних компонентов. Они не вешаются на окно родителя, хотя и создаются в нем, и указателей на них нет. В частности это касается TRichView, я уже отправил запрос разработчику, он признал косяк.

Суть в том, что это похоже на косяк среды, т.к. при переключении на независимое окно имеющее модальное окно Esc не должен проходить в него, а должен идти в модальное. Почему одни messages активируют модальное окно (например, клик), а другие messages не активируют его и иду в родителя?! И из-за этого целый букет глюков. Я привел лишь некоторые.
0
1 / 1 / 0
Регистрация: 08.03.2010
Сообщений: 17
17.02.2015, 15:02  [ТС] 6
Цитата Сообщение от volvo Посмотреть сообщение
Нет, это все не про нас, мы тут только складывать 2+2 научились...
Я же говорил, задача нетривиальная.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2015, 15:02

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

Classic Bluetooth странное поведение сокета
Доброго времени суток ! Пытаюсь подружить устройство на stm32+CH-06 с компом Использую...

Странное поведение char при выводе в Edit
void __fastcall TForm1::Edit2Change(TObject *Sender) { char s; AnsiString s1; if(Edit2-&gt;Text !=...

Странное поведение курсора при расвертывании ComboBox
делаю выпадающий список, но странное поведение заметил когда я его раскрываю ComboBox1-&gt;DroppedDown...

Странное поведение строковых переменных (меняются с того ни с сего)
Код такой: UnicodeString gorod; // глобальная void __fastcall...

Странное поведение new
Объясните почему оператор new выделяет неверное количество памяти? # include &lt;iostream&gt; using...

странное поведение Qt
до сих пор ковыряюсь с установкой qt в винде, поставил в XP, всё работает, всё компилится, всё...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.