C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: как заставить исчезнуть компонент  (Прочитано 2550 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


как заставить исчезнуть компонент
« : 14 Октябрь 2013, 18:06:11 »

не дает мне покоя один вопрос. Есть на форме компонент Label1 и ComboBox1 причем
ComboBox1->Visible = false;

щелкаем мышью по метке, появляется ComboBox1
ComboBox1->Visible = true;

так вот как можно так сделать чтобы при щелчке мыши за пределами ComboBox1 он исчезал

в OnExit прописать ComboBox1->Visible = false? нет не вариант!
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: как заставить исчезнуть компонент
« Ответ #1 : 14 Октябрь 2013, 19:30:10 »

Событие mousedown приложения перехватить, оценить координаты мыши (попали ли в прямоугольник комбобокса) и принять решение.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: как заставить исчезнуть компонент
« Ответ #2 : 15 Октябрь 2013, 14:17:35 »

а для этого нужно обязательно хук использовать или еще методы какие есть?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как заставить исчезнуть компонент
« Ответ #3 : 16 Октябрь 2013, 07:25:12 »

Есть такая глобальная переменная - Screen. У нее есть событие OnActiveControlChange, которое вызывается при смене активного компонента (т.е. при смене фокуса с одного компонента на другой). Вот это событие и нужно обрабатывать. Например
Код
void __fastcall TFMain::FormCreate(TObject *Sender)
{
Screen->OnActiveControlChange = &ActiveControlChangeEvent;
}
 
void __fastcall TFMain::ActiveControlChangeEvent(TObject *Sender)
{
TWinControl *WControl = Screen->ActiveControl;
if (!WControl) return;
 
ComboBox1->Visible = (WControl->Name == Label1->Name);
}
 
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: как заставить исчезнуть компонент
« Ответ #4 : 16 Октябрь 2013, 10:49:30 »

S0mbre, это не будет работать. По двум причинам:

1. По клику на форме (WControl == 0) ты сам приказал выйти из обработчика, этот случай тоже нужен ТС-у...
2. Совсем не так просто заставить ComboBox, в котором что-то выбрано (ItemIndex != 1) исчезнуть... Попробуй, тебе понравится Я вчера пробовал через Application->OnMessage, так и не понял в чем засада... Пока ничего не выбрал - работает, только выбор сделан - облом... Хотя через кнопку, которая тупо берет и сбрасывает Visible - прекрасно работает, в любом состоянии...
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: как заставить исчезнуть компонент
« Ответ #5 : 16 Октябрь 2013, 11:02:18 »

А что если пойти по пути создания локальной ловушки для приложения? Вот только она у меня почему то не ставится
пример кода
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int a;
HHOOK HKey;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------
int __stdcall Key_HookMouse(int code, int wParam, int lParam)
 {
   a++;
   Form1->Edit1->Text = IntToStr(a);
   CallNextHookEx(HKey,code,wParam, lParam);
 }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DWORD id;
 GetWindowThreadProcessId(Application->Handle, &id);

 HKey = 0;
 HKey = SetWindowsHookEx(WH_MOUSE,(WNDENUMPROC)Key_HookMouse,0,id);
 if (HKey == 0)
  Form1->Caption = "hook error";
}
//---------------------------------------------------------------------------
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как заставить исчезнуть компонент
« Ответ #6 : 16 Октябрь 2013, 13:56:15 »

Цитата: volvo877 от 16 Октябрь 2013, 10:49:30
S0mbre, это не будет работать. По двум причинам:

1. По клику на форме (WControl == 0) ты сам приказал выйти из обработчика, этот случай тоже нужен ТС-у...
2. Совсем не так просто заставить ComboBox, в котором что-то выбрано (ItemIndex != 1) исчезнуть... Попробуй, тебе понравится Я вчера пробовал через Application->OnMessage, так и не понял в чем засада... Пока ничего не выбрал - работает, только выбор сделан - облом... Хотя через кнопку, которая тупо берет и сбрасывает Visible - прекрасно работает, в любом состоянии...

Не работает не (совсем) из-за этого, а из-за того, что:
1) TLabel не фокусируется, т.к. не является потомком TWinControl (это потомок TGraphicControl).
2) Форма (как и панель) не фокусируется при клике, соответственно ActiveControl не изменяется.

Модификация:
Код
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Screen->OnActiveControlChange = &ActiveControlChangeEvent;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ActiveControlChangeEvent(TObject *Sender)
{
TWinControl* wControl = Screen->ActiveControl;
ComboBox1->Visible = (  wControl &&
  ((wControl->Name == Edit1->Name) ||
  (wControl->Name == ComboBox1->Name)) );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
ComboBox1->Visible = false; // это же вешать на Label1->OnClick
}
 

И кстати, у меня проблем с выбранными айтемами в ComboBox нет...
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: как заставить исчезнуть компонент
« Ответ #7 : 16 Октябрь 2013, 15:25:09 »

А это мой вариант
//---------------------------------------------------------------------------
#include
#include
#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int a;
HHOOK HKey;
bool vis;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  vis=false;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseProc (int code, int wParam, int lParam)
 {
 POINT MousePos;
 GetCursorPos(&MousePos);
 ScreenToClient(Form1->Handle,&MousePos);
 int x = MousePos.x;
 int y = MousePos.y;
 int CBl = Form1->ComboBox1->Left;
 int CBt = Form1->ComboBox1->Top;

   switch (wParam)
   {
    case WM_LBUTTONDOWN:
     {

      if (vis==true)
       {
         if ((x=CBl+Form1->ComboBox1->Width)|| (y=CBt+Form1->ComboBox1->Height))
         {
          vis=false;
          Form1->ComboBox1->Visible = false;
         }
       }
     }break;
     default: wParam = 0;
   }
    return CallNextHookEx(HKey,code,wParam, lParam);
 }
//---------------------------------------------------------------------------


void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    UnhookWindowsHookEx(HKey);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
DWORD id;
 id = GetCurrentThreadId();
 HKey = 0;
 HKey = SetWindowsHookEx(WH_MOUSE,(WNDENUMPROC)MouseProc,0,id );
 if (HKey == 0)
  Form1->Caption = "hook error";       
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label1Click(TObject *Sender)
{
ComboBox1->Left = Label1->Left;
ComboBox1->Top = Label1->Top+Label1->Height+1;
ComboBox1->Visible = true;
vis = true;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    Label1->Caption = ComboBox1->Text;
}
//---------------------------------------------------------------------------

 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« Ответ #8 : 16 Октябрь 2013, 15:25:52 »

Но он еще нуждается в доработке
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.118 секунд. Запросов: 21.