Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2008, 23:22   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Восклицание Кнопка, потомок от TImage

Решил создать на основе Timage кнопку с подгружаемыми картинками, но вот что-то глючит(имено в когда кнопка как потомок). Раньше делал графические кнопки используя события мыши над компонентами( MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); ) и всё работало, а когда решил перенести их в компонент неидёт нормально. Может кто поделиться в дополнение к вопросу консультацией как создавать графические компоненты(с упрощёными рабочими примерами, чтобы иметь опуру что делать). Для начало хочу разобраться со своим компонентом, а потом хотелось бы изучить материал(без нагромождений информацией) по созданию вообщем.

Прилагаю наработку(есть коментарии, думаю понятно будет):

ImgBtn.pas - сам компонент; Viz.pas - Собственно для тестирования компонента без установки в палитру.
Вложения
Тип файла: rar Кнопка из TImage.rar (14.0 Кб, 47 просмотров)

Последний раз редактировалось Alter; 03.01.2008 в 23:26.
Alter вне форума Ответить с цитированием
Старый 04.01.2008, 01:54   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Просмотрел по быстрому, есть кое-какие замечания:
1. В методах SetNorml, SetMove и SetClik не нужно указывать inherited, ведь эти методы не переопределены. Какие у них могут быть "предки"?
2. Переменные X и Y (и вообще любые, которые используются объектами) не стоит делать глобальными. Ведь однотипных объектов может быть несколько, а эти переменные только в одном экземпляре! Вполне возможны ситуации, когда один объект начал "меняться" и читать/менять эти переменные, в этот момент происходит какое-то событие и вызываются методы второго подобного объекта и он тоже начинает менять эти же переменные. Когда управление возвращается первому объекту, то он, ничего не подозревая, продолжает использовать измененные не им значения. Вобщем, или создать дополнительные поля в классе, или объявлять переменные локально (в данном случае это лучше).
3. Поле FActive очень желательно инициализировать в конструкторе - директива Default False не означает, что переменная инициализируется как False, это всего лишь указания о несохранении этого значения в dfm-файле.
4. Возможно Canvas.Font := Fon лучше заменить на Canvas.Assign(Fon). А еще стоит перерисовывать картинку перед выводом надписи, иначе надписи с разными шрифтами станут накладываться друг на друга.
5. Строки в подпрограммы лучше передавать по ссылке, т.е. как const S :String

Это так, навскидку. Реально не я тестировал.
Jeni вне форума Ответить с цитированием
Старый 04.01.2008, 10:08   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если есть желание делать на основе картинок тобиш BitMap'оп то лучше сделать два класса, а именно:

Код:
type
TButtonStyler = class(TComponent)
private
FNormalImg: TBitmap;
FHotImg: TBitMap;
FDownImg: TBitMap;
FDisableImg: TBitMap;

// тут реализуете присваивание ко всем битмапам типа
procedure SetNormalImg(Value: TBitMap);
{
FNormalImg.Assign(Value);
}
// ну и так далее
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property NormalImage: TBitMap read FNormalmg write SetNormalImg nodefault;
// далее по аналогии для других битмапов
end;

TButtonState = (bsNormal, bsHot, bsDown);
// если not Enabled то этот режим не юзаем

TButtonImg = class(TCustomControl)
private
FButtonStyler: TButtonStyle;
FButtonState: TButtonState;

// ну так же реализуем присваивание
procedure SetButtonStyler(Value: TButtonStyler);
{
if Value <> FButtonStyler then
begin
FButtonStyler := Value;
RePaint;
end;
}

// для смены статуса
procedure SetState(Value: TButtonState);
{
if FButtonState <> Value then
begin
FButtonState := Value;
RePaint;
end;
}

procedure WMLBUTTONDOWN(var Message: TWMLBUTTONDOWN); message WM_LBUTTONDOWN;
{
соответственно в этом реализуем подобное

inherited;
SetState(bsDown); ну тут нажатие поэтому bsDown...
}
procedure WMLBUTTONUP(var Message: TWMLBUTTONUP); message WM_LBUTTONUP;
// ну и так далее по событиям сообщения в MSDN смотрите
// и в каждой подобной процедуре пишете чтот типа такого
{
inherited;
RePaint;
}
// для того чтобы не было мерцания ловим это
procedure WMERASEBKGND(var Message: TMessage); message WM_ERASEBKGND;
// в теле этой процедуры пишем вот
{
if not Assigned(FButtonStyler) then
inherited;
}
public
procedure Paint; override; // тут вся отрисовка
published
property ButtonStyler: TButtonStyler read FButtonStyler write SetButtonStyler nodefault;
end;

...

implementation

procedure TButtonImg.Paint;
var
Draw: TBitMap;
begin
if not Assigned(FButtonStyler) then exit; // т.е. нечего рисовать
Draw := TBitMap.Create;

if not Enabled then
Draw.Assign(FButtonStyler.DisableImage) else
case FButtonState of
bsNormal: Draw.Assign(FButtonStyler.NormalImage);
bsHot: Draw.Assign(FButtonStyle.HotImage);
bsDown: Draw.Assign(FButtonStyle.DownImage);
end;

// ну тут если хотите выводите текст и т.п. но уже готово сама кнопка :) 

Canvas.Draw(0, 0, Draw);
Draw.Free;
end;
Вот тренеруйтесь... ну это на быструю руку
BOBAH13 вне форума Ответить с цитированием
Старый 04.01.2008, 22:09   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Мне бы надо чтобы JPG формат использовать можно было, поэтому то и выбрал TImage.
Alter вне форума Ответить с цитированием
Старый 04.01.2008, 23:37   #5
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Вообще-то, TImage не связан с каким-то конкретным форматом.
Jeni вне форума Ответить с цитированием
Старый 05.01.2008, 09:35   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

А кто вам мешает такое сделать ? Да и вообще нет такого в gdi Jpeg так что полюбому придеться bmp

Код:
uses Jpeg;
ну меняете все TBitMap на TJpegImage. А потом при отрисовке в переменной TBitMap делаете чтот такое Bmp.Assign(Jpeg); и потом работаете с Bmp отрисовали освободили.
BOBAH13 вне форума Ответить с цитированием
Старый 13.01.2008, 12:57   #7
Cep
Новичок
Джуниор
 
Регистрация: 13.01.2008
Сообщений: 1
По умолчанию

Может стоит посмотреть http://www.delphikingdom.com/asp/vie...catalogid=1198
а исходник взять лучше отсюда http://www.delphikingdom.com/asp/vie...catalogid=1301
Cep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кнопка не создается Манжосов Денис :) Компоненты Delphi 10 28.04.2008 17:43
кнопка как ссылка bill HTML и CSS 3 05.01.2008 12:57
Потомок от HotKey Alter Компоненты Delphi 4 03.01.2008 15:47
Вогнутая кнопка John_chek Общие вопросы Delphi 5 20.11.2007 14:21
Кнопка BitBtn Yurek Общие вопросы Delphi 10 05.11.2007 18:42