Вниз
Скачать: CL | DM;

На 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.01 c
14-17375
AK-74
2003-02-18 19:41
2003.03.06
Есть здесь студенты СГУ?


3-16949
Жук
2003-02-17 10:44
2003.03.06
Перестановка колонок DBGrid а


3-16879
Aristarh
2003-02-17 14:35
2003.03.06
Как из делфей открыть базу mde Access?


14-17297
chernoruk
2003-02-19 23:15
2003.03.06
управление Media Player


3-16923
Beka
2003-02-16 12:14
2003.03.06
Проблемы c Transaction и Session




   Наверх