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