Форум: "Основная";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];
ВнизПростой вопрос о смене цвета Найти похожие ветки
← →
KidMan (2002-12-19 13:48) [0]Подскажите пожалуйста как сделать чтобы при наведении курсора на бутон (например) менялся цвет надписи или сама надпись а когда курсор покидает бутон она восстанавливала бы свои свойства?
onMouseMove это делает но я не знаю как восстановить прежние свойства бутона...
Заранее благодарю!
← →
KoluChi (2002-12-19 13:52) [1]>но я не знаю как восстановить прежние свойства бутона...
надо их где-то сохранить
← →
KidMan (2002-12-19 14:03) [2]Это понятно... хотя я знаю что это не обязательно делать... Но в любов случае для восстановления необходимо какое то событие... Знаете какое?
Заранее благодарю!
← →
KoluChi (2002-12-19 14:34) [3]>Это понятно... хотя я знаю что это не обязательно делать...
А мне не понятно, откуда тогда вы собираетесь восстанавливать значения?
Обрабатывайте OnMouseMove:
- если мышь над кнопкой, сохраняем значения, ставим новые,
- если мышь вне кнопки и есть сохраненные значения, то восстанавливаем значения.
← →
han_malign (2002-12-19 14:43) [4]CM_MOUSEENTER, CM_MOUSELEAVE
← →
KidMan (2002-12-19 14:50) [5]KoluChi
-------
Да не откуда... а просто в програмном коде менять в зависимости от события... например:
если событие1 то Button1.Caption := "1"
если событие2 то Button1.Caption := "2"
Разве для этого необходимо Cаption бутона куда записывать ?? (неудоменно так)?
han_malign
----------
Простите а что это CM_MOUSEENTER, CM_MOUSELEAVE ?
← →
KidMan (2002-12-19 16:01) [6]Ответьте пожалуйста...
← →
TTCustomDelphiMaster (2002-12-19 16:11) [7]Юрий Зотов © (25.09.02 20:56)
1. В обработчиках сообщений нет вызыовов inherited. Подозркваю, что дело может быть в этом (разорвана "родная" цепочка передачи сообшений Parent"ам, что нарушает механизмы VCL).
2. Если делать грамотно, то нужно вводить методы диспетчеризации. Они позволяют наследникам класса безопасно встроить свой код в цепочку обработки события.
TMyImage = class(TImage)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
protected
procedure DoMouseEnter; dynamic;
procedure DoMouseLeave; dynamic;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
procedure TMyImage.CMMouseEnter(var Msg: TMessage);
begin
inheried;
DoMouseEnter
end;
procedure TMyImage.CMMouseLeave(var Msg: TMessage);
begin
inherited;
DoMouseLeave
end;
procedure TMyImage.DoMouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self)
end;
procedure TMyImage.DoMouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self)
end;
← →
KidMan (2002-12-19 16:27) [8]Господи... Мне стыдно признаться... Млин но я ничего не понял
::::(((
Прокоментируйте пожалуйста... хотя бы вкратце... плиз!\
← →
KidMan (2002-12-19 18:58) [9]Больше не будет других объяснений... Мастера?
← →
Axis_of_Evil (2002-12-19 19:19) [10]Добрый совет: возьми книжку, прочитай про Классы, а то и
с комментариями ничего не поймешь.
← →
KidMan (2002-12-19 21:58) [11]Axis_of_Evil
------------
Спасибо за совет... я конечно же так поступлю... но простите не сейчас потому что срочно вынужден сдавать свою програмку тестовую... Поэтому искренне попросил бы вас помочь мне нарисовать маленький код для форм1 с бутон1 и и как этом конкретном примере сменять цвет надписи... на кнопке...
Я понимаю что вы не обязаны этого делать... я просто прошу вас об этом как начинающий програмист...
Заранее благодарю вас не зависимо от вашего ответа...
← →
OlDemon (2002-12-20 07:53) [12]2 KidMan> Если не хочешь использовать CM_MOUSEENTER, CM_MOUSELEAVE то сделай просто панельку а на ней кнопку так чтобы со всех сторон кнопки была панель и обрабатывай mousemove у той и другой.
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
Button1.Caption:="cursor";
end;
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Button1.Caption:="out";
end;
Как менять цвет было лень разбираться. Посмоти сам. Думаю идея понятна.
2 TTCustomDelphiMaster> насколько я понял в примере создается свой класс на базе существующего и описаны нужные события (мыша вошла на имедж, мыща вышла с имеджа)? Где бы поподробней почитать об этом?
← →
KidMan (2002-12-20 08:05) [13]OlDemon
-------
Спасибо... именно так я и поступил в свое время... Но это удобно (хотя и за уши притянуто честно говоря) когда на форме расположено мало компонентов... а когда их десятки? Становится очень неудобно прорисывать все это... Кстати и цвет меняется именно таким способом...
Еще раз спасибо но меня это не устраивает... :((
← →
OlDemon (2002-12-20 08:22) [14]2 KidMan> Меня тоже не устраивает. Тогда делай как в примере :) Чесно говоря сам так еще не делал, время будет попробую.
← →
MetalFan (2002-12-20 10:14) [15]есь предложение сделать это через TLabel, у него, если я не ошибаюсь есть события OnMouseEnter & OnMouseLive
← →
OlDemon (2002-12-20 10:22) [16]2 MetalFan> У меня в D5 нет :(( Ты про какую версию говоришь?
← →
viol-2 (2002-12-20 11:56) [17]Это очень просто.
У buttona (вернее у tcontrola) есть свойство WindowProc.
Оно доступно только в real-time. Создаешь указатель на
функцию типа TWndMethod. Ей присваиваешь в formcreate значение
свойства WindowProc для повторного вызова. Потом в форме создаешь
функцию Xaxa с входным параметром TMessage.
Эту функцию присваиваешь переменной WindowProc у buttona.
В ней сначала вызываешь старую функцию через указатель а затем анализируешь сообщения CM_MOUSEENTER (мыша зашла на компонент), CM_MOUSELEAVE (мыша ушла с компонента) и в обработчике меняешь цвет, glyph, font и все что хочешь. Я это уже делал. Работеает отлично. Есл не понял, пиши лично по почте.
← →
Tano (2002-12-20 18:10) [18]От совершенства далеко, но пашет...:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
//ПИШЕМ ПОТОМОК TButton (или чего там еще надо)...
TNewButton = class(TButton)
procedure BMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure BMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure New_FlashButtonClick(Sender: TObject); //сами пишем это
private
{ Private declarations }
public
FlashButton :TNewButton; //кнопка - просто переменная
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TNewButton.BMouseEnter(var Message: TMessage);
begin
//мыша заехала - меняем свойства кнопки
//Font.Color:=clLime; - ЦВЕТ У TButton НЕ МЕНЯЕТСЯ (странно, но только сейчас заметил :-(
Font.Style:=[fsBold, fsUnderline];
SetFocus; //- ставим фокус на кнопку - необязательно
end;
procedure TNewButton.BMouseLeave(var Message: TMessage);
begin
//мыша убежала - меняем свойства кнопки
//Font.Color:=clBlack;
Font.Style:=[];
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
//создание кнопки на форме в Run-Time
FlashButton:=TNewButton.Create(self); //создать
FlashButton.Parent:=self; //указать родителем ЭТУ форму
with FlashButton do
begin
Name:="FlashButton"; //!!! = названию переменной !!!
//инициализация полей - "соль по вкусу"
Caption:="Моргушка";
Left:=10;
Top:=10;
Width:=75;
Height:=25;
Cursor:=crHandPoint;
OnClick:=New_FlashButtonClick;
//Подсказка: я кладу предок элемента (TButton) на
//форму, выравниваю, подписываю, и т.д. и т.п.,
//затем открываю форму как текст, нахожу блок свойств, у нас - строки:
//
//object Button1: TButton
// Left = 32
// Top = 20
// Width = 75
// Height = 25
// Caption = "Button1"
// TabOrder = 0
//end
//
//всё это копирую в "соль по вкусу" и дописываю ":=" и ";"
// -> получаю гарантированное создание в Run-Time того, что видел
//на форме при дизайне.
end;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
//сам породил - сам и убивай!
FlashButton.Free;
end;
procedure TForm2.New_FlashButtonClick(Sender: TObject);
begin
Caption:=DateTimeToStr(Now); //демонстрация
end;
end.
Рекомендую (раз уж самому приходиться конструировать) работай с TPanel,
у нее возможностей по оформлению больше, а работать как кнопка она вполне способна
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c