IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Связь двух TSpeedButton в Delphi (https://www.imho.ws/showthread.php?t=67131)

f00rd 27.08.2004 20:58

Связь двух TSpeedButton в Delphi
 
Может, конечно, я не очень понятно выразился в сабже, но нужно следующее:
есть два TSpeedButton'a и я хочу сделать так, чтобы при наведении мышки на первый, второй тоже перерисовывался так, как буд-то над ним мышь... Кнопки плоские, т.е. свойство Flat=true

Merlin Cori 27.08.2004 21:46

А по событию Onmouseover над первой, кто тебе мешает менять свойства второй кнопки?

f00rd 27.08.2004 22:03

Merlin Cori
а подскажи свойство, которое делает то, что мне нужно, я не нашел...

dyr_farot 28.08.2004 12:45

это не свойство это действие :)
когда мыш проходит над TSpeedButton вызывается ее OnMouseMove
в нем и перерисовуй вторую кнопку: Repaint()

f00rd 30.08.2004 15:51

dyr_farot

мда... все, что ты сказал, я знаю и так.... вызывать Repaint бестолку... надо с кнопкой что-то сделать, а потом Repaint.

/7y3uK 30.08.2004 17:47

У кнопки может быть всего два состояния: enable:=True и enable:=False; Соответственно кнопка юзает на эти два состояния разные иконки, или автоматом переводит в серую цветную при дефолтных параметрах. Если хочешь рулить изображениями на кнопках, то вешай два ImageList в стакане свойств на эти два случая и рули индексами иконок в обработчике события OnMouseOver...

f00rd 30.08.2004 20:22

Вложений: 1
ууу, меня не понимают =(
См. прицепленные рисунки......

там над кнопкой "Mouse Over" есть мышь, а над кнопкой "And Not" - нету... вот я хочу, чтобы было как с кнопкой "Mouse Over" только без навода мыши...

/7y3uK 31.08.2004 17:04

[QUOTE=f00rd]ууу, меня не понимают =(
[QUOTE]

ХЕ... ах вот ты какой, цветочек аленькой... :):):)

тут придеться поступить следующим образом: на событие над кнопкой нужно прогенерить событие (SendMessage по-моему или что-то вроде этого), тут уже смотри хелп по API.

dyr_farot 31.08.2004 17:31

тю... так бы и сказал :)
за показанное отвечает свойство Flat
соответственно при вхождении мыши в клиентскую область одной кнопки ( TrackMouseEvent() ) изменяй это свойство во второй кнопке

ЕЖ 31.08.2004 17:32

f00rd
Напиши в событии MouseMove 1-й кнопки SpeedButton1 следующее:
SpeedButton2->Perform(CM_MOUSEENTER,0,0);
и вторая кнопка подымится :)

Правда возникнет другая проблемка: поскольку в TSpeedButton есть только событие MouseMove, но нету MouseEnter и MouseLeave, то сложно будет отследить момент выхода мышки из контрола, чтобы погасить поднятую кнопку с помощью сообщения CM_MOUSELEAVE. Правда и это можно обойти, но достаточно геморно и уже другая история...

spleenJack 31.08.2004 19:45

Ничего сложного тут нету - надо создать новый компонент, предка от TSpeedButton для отлова CM_MOUSEENTER и CM_MOUSELEAVE.

Первая кнопка должна быть TwiceSpeedButton, а вторая обычный SpeedButton. Если хочешь, это можно легко исправить. Свойство SecondButton - твоя вторая кнопка.

Думаю разберешься, че с этим делать - будут вопросы, пиши.

Код:

unit TwiceSpeedButton;

interface

uses
  Classes, Controls, Buttons, Messages;

type
  TTwiceSpeedButton = class(TSpeedButton)
  private
    FSecondButton: TSpeedButton;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  published
    property SecondButton: TSpeedButton read FSecondButton write FSecondButton;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('AriX', [TTwiceSpeedButton]);
end;

{ TTwiceSpeedButton }

procedure TTwiceSpeedButton.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  if (FSecondButton <> nil) and (FSecondButton.Flat) then
    FSecondButton.Perform(CM_MOUSEENTER, 0, 0);
end;

procedure TTwiceSpeedButton.CMMouseLeave(var Message: TMessage);
begin
  inherited;
  if (FSecondButton <> nil) and (FSecondButton.Flat) then
    FSecondButton.Perform(CM_MOUSELEAVE, 0, 0);
end;

end.


ЕЖ 31.08.2004 19:58

AriX
Я, собственно, и имел ввиду примерно то, что ты написал. Просто это создание дополнительного отнаследованного компонента, которое может быть не всегда желательным :beer:

f00rd 31.08.2004 19:58

Ураааа! работает :biggrin:
ЁЖ, спасибо =)

Цитата:

Сообщение от dyr_farot
тю... так бы и сказал

извеняюсь =) в следующий раз буду пытаться выражаться более точно...

Всем спасибо....

spleenJack 31.08.2004 20:44

ЁЖ
да я знаю, что ты имел ввиду :)
по-моему так проще всего.. если есть способ лучше - самому хотелось бы узнать..
f00rd
ничего плохого в создании своего компонента нету.. почти в каждой хотя бы немного серьезной программе приходится это делать - так как по другому нельзя.


Часовой пояс GMT +4, время: 14:28.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.