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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2016, 01:22   #1
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию Компонент наследник TButton не работает совсем!

Здравствуйте коллеги!

Столкнулся с одной проблемой, которую не могу победить долгое время.

Начну наверное с того что у меня Delphi 10.1 Berlin

Я создал компонент на основе TButton, но он не работает.
В компоненте мне надо создать компонент TImage и Label
Когда всё собираю и кладу компонент на форму, то отображается в дизайнере как надо, но при запуске кнопка выглядет как Panel кой то и не реагирует как Button(на наведение и нажатие мыши). Но компонент Image и Label присутствуют.
Компоненты Image и Label не перекрывают полностью кнопку, да и без них вообще пробывал. Комонент который наследуется от TButton перестаёт реагировать как кнопка и как будто превращается в TPanel
У меня Windows 10(но думаю с этим не связано)

Кто подскажет, в чём может быть дело, а то бьюсь долго, но видимо что то не так делаю. Обычный TBitBtn не подойдёт, да и разобраться хочется в чём дело.

При наведении на Image и при нажатии думаю тоже проблемы будут, но я думаю решу, тут главное вообще разобраться куда свойства кнопки утекают. Спасибо!

Код прилагаю.

Код:
unit CBSButton;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Buttons;

type
  TCBSButton = class(TButton)
  private
    { Private declarations }
    Image: TImage;
    Text: TLabel;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation


constructor TCBSButton.Create(AOwner: TComponent);
begin
  { Вызовем конструктор из "предка" }
  inherited create(Aowner);
  Image := TImage.Create(AOwner);
  Image.Parent:=self;
  Image.Align := alLeft;
  Image.Width := Image.Height;
  Text := TLabel.Create(AOwner);
  Text.Parent :=self;
  Text.Layout := tlCenter;
  Text.Caption := 'Тест 4';
  Text.Align  := alRight;
  Text.Margins.Left := 4;
  Text.AlignWithMargins := true;
end;

procedure Register;
begin
  RegisterComponents('CBS', [TCBSButton]);
end;

end.
Leximus вне форума Ответить с цитированием
Старый 18.11.2016, 02:20   #2
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

Вроде разобрался...
У меня
Image: TImage;
Text: TLabel;
Стояли объявлены были в Private, переместил, вроде заработало.

Остался вопрос как сделать что бы Image и Label были частью кнопки, а не "загараживали" её.

Что бы при нажатии по кнопке где находится Картинка или Label срабатывала именно кнопка, и соответственно работала реакция на наведение мыши на кнопку в любом месте, так где Image и Label тоже
Leximus вне форума Ответить с цитированием
Старый 18.11.2016, 09:45   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

что я бы попробовал
1.запрет на получение "внутренними" компонентами получения фокуса.
Код:
image.Enabled:=false;
text.Enabled:=false;
не обещаю что заработает как надо.

2. попробовать "транслировать" сообщения от Image(TImage) и Text (TLabel) в "свою" кнопку.
Код:
Image:=TImage.Create(Self);
...
Image.Onclick:=DoClickMyButton; //при нажатии на мою картинку сделать для меня это

procedure TCSButton.DoClickMyButton(sender: TObject);
begin// ура нажали мою картинку (а может и не только ее, а еще и текст), так что

  self{меня}.Click{нажмем};
end;
3 .это сложнее. (лучше оставить на самый крайний случай)
Рисовать картинку и текст САМОМУ на канве кнопки.
хотя обычно компоненты так и поступают.
отказаться от TLabel и Timage.

4. отказаться от своего компонента и перейти к фреймам. (TFrame)

5.
Цитата:
А у вас Delphi 10. Просто в Delphi 7 и так всё работает.
http://programmersforum.ru/showpost....46&postcount=4
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.11.2016 в 09:58.
evg_m вне форума Ответить с цитированием
Старый 18.11.2016, 12:27   #4
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

1. Данный запрет ничего не даст, сделает объекты только ни активными, но они как прежде будут отображаться.

2. При транслировании таким способом процедура нажатия конечно выполнится, но эффекта нажатии на кнопке не будет, да и не будет эффекта при наведении мышки на курсор.

3. Действительно лучше рисовать самому, и действительно вопрос с остальным сразу пропадёт, но боюсь это не так быстро. Но в дальнейшем так и сделаю.

4. Мне именно нужна кнопка, остальное не подойдёт
Leximus вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает написанная функция через Tbutton pimple2006 Общие вопросы Delphi 6 11.12.2011 00:04
Ряды (не совсем правильно работает) pesik.aravir Помощь студентам 3 02.05.2011 13:06
Не совсем корректно работает программа alexchromets Помощь студентам 2 26.12.2010 19:45
Sharepoint не совсем работает табличное представление. jojahti Софт 0 16.11.2009 12:48
Компонент TButton... slim5 Помощь студентам 7 17.06.2008 17:58