Главная страница
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.021 c
4-1085147479
DoG
2004-05-21 17:51
2004.07.04
ReadFile !


14-1087058594
AZ
2004-06-12 20:43
2004.07.04
Upgrade hardware &amp; setup Win98


4-1085379431
Mamed
2004-05-24 10:17
2004.07.04
Udalenie faylov


1-1087724570
killer
2004-06-20 13:42
2004.07.04
Меню состоящее из одних изображений?


14-1087001503
cemick
2004-06-12 04:51
2004.07.04
Хотелось бы услышать мнение на счет Borland Delphi 8