Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание своего компонента ComboBox с меткой Label 
:(
    Опции темы
Нитонисе
Дата 4.2.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Компонент делаю на основе базового класса TWinControl. У него всего пока одно свойство - FCaption - содержание метки. Оно опубликовано в инспекторе свойств:
Код

__property AnsiString Caption = {read = FCaption, write = SetCaption};

Вот функция SetCaption:
Код

void __fastcall TLabeledComboBox::SetCaption(AnsiString value)
{
  FCaption = value;
}

А вот конструктор компонента:
Код

__fastcall TLabeledComboBox::TLabeledComboBox(TComponent* Owner)
        : TWinControl(Owner)
{
  FCaption = "Caption";
  TComboBox *cb = new TComboBox(this);
  cb->Left = 0;
  cb->Top = 0;
  cb->Width = 121;
  cb->Parent = this;
  TLabel *l = new TLabel(this);
  l->Top = 4;
  l->Left = 124;
  l->Caption = FCaption;
  l->Parent = this;
  Height = 21;
  Width = 124 + l->Width;
}


Вопросы такие:
1. В инспекторе свойств появляется строка Caption, но при ее изменении на - форме экземпляр компонента содержимое метки не меняет. Там так и остается строка по умолчанию "Caption". Почему?
2. При растяжении компонента на форме хотелось бы, чтобы растягивался и комбобокс, являющийся частью проектируемого компонента. Но он не растягивается. Как сделать?
3. В похожем компоненте LabeledEdit метка отрисовывается как-то интересно. Такое ощущение что на канве родителя. Так ли это и возможно ли это?
PM MAIL   Вверх
xvr
Дата 7.2.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  4.2.2011,  16:53 Найти цитируемый пост)
1. В инспекторе свойств появляется строка Caption, но при ее изменении на - форме экземпляр компонента содержимое метки не меняет. Там так и остается строка по умолчанию "Caption". Почему?
Потому что ваша переменная класа FCaption не имеет никакого отношения к свойству Caption метки, которую вы кстати создали, и даже не сохранили.  smile 

Цитата(Нитонисе @  4.2.2011,  16:53 Найти цитируемый пост)
2. При растяжении компонента на форме хотелось бы, чтобы растягивался и комбобокс, являющийся частью проектируемого компонента. Но он не растягивается. Как сделать?
Поставьте ему соотвестующие Anchor'ы


PM MAIL   Вверх
Нитонисе
Дата 7.2.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



xvr
Спасибо, с этими вопросами разобрался. Добавил в компонент два указателя на комбобокс и метку соответственно. 
Хотелось бы иметь возможность пользоваться всем набором свойств комбобокса и метки в инпекторе. Как опубликовать все стандартные свойства этих двух составляющих моего компонента? Вручную, так это ж черти сколько свойств надо переписывать.

Это сообщение отредактировал(а) Нитонисе - 7.2.2011, 19:31
PM MAIL   Вверх
xvr
Дата 7.2.2011, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  7.2.2011,  19:31 Найти цитируемый пост)
Как опубликовать все стандартные свойства этих двух составляющих моего компонента?
Опубликовать их (саму метку и комбобокс)  как проперти твоего компонента



Это сообщение отредактировал(а) xvr - 7.2.2011, 19:38
PM MAIL   Вверх
Нитонисе
Дата 11.2.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  7.2.2011,  19:37 Найти цитируемый пост)
Опубликовать их (саму метку и комбобокс)  как проперти твоего компонента

Ага, все получилось, благодарю)
Код

class PACKAGE TLabeledComboBox : public TWinControl
{
private:
  TComboBox *FComboBox;
  TLabel *FLabel;
  AnsiString FCaption;
protected:
  void __fastcall SetCaption(AnsiString value);
public:
        __fastcall TLabeledComboBox(TComponent* Owner);
__published:
  __property AnsiString Caption = {read = FCaption, write = SetCaption};
  __property TComboBox *ComboBox = {read = FComboBox};
};


Это сообщение отредактировал(а) Нитонисе - 11.2.2011, 15:48
PM MAIL   Вверх
Нитонисе
Дата 11.2.2011, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Появился еще один вопрос. У своего нового компонента я объявил событие OnClick, которое по задумке должно возникать только при щелчке на комбобоксе и обрабатываться должно стандартным способом. При щелчке на метке ничего не должно происходить. Как это сделать?
PM MAIL   Вверх
xvr
Дата 11.2.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Сделать событие OnClick и вручную замкнуть его на событие Combobox'а 
Event в компоненте - это обычная проперть (типа __closure*), и для нее можно задать сетеры и гетеры. Задай их и перенаправь на твой ComboBox->OnClick

PM MAIL   Вверх
Нитонисе
Дата 11.2.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  11.2.2011,  21:20 Найти цитируемый пост)
Сделать событие OnClick и вручную замкнуть его на событие Combobox'а Event в компоненте - это обычная проперть (типа __closure*), и для нее можно задать сетеры и гетеры. Задай их и перенаправь на твой ComboBox->OnClick

Вот объявление класса компонента
Код

private:
  TComboBox *FComboBox;
  TLabel *FLabel;
  TNotifyEvent FOnClick; // переменная события
protected:
  void __fastcall SetCaption(AnsiString value);
public:
        __fastcall TLabeledComboBox(TComponent* Owner);
__published:
  __property AnsiString Caption = {read = FCaption, write = SetCaption};
  __property TComboBox *ComboBox = {read = FComboBox};
  __property TLabel *Label = {read = FLabel};
  __property TNotifyEvent OnClick = {read = FOnClick, write = FOnClick}; // опубликовали переменную и видим ее в инспекторе
};

Вот теперь вопрос в том, как событию нового компонента сопоставить событие комбобокса. Я так думаю это нужно делать в конструкторе
Код

__fastcall TLabeledComboBox::TLabeledComboBox(TComponent* Owner)
        : TWinControl(Owner)
{
  FComboBox = new TComboBox(this);
  FComboBox->Parent = this;
  FComboBox->Left = 0;
  FComboBox->Top = 0;
  FComboBox->Width = 121;
  FComboBox->Anchors << akLeft << akRight;
  FOnClick = FComboBox->OnClick; // попытался перенаправить обаботку клика с нового компонента на комбобокс.
}

Но этот код не работает. Как все же это сделать?
PM MAIL   Вверх
mes
Дата 12.2.2011, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  11.2.2011,  20:46 Найти цитируемый пост)
 FOnClick = FComboBox->OnClick; // попытался перенаправить обаботку клика с нового компонента на комбобокс.

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

с Билдером не работал, но интуитивно полагаю, что 
Вам нужно определить сеттер, как функцию принимающую обработчик и ее подсунуть в FComboBox->OnClick..



--------------------
PM MAIL WWW   Вверх
xvr
Дата 12.2.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Код

private:
  TComboBox *FComboBox;

__published:
 void __fastcall SetOnClick(TNotifyEvent e) {FComboBox->OnClick=e;}
 TNotifyEvent __fastcall GetOnClick() {return FComboBox->OnClick;}

 __property TNotfiyEvent OnClick = {read=GetOnClick, write=SetOnClick};

PM MAIL   Вверх
Нитонисе
Дата 14.2.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



xvr
Не работает этот код. То есть я пишу код в обработчике события нового компонента, который не выполняется при клике.

Добавлено @ 14:38
Цитата(mes @  12.2.2011,  00:09 Найти цитируемый пост)
с Билдером не работал, но интуитивно полагаю, что Вам нужно определить сеттер, как функцию принимающую обработчик и ее подсунуть в FComboBox->OnClick..

Я не совсем представляю себе работу сеттеров и ридеров... в какой момент выполняются соответствующие функции?

Это сообщение отредактировал(а) Нитонисе - 14.2.2011, 14:38
PM MAIL   Вверх
xvr
Дата 14.2.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  14.2.2011,  14:31 Найти цитируемый пост)
Не работает этот код.
Должен

Цитата(Нитонисе @  14.2.2011,  14:31 Найти цитируемый пост)
То есть я пишу код в обработчике события нового компонента, который не выполняется при клике.
Покажите, что у вас получилось


PM MAIL   Вверх
Нитонисе
Дата 14.2.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  14.2.2011,  17:54 Найти цитируемый пост)
Покажите, что у вас получилось

Это заголовочный файл
Код

class PACKAGE TLabeledComboBox : public TWinControl
{
private:
  TComboBox *FComboBox;
  TLabel *FLabel;
  AnsiString FCaption;
  TNotifyEvent FOnClick;
protected:
  void __fastcall SetCaption(AnsiString value);
  void __fastcall SetOnClick(TNotifyEvent event);
  TNotifyEvent __fastcall GetOnClick();
public:
        __fastcall TLabeledComboBox(TComponent* Owner);
__published:
  __property AnsiString Caption = {read = FCaption, write = SetCaption};
  __property TComboBox *ComboBox = {read = FComboBox};
  __property TLabel *Label = {read = FLabel};
  __property TNotifyEvent OnClick = {read = GetOnClick, write = SetOnClick};
};

Это исполняемый файл
Код

__fastcall TLabeledComboBox::TLabeledComboBox(TComponent* Owner)
        : TWinControl(Owner)
{
  FCaption = "Caption";

  FComboBox = new TComboBox(this);
  FComboBox->Parent = this;
  FComboBox->Left = 0;
  FComboBox->Top = 0;
  FComboBox->Width = 121;
  FComboBox->Anchors << akLeft << akRight;
  //FOnClick = FComboBox->OnClick;

  FLabel = new TLabel(this);
  FLabel->Parent = this;
  FLabel->Top = 4;
  FLabel->Left = 123;
  FLabel->Caption = FCaption;
  FLabel->Anchors << akRight >> akLeft;

  Height = 21;
  Width = 124 + FLabel->Width;
  Constraints->MaxHeight = 21;
  Constraints->MinHeight = 21;
}
//---------------------------------------------------------------------------
void __fastcall TLabeledComboBox::SetCaption(AnsiString value)
{
  FCaption = value;
  FLabel->Caption = value;
  int ComboWidth = FComboBox->Width;
  int LabelWidth = FLabel->Width;
  Width = ComboWidth + LabelWidth + 2;
  FComboBox->Width = ComboWidth;
  FLabel->Left = ComboWidth + 2;
}
//---------------------------------------------------------------------------
void __fastcall TLabeledComboBox::SetOnClick(TNotifyEvent event)
{
  FComboBox->OnClick = event;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TLabeledComboBox::GetOnClick()
{
  return FComboBox->OnClick;
}
//---------------------------------------------------------------------------
namespace Labeledcombobox
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TLabeledComboBox)};
                 RegisterComponents("MyComponents", classes, 0);
        }
}
//---------------------------------------------------------------------------

А это обработчик клика уже при использовании нового компонента
Код

void __fastcall TForm1::LabeledComboBox1Click(TObject *Sender)
{
  ShowMessage("Click!");
}

PM MAIL   Вверх
mes
Дата 14.2.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  14.2.2011,  13:31 Найти цитируемый пост)
Я не совсем представляю себе работу сеттеров и ридеров...

сеттер вызывается для изменения поля, а геттер для получения значения..
так например 
Код

field += 4; 

"преврашается" в
Код

set_field( get_field()+4);



--------------------
PM MAIL WWW   Вверх
xvr
Дата 14.2.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Вроде все ок. Видимо при стриминге свойств передрались обработчики OnClick компонента и КомбоБокса внутри него (оба пишут в одно и тоже место, но из 2х разных мест). Видимо придется врезаться в сам TComboBox (делать от него наследника и перехватывать событие раньше).

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.