Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

Необходимо сделать объект прозрачным для событий.   Найти похожие ветки 

 
Dmitry   (2004-06-15 03:31) [0]

Доброго время суток Всем!
Подскажите, пожалуйста, изящный метод решения такой проблемы:

Как можно заставить какой-то объект (скажем Memo) пропускать все адресованные ему события сквозь себя объекту, на котором исходный объект находится. Иными словами объект есть и нормально отображается, но остается прозрачным для событий, скажем, при клике на нем система воспринимает клик, так как будто он был сделан по форме, на котором этот объект находится.

object.enabled:=false; - не подходит, т к. объект начинает по-другому отображаться.


 
KilkennyCat ©   (2004-06-15 03:37) [1]

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
 .....
// ловим кеу для себя
....
  key := #0;
end;


 
Германн ©   (2004-06-15 03:53) [2]

2 Dmitry   (15.06.04 03:31)
Ой, чё-то мне кажется, что не той дорогой идешь ты, товарищ!
Какой смысл в контролле, если он не должен ни на что не реагировать?


 
piople ©   (2004-06-15 06:32) [3]

В ОnClick поставь обработчик события твоей формы.


 
GrayFace ©   (2004-06-15 08:05) [4]

Нууу.. Наверное, лучше не все "события" отдавать форме, а то есть, например, если его слать форме сообщение WM_SIZE, то она всегда будет размером с Memo.
Вот пример, в котором, ажетс, все есть:

 SetWindowLong(Memo1.Handle,GWL_USERDATA,GetWindowLong(Memo1.Handle,GWL_WNDPROC));
 SetWindowLong(Memo1.Handle,GWL_WNDPROC,integer(@MemoEvent));

function MemoEvent(wnd:hwnd; msg:integer; wParam:wParam; lParam:lParam):Lresult; stdcall;
begin
 with form1 do
 begin
   if (msg=WM_LBUTTONDOWN) or (msg=WM_LBUTTONUP) or (msg=WM_LBUTTONDBLCLK) or (msg=WM_RBUTTONDOWN) or (msg=WM_RBUTTONUP) or (msg=WM_RBUTTONDBLCLK) or (msg=WM_RBUTTONDOWN) or (msg=WM_RBUTTONUP) or (msg=WM_RBUTTONDBLCLK) or (msg=WM_MOUSEMOVE) {or (msg=WM_MOUSEWHEEL)} then
   begin
     SendMessage(handle,msg,wParam,(HIWORD(lParam)+Memo1.Top)*$10000+LOWORD(lParam)+Memo1.Left);
   end else
   if (msg=WM_KEYDOWN) or (msg=WM_KEYUP) or (msg=WM_CHAR) or (msg=WM_SYSCHAR) or (msg=WM_SYSDEADCHAR) or (msg=WM_KEYFIRST) or (msg=WM_DEADCHAR) or (msg=WM_SYSKEYDOWN) or (msg=WM_SYSKEYUP) then
   begin
     SendMessage(handle,msg,wParam,lParam);
   end;
   Result:=CallWindowProc(pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,Msg,WParam,LParam);
 end;
end;

Одно не понятно: слать WM_MOUSEWHEEL или не слать?


 
NAlexey ©   (2004-06-15 09:16) [5]

Например мышиные события:
 
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormClick(Sender: TObject);
 private
   { Private declarations }
 protected
   FOldWndProc: TWndMethod;
   procedure NewWndProc(var Message: TMessage);

 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FOldWndProc := Memo1.WindowProc;
 Memo1.WindowProc := NewWndProc;
end;

procedure TForm1.NewWndProc(var Message: TMessage);
begin
 if Assigned(FOldWndProc) then
   FOldWndProc(Message);
 if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then
   Memo1.Parent.Dispatch(Message);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
 ShowMessage("Click");
end;


 
Anatoly Podgoretsky ©   (2004-06-15 09:25) [6]

Memo.Free


 
SSN   (2004-06-15 09:59) [7]

Попробуй -> Memo.ControlStyle := Memo.ControlStyle + [csNoStdEvents];


 
Alex44   (2004-06-15 12:02) [8]


>  SetWindowLong(Memo1.Handle,GWL_USERDATA,GetWindowLong(Memo1.Handle,GWL_WNDPROC));
>  SetWindowLong(Memo1.Handle,GWL_WNDPROC,integer(@MemoEvent));

Eto pravil"no, no ochen" slozhno. VCL eto uzhe delaet, tak chto mozhno prosto perepisat" WndProc (ili WindowProc, tochno ne pomnyu), gde i fil"trovat" messages.


 
Lenor   (2004-06-15 22:51) [9]

А можна вопросъ?.. Зачем тебе?


 
jack128 ©   (2004-06-15 23:08) [10]

наверно так лудше будет..

> procedure TForm1.NewWndProc(var Message: TMessage);
> begin
>  if Assigned(FOldWndProc) then
>    FOldWndProc(Message);
>  if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST)
> then
>    Memo1.Parent.WindowProc(Message);
> end;



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

Текущий архив: 2004.07.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
14-1087046197
Pat
2004-06-12 17:16
2004.07.04
Магистратура


14-1087148884
zokzok
2004-06-13 21:48
2004.07.04
Сколько времени в день можно работать компьютеру


1-1087886239
san
2004-06-22 10:37
2004.07.04
Grid с большой шапкой шапкой


14-1087374100
lehich
2004-06-16 12:21
2004.07.04
ISTsvc


8-1082414407
alexbay
2004-04-20 02:40
2004.07.04
отображение иконок 16*16