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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2016, 09:14   #1
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
Вопрос Установка фокуса в свой компонент

Доброго всем дня. Имеется компонент который унаследован от класса TComponent.
Раньше установка фокуса в него не требовалась. Но теперь понадобилось.
Подскажите пожалуйста как можно прикрутить к компоненту возможность установки фокуса.

Среда Delphi 7.
Dagmanor вне форума Ответить с цитированием
Старый 01.06.2016, 09:49   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Например, у TControl есть метод SetFocus,
а вот что делать с наследником TComponent - не подскажу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.06.2016, 09:53   #3
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию

Возможно я не прав, но мне кажется, что надо сделать по аналогии с TWinControl.
добавить к компоненту
- Handle: HWnd;
- procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
- procedure WMKillFocus(var Message: TWMSetFocus); message WM_KILLFOCUS;
- procedure CreateHandle;
- procedure CreateParams(var Params: TCreateParams);
и еще -надцать методов.
Но вот не знаю правильно ли это будет
Dagmanor вне форума Ответить с цитированием
Старый 01.06.2016, 10:01   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

TComponent -> TControl -> TWinControl
И SetFocus впервые появляются в TWinControl. Там бы и смотрел сырцы
Цитата:
Но вот не знаю правильно ли это будет
Если сделаешь правильно, то таким оно и будет. Наследуй от TWinControl, чего себе геморрой устраивать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.06.2016, 10:03   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я не очень компетентен в этом, но лично я не вижу принципиальных ошибок в данном подходе, на мой взгляд - да, так правильно.

сейчас знающие люди подтянутся, выскажут своё мнение.

Цитата:
Сообщение от Аватар
Наследуй от TWinControl, чего себе геморрой устраивать
Вот! Категорически согласен.
Зачем придумывать велосипед, когда можно его просто взять и поехать?!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.06.2016, 10:10   #6
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию

Про велосипед я тоже согласен . Только компонент этот был изначально создан не мной. И прекрасно служил своим целям. Пока не появилась надобность в фокусе...
Dagmanor вне форума Ответить с цитированием
Старый 01.06.2016, 11:14   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Ну покажи компонент-то, ёмаё!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 02.06.2016, 23:44   #8
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Лампочка Perform -WM_SETFOCUS

Цитата:
Сообщение от Dagmanor Посмотреть сообщение
как можно прикрутить к компоненту возможность установки фокуса.
Perform-м можно). Или надо в событии чтоб было (True/False)?

Код:
Button1.Perform(WM_SETFOCUS, 0, 0);
Или смотрим любой компонент, там где есть ShowFocus:

Код:
private
    { Private declarations }
    FShowFocus : Boolean;  //Show indicator rectangle when we have focus?
procedure SetShowFocus(Value : Boolean);  //Draw Rect when we have focus True/False
Код:
published
    { Published declarations }
    property ShowFocus : Boolean read FShowFocus
       write SetShowFocus default TRUE;
procedure Register;

implementation

Код:
constructor TBtn.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FShowFocus := TRUE;             //Draw focusr
end;


Код:
procedure TBtn.Paint;
///////////////////////////////
  if not (csDesigning in ComponentState) then
    if FShowFocus = TRUE then
      if Focused then
        bm.Canvas.DrawFocusRect(RECT(2,  2, Width - 2, Height - 2));

Код:
procedure TBtn.SetShowFocus(Value : Boolean);
begin
  if FShowFocus <> Value then
    FShowFocus := Value;
end;

Последний раз редактировалось beegl; 02.06.2016 в 23:59. Причина: add text
beegl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
свой компонент в Delphi seattle BLACK_RAIN Компоненты Delphi 2 03.05.2016 10:04
Установка таймера обратного отсчета на свой блог dasingoz WordPress и другие CMS 0 19.08.2015 00:57
Установка фокуса в dblookupcombobox ГренЛа БД в Delphi 1 12.06.2012 09:18
свой текстовый компонент xrob Компоненты Delphi 2 27.02.2011 01:24
Как создать свой компонент? Д'якон Компоненты Delphi 1 21.05.2008 16:37