Конференция "Компоненты" » как получить список возможных вариантов выбора св-ва [D7, WinXP]
 
  • zsv (07.09.11 14:28) [0]
    день добрый.
    имеется на форме визуальный компонент в котором есть класс типа Type1=class(TCollection) и в нем соответственно набор типа Type2=class(TCollectionItem).
    Имеется также на форме другой компонент у которого есть св-во Х типа Type2.
    Как мне сделать так чтобы в инспекторе обьектов у второго компонента на свойстве Х был выпадающий список всех возможных вариантов (которые есть у первого компонента). Ну аналогично тому как в свойстве PopupMenu появляется список всех доступных попапов.
    Прошу прощения если вопрос задан коряво...
  • DimaBr © (08.09.11 00:22) [1]
    Для этого нужно
    1. Чтобы Item-ы отличались друг от друга
    2. написать редактор свойства
    3. зарегистрировать редактор свойства

    На мой взгляд, проще всего хранить номер Itema, то есть свойства X - целое, плюс к нему  можно прикрутить редактор
  • zsv (08.09.11 12:04) [2]
    а не подскажете какой-нить станд. компонент где реализован такой редактор свойства (чтобы на живом примере так сказать...)
  • DimaBr © (08.09.11 12:50) [3]
    Стандартного не припомню, но должно получиться примерно так (пишу на ходу, поэтому возможны небольшие ошибочки)

    TMyItem = class(TCollectionItem)
     published
        property Name: string read fName write fName; // свойство для отличия одного итема от другого
    end;

    TMyComponent = class(TComponent)
     published
       property AComp: TComponentCollection; // компонент с коллекцией
       property X: integer read fX write fX; // свойство указывающее на № Itema
    end;
    // редактор свойства (должен быть в другом модуле)

    TMyItemListProperty = class(TStringProperty)
     function GetAttributes: TPropertyAttributes; override;
     procedure GetValues(Proc: TGetStrProc); override;
    end;

    function TMyItemListProperty.GetAttributes: TPropertyAttributes;
    begin
     Result := [paValueList, paSortList];
    end;

    procedure TMyItemListProperty.GetValues(Proc: TGetStrProc);
    var I: Integer;
        A: TComponentCollection;
    begin
    // получаем коллекцию из компонента который привязан
       A :=   TMyComponent(GetComponent(0)).AComp;
       if not Assigned(A) then Exit;
       for I := 0 to A.Items.Count - 1 do
          Proc(A.Items[i].Name);
    end;

    procedure Register;
    begin
      RegisterComponents('вкладка',[компоненты]);
      RegisterPropertyEditor(TypeInfo(integer), TMyComponent , 'X', TMyItemListProperty);
    end;

  • icWasya © (08.09.11 13:46) [4]
    В сабже было указано, что коллекция и компонент, в котором свойство - элемент коллекции - это разные компоненты.

    Тогда в дополнение к вышеприведённому коду.

    TMyCollection = class(TComponent)
    published
      property AComp: TComponentCollection; // компонент с коллекцией
    end;

    TMyComponent = class(TComponent)
    protected
      procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
    published
      property Collection: TMyCollection read FCollection write SetCollection; // компонент с коллекцией
      property X: integer read fX write fX; // свойство указывающее на № Itema
    end;

    procedure TMyComponent.Notification(AComponent: TComponent;
     Operation: TOperation);
    begin
     if Operation = opRemove then begin
       if AComponent = FCollection then begin
        FCollection:=Nil;
      end;
     end;
     inherited;
    end;

    procedure TMyComponent.SetCollection(ACollection:TMyCollection);
    begin
     if ACollection = FCollection then Exit;
     if Assigned(FCollection) then  RemoveFreeNotification(FCollection);
     FCollection := ACollection;
     if Assigned(FCollection) then  FreeNotification(FCollection);
    end;

  • DimaBr © (08.09.11 23:38) [5]
    procedure TMyComponent.Notification(AComponent: TComponent;
     Operation: TOperation);
    begin
     if Operation = opRemove then begin
       if AComponent = FCollection then begin
        Collection:=Nil; // именно так, а не FCollection:=Nil;
       X := -1;
      end;
     end;
     inherited;
    end;

 
Конференция "Компоненты" » как получить список возможных вариантов выбора св-ва [D7, WinXP]
Есть новые Нет новых   [134427   +35][b:0][p:0.002]