Конференция "Компоненты" » Получение списка компонентных свойств
 
  • TStas (18.05.12 22:49) [0]
    Вопрос такой. Например есть меню. У него есть свойство Images. Мы открывает инспектор объектов и это свойство выбираем из списка. Пока окно одно, всё понятно. Список наполняется свеми подходящими компонентами того же окна, которому принадлежит менюшка. А теперь мы добавляем в uses еще одну форму, у которой тоже есть imageList. Он тоже появился в списке возможных свойств. А вопрос в том, а как он там появился?
    Инспектор объектов откуда-то знает список всех возможных значений компонентных свойств. А как у него этот список попросить?
    Меня интересуют свойства типа TMenuItem, а вообще хочу узнать, как это делается. Это нужно, чтобы написать редактор нестандартного свойства - список TMenuItem произвольного размера. Пока это делается в редакторе компонента, а получает он список значений через свойство Owner. Но это как-то криво.
  • DimaBr © (18.05.12 23:32) [1]
    > Инспектор объектов откуда-то знает список всех возможных значений компонентных свойств. А как у него этот список попросить?

    procedure TComponentProperty.GetValues(Proc: TGetStrProc);
    begin
     Designer.GetComponentNames(GetTypeData(GetPropType), Proc);
    end;



    >а вообще хочу узнать, как это делается.
    Это тайна.
    Лично я, например, делаю так

    procedure TBrCustomDesigner.GetComponentObjNames;
    var Pref: string;
       i: integer;
       C: TComponent;
    begin
     Pref := '';
     if Assigned(ARoot)
       then Pref := ARoot.Name + DotSep
       else ARoot := Root;
     with ARoot do
       for i := 0 to ComponentCount - 1 do begin
        C := Components[i];
        if C <> Form then
          if C.ClassType.InheritsFrom(TypeData^.ClassType) then Proc(Pref + C.Name);
      end;
    end;

    procedure TBrCustomDesigner.GetComponentNames;
    var i: integer;
       C: TComponent;
       List: TList;
    begin
     if Root = nil then Exit;
     GetComponentObjNames(nil, TypeData, Proc);
     List := TList.Create;
     GlobalDesignManager.GetGlobalComponents(Root, List);
     for i := 0 to List.Count - 1 do begin
       C := TComponent(List[i]);
       if C <> Root then GetComponentObjNames(C, TypeData, Proc);
     end;
    end;

 
Конференция "Компоненты" » Получение списка компонентных свойств
Есть новые Нет новых   [118670   +55][b:0][p:0.001]