Конференция "Начинающим" » RTTI чтение свойств объектов [D7, XP]
 
  • RedDragon (10.11.17 11:02) [0]
    Есть некоторый объект TBase, в котором описан тип                             Type   TFigure = (Rect,Elipse,RoundRect);
    published
        property   TypeFigure : TFigure read  fTypeFigure   write  SetTypeFigure ;
    Теперь я хочу прочитать это свойство и занести в ValueListEditor, это я делаю. Но мне нужно еще прочитать и значения  типа TFigure и занести их в выпадающий список. Помогите как это сделать.

    Type   TFigure = (Rect,Elipse,RoundRect);
    published
        property   TypeFigure : TFigure read  fTypeFigure   write  SetTypeFigure ;
    ---------------------------------------------------------------------------------------------------------
    // Заносим данные в VLE из Объекта
     Procedure TfMain.WriteVLE(VLE : TValueListEditor; NumObjList : Integer);
      Var
       I,J,N,Z,M: Integer;                                                                                                                                                              TypeData,D : PTypeData;                                                                                                                                          List,L     : PPropList;                                                                                                                                                               Obj : TBase;                                                                                                                                                                 Key,Value : String;                                                                                                                                                             Ti : PTypeInfo;
      Begin                                                                                                                                Obj:=TBase(fEdit.List[NumObjList]);                                                                                                               TypeData := GetTypeData(Obj.ClassInfo);                                                                                                                      N := TypeData.PropCount;
        If  N < 0 then Exit;
        GetMem(List,SizeOf(PPropInfo)*N);
         try
           GetPropInfos(Obj.ClassInfo,List);
          For I:=0 to N-1 do
           Begin

            // Имя свойства
             Key  := List[i]^.Name;
            Case List[I].PropType^.Kind of
             tkInteger :  
                      Begin  
                       Value:= IntToStr(GetOrdProp(Obj,List[i]));
                        // Добавим новую строку  VLE
                         VLE.InsertRow(Key,Value,True);
                    End;


              // Перечисляемый тип
             tkEnumeration : Begin
                                         Value:= IntToStr(GetOrdProp(Obj,List[i]));
                                           VLE.InsertRow(Key,Value,True); // Записываем  свойство в ValueListEditor
                               // Т.к. свойство перечисляемого типа то сделаем выпадающий список
                              VLE.ItemProps[VLE.RowCount-2].EditStyle:=esPickList;
                               // Тут я должен получить значения TFigere - Rect,Elipse,RoundRect  и записать в
                                  // выпадающий список, я могу получить значения кодом который в скобках
                                // но я имею тип в виде строки  - 'TFigure' а мне надо в виде типа.  
                               VLE.ItemProps[VLE.RowCount-2].PickList.Add('1');
                                VLE.ItemProps[VLE.RowCount-2].PickList.Add('2');

                                 {
                               Ti:=TypeInfo((List[i]^.PropType^.Name)); //(TBrushStyle);
                               D := GetTypeData(Ti);
                               For j:=D.MinValue to D.MaxValue Do
                                    VLE.ItemProps[VLE.RowCount-2].PickList.Add(GetEnumName(Ti,j));
                               }

                             End;
             End; // Case
            End;//For

           finally
           FreeMem(List,SizeOf(PPropInfo)*N);
         end;

     End;


  • Игорь Шевченко © (10.11.17 12:06) [1]
    Плохо отформатировано, так лучше:

    Type   TFigure = (Rect,Elipse,RoundRect); published property TypeFigure:TFigure
    read  fTypeFigure   write  SetTypeFigure ; ------------------------------------
    // Заносим данные в VLE из Объекта
    Procedure TfMain.WriteVLE(VLE : TValueListEditor; NumObjList : Integer); Var I,J
    ,N,Z,M: Integer; TypeData,D : PTypeData; List,L:PPropList;Obj:TBase;Key, Value :
    String;Ti: PTypeInfo;  Begin  Obj:= TBase (fEdit.List[ NumObjList]); TypeData :=
    GetTypeData(Obj.ClassInfo); N:=TypeData.PropCount; If N<0 then Exit; GetMem(List
    ,SizeOf( PPropInfo)* N); try GetPropInfos(Obj.ClassInfo,List);For I:=0 to N-1 do
    Begin // Имя свойства
    Key  := List[i]^.Name; Case List[I].PropType^.Kind of tkInteger: Begin  Value :=
    IntToStr(GetOrdProp(Obj,List[i])); // Добавим новую строку  VLE
    VLE.InsertRow(Key,Value,True); End;
    // Перечисляемый тип
    tkEnumeration : Begin Value:= IntToStr(GetOrdProp(Obj,List[i])); VLE.InsertRow (
    Key,Value,True); // Записываем  свойство в ValueListEditor
    // Т.к. свойство перечисляемого типа то сделаем выпадающий список
    VLE.ItemProps[VLE.RowCount-2].EditStyle:=esPickList;
    // Тут я должен получить значения TFigere - Rect,Elipse,RoundRect  и записать в
    // выпадающий список, я могу получить значения кодом который в скобках
    // но я имею тип в виде строки  - 'TFigure' а мне надо в виде типа.  
    VLE.ItemProps[VLE.RowCount-2].PickList.Add('1'); VLE.ItemProps[VLE.RowCount-2 ].
    PickList.Add('2'); End; End; End; finally FreeMem(List,SizeOf(PPropInfo)*N); end;
    End;

 
Конференция "Начинающим" » RTTI чтение свойств объектов [D7, XP]
Есть новые Нет новых   [118482   +49][b:0][p:0.006]