Форум: "Основная";
Текущий архив: 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