Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.62 MB
Время: 0.032 c
4-1931
saniok
2002-11-12 12:22
2003.01.02
IE как IWebBrowser


1-1822
Djon007
2002-12-18 22:02
2003.01.02
Help!!!!!!!!!!!!


14-1883
Demoniac
2002-12-13 23:12
2003.01.02
:) nichego sebe. kto zdes latinicu znayet?


1-1815
Djon007
2002-12-19 23:03
2003.01.02
нужна помощь!!!!!!!!!


14-1858
Сергей Макаров
2002-12-12 10:56
2003.01.02
Помогите с задачкой.





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