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

Вниз

Перехват клавиши мыши, когда курсор над любым элементом окна   Найти похожие ветки 

 
EthernalWonderer   (2004-09-09 10:25) [0]

Уважаемые Мастера!
ЗАДАЧА: сделать ComboBox, у которого в списке несколько десятков коротких вариантов выбора. Обычный не подходит - долго прокручивать вверх - вниз :).
РРЕШЕНИЕ: Взял TBitBtn, при нажатии на который становится видимой  ("выпадает") панель (Panel1.Visible := True), на которой расположен TRadioButton в несколько колонок.
ПРОБЛЕМА: У обычного ComboBox выпадающий список прячется при нажатии ЛЮБОЙ клавиши мыши на ЛЮБОМ элементе формы. Прописать такое же поведение моей выпадающей панели не удаётся: перехват нажатий мыши:
   
type
 TPropertiesSI1 = class(TForm)
 private
 procedure LMouseDownHook(var Message: TMessage); message WM_LBUTTONDOWN;
...
procedure TPropertiesSI1.LMouseDownHook(var Message: TMessage);
Begin
 ShowMessage("OK");
End;


не работает, если курсор находится, например, над TLabel, TBevel или над некоторыми другими элементами окна.

TForm.OnKeyDown (KeyPreview=True) на клавиши мыши не отзывается...

ВОПРОС: Как мне скрыть мою "всплывающую" панель при щелчке мышью на ЛЮБОМ элементе или заголовке окна?
Заранее спасибо!


 
NAlexey ©   (2004-09-09 10:55) [1]

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


 
EthernalWonderer   (2004-09-09 14:21) [2]

Спасибо, но пока не получается.
Делаю так:

type
 TMyRadioGroup = class(TRadioGroup)
   private
     procedure PanelHide(var Message: TMessage); message WM_CANCELMODE;
   End;

procedure TMyRadioGroup.PanelHide(var Message: TMessage);
Begin
 Parent.Visible := False;
End;


Затем при создании формы создаю панель и её содержимое:

procedure TPropertiesSI1.FormCreate(Sender: TObject);
Begin
 ...
 Panel1 := TPanel.Create(Self);
 With Panel1 Do Begin
   Parent := Self;
   ...
 End;
 RadioGroup1 := TMyRadioGroup.Create(Panel1);
 With RadioGroup1 Do Begin
   Parent := Panel1;
   ...
 End;
 ...
End;


Всё создаётся и работает, но при переводе фокуса на другие контролы формы Parent.Visible = False не выполняется.
Что здесь неверно?


 
EthernalWonderer   (2004-09-09 18:16) [3]

???


 
EthernalWonderer   (2004-09-09 18:38) [4]

И вообще, похоже, рекомендация NAlexey ©   (09.09.04 10:55) [1] не совсем корректная, поскольку в FAQ:
"...Переопределите в подклассе TForm оконную процедуру WinProc класса. В примере оконная процедура переопределяется для того чтобы реагировать на сообщение WM_CANCELMODE, показывающее, что выполняется messagebox или какой-либо еще диалог ...".


 
easy ©   (2004-09-09 18:54) [5]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, AppEvnts, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   ApplicationEvents1: TApplicationEvents;
   Button1: TButton;
   Panel1: TPanel;
   RadioGroup1: TRadioGroup;
   procedure ApplicationEvents1Message(var Msg: tagMSG;
     var Handled: Boolean);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 panel1.Visible:=true;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
begin
case Msg.message of
 WM_LBUTTONDOWN,
 WM_RBUTTONDOWN,
 WM_MBUTTONDOWN,
 WM_NCLBUTTONDOWN,
 WM_NCRBUTTONDOWN,
 WM_NCMBUTTONDOWN,
 CM_DEACTIVATE:panel1.Visible:=false;
end;
end;


 
EthernalWonderer   (2004-09-10 11:06) [6]

Всё оказалось так просто :)! БОЛЬШОЕ спасибо easy ©!


 
NAlexey ©   (2004-09-10 11:53) [7]

>EthernalWonderer   (09.09.04 18:38) [4]
Какой еще FAQ. Посмотри как реализован ComboBox. Взгляни в исходники. Или кинь таймер на форму задай интервал сколько надо и нажми на кноку до срабатывания таймера, и ты увидишь для чего нужен WM_CANCELMODE:

procedure TForm1.Button1Click(Sender: TObject);
begin
 panel1.Visible:=true;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
begin
case Msg.message of
WM_LBUTTONDOWN,
WM_RBUTTONDOWN,
WM_MBUTTONDOWN,
WM_NCLBUTTONDOWN,
WM_NCRBUTTONDOWN,
WM_NCMBUTTONDOWN,
CM_DEACTIVATE:panel1.Visible:=false;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 MessageBox(Self.Handle, "Твоя панель видна!", "", MB_OK or MB_ICONASTERISK);
 Timer1.Enabled := False;
end;
;



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

Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.034 c
1-1095001534
TriX
2004-09-12 19:05
2004.09.26
ListBox ?


14-1094308321
gn
2004-09-04 18:32
2004.09.26
Обзор вирусной активности (август 2004)


14-1094541867
Denis
2004-09-07 11:24
2004.09.26
Можно ли дома отремонтировать монитор?


6-1090471072
vlgrig1961
2004-07-22 08:37
2004.09.26
Как сконвертить WAW файл в файл для воспроизведения по модему


1-1094581005
XAdmin
2004-09-07 22:16
2004.09.26
Использование ZipTV





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