Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Содержит ли компонент данное свойство?

11K
24 сентября 2008 года
Babandr
76 / / 05.05.2008
Как программно узнать, содержит ли компонент данное свойство?
Решение из FAQ'a не сработало...Не работает и следующий код:

TStringList *stl=new TStringList();
for (int i=0;i<SDIAppForm->ComponentCount;i++)
{
if (SDIAppForm->Components->FieldAddress("Сaption")!=NULL)
{
AnsiString s=SDIAppForm->Components->Name;
stl->Add(s);
}
}

Вернее, код работает, но список компонентов с данным свойством не заполняется

Подскажите, как быть...
343
24 сентября 2008 года
lena_ki
282 / / 14.04.2005
Можно получить список свойств компонента, а потом найти нужное.
Список свойств можно получить так:
Код:
#include <typinfo.hpp>
....
void __fastcall TForm1::GetPropertyList(TComponent *Component)
{
//берем все, что можно
 Typinfo::TTypeKinds SupportKinds;
         SupportKinds << tkUnknown << tkInteger << tkChar << tkEnumeration <<
           tkFloat <<  tkString << tkSet << tkClass << tkMethod << tkWChar << tkLString << tkWString << tkVariant << tkArray << tkRecord << tkInterface << tkInt64 << tkDynArray;
Typinfo::TPropList pList;
//получаем список свойств
int nPropCount = GetPropList((Typinfo::PTypeInfo)(Component->ClassInfo()),
                                 SupportKinds,
                                ((Typinfo::PPropList)(&pList)));
for( int j = 0; j < nPropCount;  j++)
    ListBox1->Items->Add( pList[j]->Name);
}

если код не откомпилируется, то замените в файле typinfo.hpp строчку:
typedef PPropInfo *PPropList;
на:
typedef TPropList *PPropList;


Вариант №2 (пример для кнопки):
Код:
int GetComponentProperties(TPersistent *Instance, TStrings *AList)
{
  int cnt = GetTypeData((PTypeInfo)Instance->ClassInfo())->PropCount;
  if (cnt)
  {
    PPropList pl = (PPropList)new void*[cnt];
    try
    {
      GetPropInfos((PTypeInfo)Instance->ClassInfo(), pl);
      for (int i = 0; i < cnt; ++i)
      {
        PPropInfo pi = pl;
        if (!pi) break;
        AList->Add(AnsiString(pi->Name)+": "+(*(pi->PropType))->Name);
      }
    }
    __finally {
      delete[] (void**)pl;
    }
  }
  return cnt;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  GetComponentProperties(Button1, ListBox1->Items);
}
11K
24 сентября 2008 года
Babandr
76 / / 05.05.2008
lena_ki, спасибо огромное!!!
Получилось, правда пришлось править typinfo.hpp...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог