Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2010, 10:46   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Мышь над компонентом

Здравствуйте, уважаемые!
Подскажите пожалуйста самый правильный способ проверки нахождения мыши над нужным компонентом.
В частности - делаю свой компонентик на основе TPanel, и нужно сделать его прокрутку колесом мыши...
Заранее спасибо!
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 10.09.2010, 10:50   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Как не подсказать дедушке Ленину

Есть события OnMouseEnter и OnMouseLeave, происходят при вхождении мыши на компонент и его покидании.

Совет: TPanel бедноват на события, можно унаследоваться от TWinControl.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 10.09.2010, 11:50   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
самый правильный способ проверки нахождения мыши над нужным компонентом.
Ну окромя способа Мутабора, можно еще прикрутить проверку примерно такого содержания:
Код:
var t:TWinControl;
begin
 t:=FindVCLWindow(Mouse.CursorPos);
 if t<>nil then begin
  if t=Panel1 then Над панелью такой-то
 end;
end;
Но эта проверка для конкретного события или операции. Т.е. тут нужно подумать когда и в каком случае тебе нужны данные такого плана. Ибо не всегда OnMouseEnter и OnMouseLeave могут сработать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2010, 12:15   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Повторюсь но:
Код:
var
  Form1: TForm1;
  B: Boolean;  //True - над компонентом

implementation

{$R *.dfm}

procedure TForm1.Panel1MouseEnter(Sender: TObject);
begin
  B := True;
end;

procedure TForm1.Panel1MouseLeave(Sender: TObject);
begin
  B := False;
end;
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 10.09.2010, 14:23   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Цитата:
Сообщение от chertovich Посмотреть сообщение
Повторюсь но:
во-первых, с помощью условных флагов и сам додумался сразу, но я стараюсь отказываться от них. мне больше импонируют событие-ориентированые методы... во-вторых, для каждого экземпляра класса нужно будет заводить отдельный флаг... в-третьих, этот способ ещё приемлим для классов, описаных прямо в коде проекта, но не очень удобен для использования компонентов...

Цитата:
Совет: TPanel бедноват на события, можно унаследоваться от TWinControl
это я знаю... панель использую просто как черновик... в дальнейшем будет либо ТКастомПанель, либо ТВинКонтрол, либо вобще ТОбьект... думать ещё надо...

Цитата:
Ну окромя способа Мутабора, можно еще прикрутить проверку примерно такого содержания:
это уже интереснее... только вот теперь другой вопрос - как это реализовать прямо в описании класса компонента, откуда будет проблематично получить данные о экземпляре класса? (делаю компонент визуальный, который будет инсталироваться в дельфю)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 10.09.2010, 15:07   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как это реализовать прямо в описании класса компонента
В каком смысле? Где нужна проверка?
Цитата:
проблематично получить данные о экземпляре класса?
Почему проблематично?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2010, 17:17   #7
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

есть паскалевский код. в нем описание моего класса. создаю пакадж и инсталирую в дельфи (2009). Не знаю как правильно это назвать. тоесть компонент появляется в "палитре". кидаешь этот компонент на форму - и работаешь с ним... вобщем всё как с обычной ТПанель. Как оттуда получить данные о каждом экземпляре класса - я не знаю. нужно както делать проверку и обрабатывать прокрутку колеса мыши...
ЗЫ сори, что обьясняю кривоязычно, теорию не учил, программист-самоучка...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 10.09.2010, 17:58   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Наследуйся от TWinControl и обрабатывай MouseWheel, единственное условие - компонент должен быть в фокусе, иначе событие получать не будет.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 10.09.2010, 18:13   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как оттуда получить данные о каждом экземпляре класса
Какого класса? Того что ты создал? Так Self еше не отменили.
Либо же тебе нужно перебрать все твои "панели" в контейнере куда ты их поместил? Тогда если ты конечно имеешь в своем классе свойство Parent: TWinControl; можно пройтись по нему, а точнее по его содержимому:
Код:
 with parent do
  for i:=0 to ControlsCount-1 do begin
    if Control[i] is Нужный класс then Нужный класс(Control[i]).Его Свойство
  end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2010, 10:13   #10
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

секция protected
Код:
procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;
Код:
var
 fWheel := 0; // это при create
Код:
procedure TКомпонент.CMMouseWheel(var Message: TCMMouseWheel);
var
  IsNeg: boolean;
begin
  with Message do
  begin
    Inc(fWheel, WheelDelta);
    while Abs(fWheel) >= WHEEL_DELTA do
    begin
      IsNeg := fWheel < 0;
      fWheel := Abs(fWheel) - WHEEL_DELTA;
      if (IsNeg) then
      begin
        if fWheel <> 0 then fWheel := -fWheel;
        // тут код
      end
      else  begin
       // тут код
      end;
    end; // while ... do
    Refresh;
  end; // message
end;
вот так у меня сделано в одном из компонентов, как сказали выше нужен фокус чтобы компонент принимал CM_ сообщения
ZuBy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как лучше узнавать, что мышь находится над окном (или частью окна)? Css Win Api 7 14.02.2010 05:45
Мышь Salvatore- Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.09.2009 16:57
Можноли проверить, находиться ли мышь над нарисованной фигурой? TwiX Мультимедиа в Delphi 3 26.08.2009 10:35
Мышь Михаил Юрьевич Общие вопросы Delphi 8 09.06.2008 11:23
Мышь kl45gp Общие вопросы Delphi 7 16.06.2007 22:47