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

Вниз

Обработка нажатия кнопок управления курсором...   Найти похожие ветки 

 
STARfish ©   (2004-08-17 14:19) [0]

Подскажите, почему у меня не получается обработать нажатие кнопок управления курсором?

листинг процедуры:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Key = VK_UP then begin
     Form1.ScrollBox1.VertScrollBar.Position:=Form1.ScrollBox1.VertScrollBar.Position-18;
 DrawSomeText(Sender);
 Key:=#0
end;
 if Key = VK_DOWN then begin
Form1.ScrollBox1.VertScrollBar.Position:=Form1.ScrollBox1.VertScrollBar.Position+18;
 DrawSomeText(Sender);
 Key:=#0
 end;
end;


 
46_55_41_44 ©   (2004-08-17 14:29) [1]

Сделай на OnKeyDown...
и вместо Key:=#0; пиши Key:=0;!!!
Будет работать!!!!


 
Mihey_temporary ©   (2004-08-17 14:29) [2]

Проверяй то же самое в OnKeyDown и на всякий случай поставь на форме KeyPreview = True, если ещё не поставил.


 
Рамиль ©   (2004-08-17 14:40) [3]


> if Key = VK_UP then begin

:о) Хочешь сказать, что компилятор промолчал?


 
STARfish ©   (2004-08-17 15:13) [4]


> Сделай на OnKeyDown...
> и вместо Key:=#0; пиши Key:=0;!!!
> Будет работать!!!!

Все! Огромное спасибо! Работает...


 
STARfish ©   (2004-08-17 15:17) [5]

А еще маленький ворпосик... Как теперь мне обрабатывать мне мою процедуру DrawSomeText(Sender) по нажатию мышкой на линейке прокрутки Скроллбокса, т.е. как при изменении позиции ползунка скролбокса мышкой вызвать обработку моей процедуры?


 
Cosinus ©   (2004-08-17 15:32) [6]

ScrollBox1.OnScroll ?
ScrollBox1.OnChange ?


 
STARfish ©   (2004-08-17 15:34) [7]

Че то я в ивентах скроллбокса не нашел такого...


 
[lamer]Barmaglot ©   (2004-08-17 15:36) [8]

?
WM_HScroll
WM_VScroll


 
STARfish ©   (2004-08-17 15:42) [9]

Да...сжульничал....
Просто уже настока туплю уже сижу....
По подробнее можно на счет OnScroll, почему в ивентах я его не вижу?
Спасибо!


 
[lamer]Barmaglot ©   (2004-08-17 15:46) [10]

то STARfish ©   (17.08.04 15:42) [9]

Наверное их просто нет... А Cosinus ©   (17.08.04 15:32) [6] ляпнул не подумав... Правда может это я отстал от жизни...

А благодорить меня рано, если ты сможешь их использовать я сильно удивлюсь...


 
STARfish ©   (2004-08-17 15:54) [11]

Да и Дельфи глючить чет стал... "." нажимаю, думаю хоть щас мне весь список вывалит, а нет его...делся кудато...


 
Cosinus ©   (2004-08-17 15:55) [12]

>>STARfish ©   (17.08.04 15:34) [7]
Прошу прощения, это я дурак слепой... Я думал там просто ScrollBar...

>>[lamer]Barmaglot ©   (17.08.04 15:36) [8]
Согласен ;)


 
STARfish ©   (2004-08-17 16:08) [13]

А как тогда проще выполнить мою процедуру по изменению ползунка скроллбокса, если у него такого события нету?


 
Cosinus ©   (2004-08-17 16:13) [14]

STARfish ©   (17.08.04 16:08) [13]
Тов. [lamer]Barmaglot совершенную правду сказал, видимо отлавливать сообщения WM_HScroll и WM_VScroll.


 
STARfish ©   (2004-08-17 16:15) [15]

Слава богу у меня тока вертикальный скролл интересует.
Каким образом это реализовать можно?


 
Cosinus ©   (2004-08-17 16:35) [16]

Пример взят с сайта delphiworld. Просто выдерни то, что тебе не нужно.
Как перехватить сообщения прокрутки в TScrollBox  
-----------------------------------------------------------------

Следующий пример перхватывает сообщения скроллирования в компоненте TScrollBox, тем самым синхронизируя два скролбара. Если один из скролбаров изменяет своё положение, то значение второго скролбара изменяется на такую же величину. Сообщения скролирования перехватываются путём сабклассинга оконной процедуры (WinProc) у скролбара.

type
 {$IFDEF WIN32}
 WParameter = LongInt;
 {$ELSE}
 WParameter = Word;
 {$ENDIF}
 LParameter = LongInt;

{Declare a variable to hold the window procedure we are replacing}
var
 OldWindowProc : Pointer;

function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter;
ParamW : WParameter; ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
var
 TheRangeMin : integer;
 TheRangeMax : integer;
 TheRange : integer;
begin
 if TheMessage = WM_VSCROLL then
 begin
   {Get the min and max range of the horizontal scroll box}
   GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax);
   {Get the vertical scroll box position}
   TheRange := GetScrollPos(WindowHandle, SB_VERT);
   {Make sure we wont exceed the range}
   if TheRange < TheRangeMin then
     TheRange := TheRangeMin
   else
   if TheRange > TheRangeMax then
     TheRange := TheRangeMax;
   {Set the horizontal scroll bar}
   SetScrollPos(WindowHandle, SB_HORZ, TheRange, true);
 end;
 if TheMessage = WM_HSCROLL then
 begin
   {Get the min and max range of the horizontal scroll box}
   GetScrollRange(WindowHandle, SB_VERT, heRangeMin, TheRangeMax);
   {Get the horizontal scroll box position}
   TheRange := GetScrollPos(WindowHandle, SB_HORZ);
   {Make sure we wont exceed the range}
   if TheRange < TheRangeMin then
     TheRange := TheRangeMin
   else
   if TheRange > TheRangeMax then
     TheRange := TheRangeMax;
   {Set the vertical scroll bar}
   SetScrollPos(WindowHandle, SB_VERT, TheRange, true);
 end;

 {Call the old Window procedure to allow processing of the message.}
 NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle,
 TheMessage, ParamW, ParamL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 {Set the new window procedure for the control and remember
 the old window procedure.}
 OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle,
 GWL_WNDPROC, LongInt(@NewWindowProc)));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 {Set the window procedure back to the old window procedure.}
 SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(OldWindowProc));
end;


 
STARfish ©   (2004-08-17 17:07) [17]

Ну прям беда какая то... Когда этот листинг целиком пихаю - все
работает, а когда начинаю выдерать...одни баги.
А нужно, то мне всего лишь по VM_VScroll выполнить мою процедуру.
Может тыкните меня носом в строчки какие мне нада написать, чтоб все заработало?


 
Думкин ©   (2004-08-18 06:50) [18]

Проблема не в скроллинге, а в том, что в обработчик
FormKeyPress не приходит VK_UP и еще ряд. Проверьте.
Хоть и KeyPreviw поставите.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.035 c
1-1092984256
nicesc
2004-08-20 10:44
2004.09.05
Работа во времени


1-1093086372
masqito
2004-08-21 15:06
2004.09.05
Помогите с построением компонентов.


8-1087015047
dimon_programmer
2004-06-12 08:37
2004.09.05
Аналог Scanline в C++


1-1092800406
BoxTer
2004-08-18 07:40
2004.09.05
Минимаксный метод...


4-1090392345
Андрей Л.
2004-07-21 10:45
2004.09.05
Как получить список принетеров, установленных в системе?





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