Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизНа RTTI-ку навались (пробуем создать инспектор объектов) Найти похожие ветки
← →
Zergling (2003-02-25 06:19) [0]Привет ВСЕМ! Помогите разобраться уважаемые, какие же грабли у меня в коде зарыты.
ValueListProperty - это TValueListProperty (Additional)
В данную процедуру, как объект передаю TComboBox
procedure ShowPropObject(AClass: TObject);
var
PropList: PPropList;
ClassTypeInfo: PTypeInfo;
ClassTypeData: PTypeData;
// OrdTypeInfo: PTypeInfo;
OrdTypeData: PTypeData;
OrdPropInfo: PPropInfo;
I, J: integer;
NumProps: Integer;
S1, S2: string;
S: TStringList;
begin
{ по примеру из книги Xavier Pacheco и Steve Teixeira }
ClassTypeInfo := AClass.ClassInfo;
ClassTypeData := GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount <> 0 then
begin
GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
try
GetPropInfos(AClass.ClassInfo, PropList);
for i := 0 to ClassTypeData.PropCount - 1 do
if not (PropList[i]^.PropType^.Kind = tkMethod) then
begin
if PropList[i]^.PropType^.Kind = tkClass then
begin
if (GetObjectProp(AClass, PropList[i]^.Name)<>nil) and (PropList[i]^.PropType^.Kind <> tkDynArray) then S1 := "+"+PropList[i]^.Name else S1 := PropList[i]^.Name;
S2 := "("+PropList[i]^.PropType^.Name+")";
end else
begin
S1 := PropList[i]^.Name;
S2 := GetPropValue(AClass,PropList[i]^.Name);
end;
FormObjInspector.ValueListProperty.InsertRow(S1, S2, true);
{ Если данное свойство является перечисляемым }
if PropList[i]^.PropType^.Kind = tkEnumeration then
Begin
{ Достань мне информацию о данном свойстве }
OrdPropInfo:=GetPropInfo(AClass, String(PropList[i]^.Name));
OrdTypeData:=GetTypeData(OrdPropInfo^.PropType^);
{ эту перменную (S) после заполнения значениями свойства
приравниваем к FormObjInspector.ValueListProperty.ItemProps[0].PickList }
S := TStringList.Create;
{ Первое свойство которое попадается по пути - HelpType. Переменная S прокручивается в цикле 2 раза
т.к. у HelpType всего два значения (htContext, htKeyword) }
for J:=OrdTypeData.MinValue to OrdTypeData.MaxValue do
S.Add(string(GetEnumName(OrdTypeData.BaseType^, J)));
{ Если выше поставить Break Point, то дельфя показывает "S=()" }
{ Счетчик переменной S не пуст, при попытке присваивания переменной S
вываливается Access Violation (в чем грабли до меня так и недоходит) }
if s.Count <> 0 then FormObjInspector.ValueListProperty.ItemProps[FormObjInspector.ValueListProperty.RowCount-1].PickList:=S;
S.Free;
end;
end;
NumProps := GetPropList(AClass.ClassInfo, [tkMethod], PropList);
for i := 0 to NumProps - 1 do
FormObjInspector.ValueListEvents.InsertRow(PropList[i]^.Name, PropList[i]^.PropType^.Name, true);
finally
FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
end;
end;
end;
← →
Zergling (2003-02-25 12:03) [1]Нет желающих голову над RTTI поломать? Очень жаль.
← →
Владислав (2003-02-25 12:43) [2]А что над ней голову ломать?! Ей пользоваться надо :)
А ошибка, скорее всего, в пятой строчке кода, который ты не привел...
← →
Zergling (2003-02-25 13:34) [3]Владислав © (25.02.03 12:43)
Непонял, это ты про че?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c