Оформление Bitbtn

Тема в разделе "Delphi - Компоненты", создана пользователем bang, 2 май 2013.

  1. bang

    bang New Member

    Регистрация:
    2 май 2013
    Сообщения:
    1
    Симпатии:
    0
    Нужно следующее: при наведении курсора на кнопку BitBtn рисунок назначеный в свойстве Glyph изменялся на другой, и если кнопку не нажали, и мышку увели с кнопки, то рисунок обратно изменялся на 1й
    Как это все оформить!? Подскажите!
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Например так:
    1. Кладем на форму ImageList.
    2. Заполняем его картинками:
    - Четные, для нормального состояния кнопки;
    - Нечетные, для состояния когда курсор мыши над кнопкой.
    3. Поскольку у BitBtn нет свойства ImageIndex, используем свойство Tag для указания, какие рисунки из ImageList будут в нормальном состоянии кнопки.
    4. В модуле формы пишем следующий код:
    Код (Delphi):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ImgList, StdCtrls, Buttons, XPMan;

    { TBitBtn }
    type
    TMouseEnterLeaveNotifyEvent = procedure (Sender: TObject; MouseOver: Boolean) of object;

    TBitBtn = class(Buttons.TBitBtn)
    private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    public
    OnMouseEvent: TMouseEnterLeaveNotifyEvent;
    end;

    { TForm1 }
    type
    TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    procedure BitBtnMouseChange(Sender: TObject; MouseOver: Boolean);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    { TBitBtn }
    procedure TBitBtn.CMMouseEnter(var Message: TMessage);
    begin
    if Assigned(OnMouseEvent) then OnMouseEvent(Self,True);
    inherited;
    end;

    procedure TBitBtn.CMMouseLeave(var Message: TMessage);
    begin
    if Assigned(OnMouseEvent) then OnMouseEvent(Self,False);
    inherited;
    end;

    { TForm1 }

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    BitBtn1.OnMouseEvent := BitBtnMouseChange;
    ImageList1.GetBitmap(BitBtn1.Tag,BitBtn1.Glyph);

    BitBtn2.OnMouseEvent := BitBtnMouseChange;
    ImageList1.GetBitmap(BitBtn2.Tag,BitBtn2.Glyph);
    end;

    procedure TForm1.BitBtnMouseChange(Sender: TObject; MouseOver: Boolean);
    var
    ImageIndex: Integer;
    B: TBitmap;
    begin
    if (Sender is TBitBtn) then
    with TBitBtn(Sender) do
    begin
    B := Glyph;
    ImageIndex := Tag;
    if MouseOver then
    Inc(ImageIndex);
    ImageList1.GetBitmap(ImageIndex,B);
    Glyph.Assign(B);
    end;
    end;

    end.
    Всё.
    Тестовый проект в аттаче
    Посмотреть вложение BitBtn_Test.rar
     
  3. bang

    bang New Member

    Регистрация:
    2 май 2013
    Сообщения:
    1
    Симпатии:
    0
    ОШибка в коде
    procedure TForm1.BitBtnMouseChange(Sender: TObject; MouseOver: Boolean);
    var
    ImageIndex: Integer;
    B: TBitmap;
    begin
    if (Sender is TBitBtn) then
    with TBitBtn(Sender) do
    begin
    B := Glyph;
    ImageIndex := Tag;
    if MouseOver then
    Inc(ImageIndex); ругает тут
    ImageList1.GetBitmap(ImageIndex,:);
    Glyph.Assign:));
    end;
    end;

    end.
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    :huh: Да?
    Текст ошибки в студию.
     
  5. bang

    bang New Member

    Регистрация:
    2 май 2013
    Сообщения:
    1
    Симпатии:
    0
    procedure TForm1.BitBtnMouseChange(Sender: TObject; MouseOver: Boolean);
    var
    ImageIndex: Integer;
    B: TBitmap;
    begin
    if (Sender is TBitBtn) then
    with TBitBtn(Sender) do
    begin
    B := Glyph;
    ImageIndex := Tag;
    if MouseOver then
    Inc(ImageIndex); Вот она ошибка! Ругается тут в делфях
    ImageList1.GetBitmap(ImageIndex,;
    Glyph.Assign(;
    end;
    end;

    end.

    Добавлено: Всё таже пробле только надо что бы 2 и более кнопок на 1 форме можно было таким макаром сделать...
    есть пару кодов, но они для 1й кнопки на на две кнопки не иогу придумать(




    1й код:



    unit Unit1;

    interface

    uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;

    type
    TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
    procedure BitBtn1MouseLeave(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.BitBtn1MouseLeave(Sender: TObject);
    begin
    bitbtn1.Glyph.LoadFromFile('C:\User s\Los\Pictures\Иконки\бмп\BMP\Disab led\48x48\Bulb Idea.bmp');
    end;

    procedure TForm1.BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
    begin
    bitbtn1.Glyph.LoadFromFile('C:\User s\Los\Pictures\Иконки\бмп\BMP\Disab led\48x48\Approve.bmp');
    end;

    end.




    2й код, точнее его чассть


    procedure TForm1.BitBtn1MouseEnter(Sender: TObject);
    begin
    ImageList1.GetBitmap(1,BitBtn1.Glyph);

    end;

    procedure TForm1.BitBtn1MouseLeave(Sender: TObject);
    begin
    ImageList1.GetBitmap(0,BitBtn1.Glyph);
    end;
     
  6. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    :huh: Детский сад какой то, ей богу...
    Ошибка с текстом у Вас? Или Delphi с Вами вслух загробным голосом матом разговаривает?
    Текст ошибки сообщите нам.
    Вы вообще скачивали мой пример, который к сообщению предыдущему приложен?
    Там у меня три кнопки. Все компилится, работает и никто не ругается ни на кого...
     
  7. bang

    bang New Member

    Регистрация:
    2 май 2013
    Сообщения:
    1
    Симпатии:
    0

    Пример я скачал... И он не работает! Отправилже что ругается в коде на это значение Inc(ImageIndex);

    Что тут сложно понять!?
     
  8. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    :D По бу-ко-в-кам воспроизведите то ругательство которое Вам выдаёт Delphi.
    Например:
    Появляется окно в котором написано "Я отказываюсь компилировать программу. Хочу чтобы программист налил мне пива!".
    Что тут сложно понять!? :)
    Вот. Сам скачал, еще раз проверил, скомпилировал. Никто не ругается. ЕХЕ-ник в архиве.
    Посмотреть вложение BitBtn_Test.rar
     
  9. MisterSpock

    MisterSpock Member

    Регистрация:
    19 мар 2014
    Сообщения:
    9
    Симпатии:
    0
    Проверьте раскладку букв и корректность знаков препинания. Наверняка синтаксическая ошибка из-за опечатки.
     
  10. koval0312

    koval0312 New Member

    Регистрация:
    10 дек 2014
    Сообщения:
    1
    Симпатии:
    0
    Может удобнее использовать свойства самого компанета?
     
Загрузка...

Поделиться этой страницей