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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
3-1086785012
freeman82
2004-06-09 16:43
2004.07.04
ADOStoredProc


1-1087478400
Leron
2004-06-17 17:20
2004.07.04
А как получить имена всех запущенных файлов word a


3-1086097611
KIR
2004-06-01 17:46
2004.07.04
АвтоФормат в pFIBDataSet


14-1086894996
RealRascal
2004-06-10 23:16
2004.07.04
Борьба с алкоголизмом


14-1087046197
Pat
2004-06-12 17:16
2004.07.04
Магистратура





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