#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);
}
Содержит ли компонент данное свойство?
Решение из 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);
}
}
Вернее, код работает, но список компонентов с данным свойством не заполняется
Подскажите, как быть...
Список свойств можно получить так:
Код:
если код не откомпилируется, то замените в файле 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);
}
{
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);
}
Получилось, правда пришлось править typinfo.hpp...