Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1152614987
Александр Иванов
2006-07-11 14:49
2006.08.06
Без коментариев


6-1143358786
Коля
2006-03-26 11:39
2006.08.06
Бьюсь с отправлением файла по соксу


11-1131187277
MTsv DN
2005-11-05 13:41
2006.08.06
KOLnMCK v.2.21


2-1153196270
Rubey
2006-07-18 08:17
2006.08.06
Компонент в STRINGGRIDE


15-1152450316
анка
2006-07-09 17:05
2006.08.06
Стоит ли ехать в Питер во время Саммита?





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