![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мастера, простенький вопросик
Loginov Dmitry © (2006-07-13 19:25:00)Пишу компонент, наследую его непосредственно от TComponent. Он должен отлавливать нажатие любой клавиши (типа KeyDown, KeyPress) на любом элементе управления формы. Проблема легко решается, если переписать метод WndProc для главной формы. Но как решить проблему силами самого компонента (притом еще и не визуального), и не трогать метод KeyPreview формы?
Loginov Dmitry (2006-07-15 00:10:00) [1]Ниче не понял, но все нормально. Глюки канули в лету, а вот свои резкие замечния удалить я не могу.
Leonid Troyanovsky (2006-07-14 23:31:00) [2]
> Loginov Dmitry © (14.07.06 23:26) [13]
> Именно поэтому я и написал так грубо :)
А можно ли уточнить, в каком именно месте оная грубость
и проявилась в наибольшей степени?
Хотя, конечно, лучше, IMHO, отвечать в сугубо прикладном смысле,
дабы избежать офтопика.
--
Regards, LVT.
Loginov Dmitry (2006-07-14 23:26:00) [3]> Ну, а если порядок уничтожения будет отличен от создания,
>
> то это не спасет.
Именно поэтому я и написал так грубо :)
Leonid Troyanovsky (2006-07-14 19:22:00) [4]
> StriderMan © (14.07.06 12:39) [11]
> в деструкторе компонента разумеется нужно вернуть OWNER'у
> его WinProc
Ну, а если порядок уничтожения будет отличен от создания,
то это не спасет.
--
Regards, LVT.
StriderMan (2006-07-14 12:39:00) [5]
> Юрий Зотов © (14.07.06 12:29) [10]
в деструкторе компонента разумеется нужно вернуть OWNER'у его WinProc
Юрий Зотов (2006-07-14 12:29:00) [6]> StriderMan © (14.07.06 11:54) [9]
> предложенный мой способ вполне работоспособен
Кладем на форму несколько таких компонентов. Потом какие-то из них удаляем. Наблюдаем работоспособность.
StriderMan (2006-07-14 11:54:00) [7]
> Скажем, так: после такого ИЗВРАТА
фу как грубо. и в чем же тут, извиняюсь, ИЗВРАТ?
согласен что хуки вобщем более подходящий мех-м, но предложенный мой способ вполне работоспособен
Vlad (2006-07-14 11:21:00) [8]
> Loginov Dmitry © (14.07.06 00:45) [4]
var
Grid: TControl;
begin
// Просто запоминаем ссылку на активный контролл
Grid := Form1.ActiveControl;
// Делаем проверку - действительно ли активный контрол - сетка
// Если нет, то выходим
if not (Grid is TDBGrid) then Exit;
umbra (2006-07-14 10:10:00) [9]2 Loginov Dmitry © (14.07.06 00:45) [4]
> выражение (Grid is TDBGrid) всегда дает True.
а что оно еще может давать, если произведено явное приведение типов?
Loginov Dmitry (2006-07-14 07:56:00) [10]> Почему бред? Сказано же : var Grid: TDBGrid;
Вообще-то по идее RTTI должно делть проверку, т.е. в области данных объекта, адресуемого с помощью указателя, отыскивает ссылку на сам класс, и возвращает True, если объект относится к этому классу. А тут - хрена!
Вместо TDBGrid я использую TRxDBGrid. Скорее всего косяк в этом, хотя Х.З.
unknown (2006-07-14 01:39:00) [11]
var
Grid: TDBGrid;
begin
if not (ActiveControl is TDBGrid) then Exit;
Grid := TDBGrid(Form1.ActiveControl);
> Оказывается, какой бы контрол ни был активным, выражение
> (Grid is TDBGrid) всегда дает True. По-моему это бред,
>
Почему бред? Сказано же :var Grid: TDBGrid;
Loginov Dmitry (2006-07-14 00:45:00) [12]В общем в итоге оба способа показали одно и тоже. Но второму способу я как-то больше доверяю. А ошибка была исключительно из-за RTTI. Почему - не понимаю. Вот код:
var
Grid: TDBGrid;
begin
// Просто запоминаем ссылку на активный контролл
Grid := TDBGrid(Form1.ActiveControl);
// Делаем проверку - действительно ли активный контрол - сетка
// Если нет, то выходим
if not (Grid is TDBGrid) then Exit;
.....
Оказывается, какой бы контрол ни был активным, выражение (Grid is TDBGrid) всегда дает True. По-моему это бред, такого быть не должно... RTTI глючит... Или просто спать пора...
:)
Loginov Dmitry (2006-07-13 22:37:00) [13]> StriderMan © (13.07.06 19:51) [1]
Скажем, так: после такого ИЗВРАТА 90% времени прога работает, остальные 10% - вылетает. Ну все-равно, повеселился :)
> пойдет?
Буду смотреть...
Vlad (2006-07-13 20:45:00) [14]
> Loginov Dmitry © (13.07.06 19:25)
пойдет?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1143047689&n=12
StriderMan (2006-07-13 19:51:00) [15]
> переписать метод WndProc
можно не переписывать, а просто подменить.
в твоем компоненте:
...
oldWndProc: TWndMethod
Procedure MyWndProc(var Message: TMessage);
...
//в конструкторе
Owner.WindowProc := MyWndProc;
....
procedure ...MyWndProc(var Message: TMessage);
begin
//тут свой код
OldWndProc(Message);
end;