Что нового
  • Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi Создаём Свой Стиль Кнопок.

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,059
Баллы
155
Возраст
47
button.jpg

Мы используем TImage, столько TImage, сколько нужно кнопок.

Подготовка
У наших кнопок будет три состояния — нажата, не нажата, активна (наведена мышь).
Заранее подготовь три картинки, для трёх этих состояний, и помести в папку программы.
Создадим константы с именами наших картинок:

const
IM_DOWN: string='down.bmp';
IM_MAIN: string='main.bmp';
IM_HOVER: string='hover.bmp';

Ии, нам надо их менять, подготовимся:

procedure SetState(btn:TImage;vstate:string);
var
vfile:string;
begin
vfile:=ExtractFilePath(ParamStr(0))+vstate;
try
btn.Picture.LoadFromFile(vfile);
except
end;
end;

Здесь мы передаём функции имя файла картинки (из созданных констант) и указание на TImage, с которым нужно такое сотворить.

Так-с, поставим теперь на форму Image1, создадим ему следующие обработчики событий:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
SetState(Image1,IM_HOVER);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetState(Image1,IM_MAIN);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetState(Image1,IM_DOWN);
end;

Тут всё понятно (надеюсь): при нажатии, отжатии, наведении мышью. А как быть, когда мышь уходит?

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
SetState(Image1,IM_MAIN);
end;

Да, с одним TImage работает на ура. Только вот мерцает при движении мышью, это плохо, так ведь?

Тогда добавим еще четыре константы:

const
BS_UP=1001; //последнее событие было mouseup
BS_DOWN=1002; //последнее событие было mousedown
BS_HOVER=1003; //последнее событие было mousemove
BS_FORM=1004; //мышь двигается по форме

Куда мы будем их присваивать? Неверно, к свойству tag у TImage, оно зарезервировано специально для таких пожарных случаев.

Сразу приведу модифицированный код:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Image1.Tag<>BS_HOVER then
SetState(Image1,IM_HOVER);
Image1.Tag:=BS_HOVER;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Image1.Tag<>BS_UP then
SetState(Image1,IM_MAIN);
Image1.Tag:=BS_UP;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Image1.Tag<>BS_DOWN then
SetState(Image1,IM_DOWN);
Image1.Tag:=BS_DOWN;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Image1.Tag<>BS_FORM then
SetState(Image1,IM_MAIN);
Image1.Tag:=BS_FORM;
end;

Обобщение
Вот и настал тот момент… когда нам надо переходить от одного Image1 к любому TImage, на котором произошло событие. Если ты читал мой блог, то уже знаешь, что надо заменить Image1 на (Sender as TImage) во всех обработчиках событий у Image1.

А что делать при движении мышью по форме? Точно, надо перебрать все компоненты TImage на форме, полезный, кстати, навык:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i:integer;
begin
for i:=0 to ComponentCount-1 do begin
if Components is TImage then begin
if (Components as TImage).Tag<>BS_FORM then
SetState((Components as TImage),IM_MAIN);
(Components as TImage).Tag:=BS_FORM;
end;
end;
end;


Вроде всё чисто и ясно, могу про это потом отдельный пост написать.

Ну и назначим события при старте формы:

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=0 to ComponentCount-1 do begin
if Components is TImage then begin
(Components as TImage).OnMouseDown:=Image1MouseDown;
(Components as TImage).OnMouseUp:=Image1MouseUp;
(Components as TImage).OnMouseMove:=Image1MouseMove;
end;
end;
end;


Итог
Теперь, сколько бы мы TImage не создали в проекте, столько у нас и будет кнопок :)
 
Вверх