Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.06;
Скачать: 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 вся ветка

Текущий архив: 2003.03.06;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
14-17390
antdrnc
2003-02-18 18:16
2003.03.06
Kylix3 C++ и libqt ?


14-17324
jen_bond
2003-02-17 08:07
2003.03.06
Автозапуск при вставлении cd-диска


1-17062
Studentas
2003-02-25 11:27
2003.03.06
русскии MessageDlg


1-17106
OlDemon
2003-02-26 07:03
2003.03.06
Преобразование числа в текст


6-17221
Anton
2003-01-16 17:27
2003.03.06
Как программно получить доступ к вложениям электронной почты