Конференция "Компоненты" » Редактор свойств компонента в Design time [D6, XP]
 
  • Mishenka (29.08.08 15:15) [0]
    Как сделать чтоб если в Design time по моему компоненту щёлкнуть два раза мышкой, то открывался редактор свойства Items, как например это сделано в ListView и других...
  • {RASkov} © (29.08.08 15:23) [1]
    > [0] Mishenka   (29.08.08 15:15)

    А что уже сделано в этом направлении? Свой редактор компонента создан? Зарегистрирован?
    А двойной клик - нужно перекрыть у наследника TComponentEditor(т.е. твоего редактора) метод Edit....
  • Mishenka (29.08.08 15:31) [2]
    Своё редактор не создавался. Свойство Items это обычная коллекция и меня вполне устраивает стандартный редактор, который вызывается в инспекторе объектов. Хочу, чтоб при двойном щелчке по компоненту вызывался он же.


    > А двойной клик - нужно перекрыть у наследника TComponentEditor

    Тобишь если редактор стандартный то всё равно придётся писать наследника ?
  • Юрий Зотов © (29.08.08 15:50) [3]
    > Mishenka   (29.08.08 15:31) [2]

    То, что Вы хотите называется "редактор компонента" (наследник TComponentEditor), а не "редактор свойства" (наследник TPropertyEditor). Редактор компонента и надо написать, а в его методе ExecuteVerb уже активировать редактор свойства (если параметр равен нулю). Примеры редакторов компонентов есть в поставке Delphi (папка Demos).
  • Mishenka (02.09.08 12:43) [4]
    Вроде разобрался с редактором компонентов. Но вот что-то немогу найти как активировать редактор свойства ...
  • Юрий Зотов © (02.09.08 13:37) [5]

    unit MyCompReg;

    interface

    uses
     SysUtils, Classes, DesignIntf, DesignEditors, VCLEditors, ToolsAPI, TypInfo,
     MyComp;

    // Модуль MyComp содержит компонент TMyComp, у которого есть
    // published-свойство MyItems класса TMyItems (наследник TOwnedCollection)

    procedure Register;

    implementation

    type
     TMyCompEditor = class(TComponentEditor)
     private
       FPropInfo: PPropInfo;
       FPropEdit: IProperty;
       procedure GetPropProc(const PropEdit: IProperty);
     public
       constructor Create(AComponent: TComponent; ADesigner: IDesigner); override;
       procedure ExecuteVerb(Index: Integer); override;
       function GetVerb(Index: Integer): string; override;
       function GetVerbCount: Integer; override;
     end;

    procedure Register;
    begin
     RegisterComponents('YzExamples', [TMyComp]);
     RegisterComponentEditor(TMyComp, TMyCompEditor)
    end;

    { TMyCompEditor }

    constructor TMyCompEditor.Create(AComponent: TComponent; ADesigner: IDesigner);
    begin
     inherited;
     FPropInfo := GetPropInfo(GetComponent.ClassInfo, 'MyItems', [tkClass])
    end;

    procedure TMyCompEditor.ExecuteVerb(Index: Integer);
    var
     Selections: TDesignerSelections;
    begin
     if Index = GetVerbCount - 1 then
     begin
       if (FPropEdit = nil) and (FPropInfo <> nil) then
       begin
         Selections := TDesignerSelections.Create;
         try
           Designer.GetSelections(Selections);
           GetComponentProperties(Selections, [tkClass], Designer, GetPropProc)
         finally
           Selections.Free
         end
       end;
       if FPropEdit <> nil then
         FPropEdit.Edit
     end
     else
       inherited
    end;

    procedure TMyCompEditor.GetPropProc(const PropEdit: IProperty);
    begin
     if PropEdit.GetPropInfo = FPropInfo then
       FPropEdit := PropEdit
    end;

    function TMyCompEditor.GetVerb(Index: Integer): string;
    begin
     if Index = GetVerbCount - 1 then
       Result := 'MyItems Editor...'
     else
       Result := inherited GetVerb(Index)
    end;

    function TMyCompEditor.GetVerbCount: Integer;
    begin
     Result := inherited GetVerbCount + 1
    end;

    end.

  • DevilDevil © (02.09.08 15:10) [6]
    function TGameModuleComponentEditor.ActivateEditor: TCollectionEditor;
    var
     Component: <тип "редактируемого" компонента>;
    begin
     Component := GetComponent as <тип "редактируемого" компонента>;

     Result := ShowCollectionEditorClass(Designer, TCollectionEditor, Component,
                                         Component.<свойство-коллекция>, <имя свойства-коллекции>);
    end;

    procedure TGameModuleComponentEditor.ActivateObjectInspector;
    var
     Act: TAction;
     DelphiForm: TCustomForm;
    begin
     if not Assigned(Application) then Exit;
     DelphiForm := TCustomForm(Application.FindComponent('AppBuilder'));
     if Assigned(DelphiForm) then
     begin
       Act := TAction(DelphiForm.FindComponent('ViewObjInspCommand'));
       if Assigned(Act) then Act.Execute;
     end;
    end;
  • DevilDevil © (02.09.08 15:11) [7]
    не тот тег поставил
  • DrPass © (03.09.08 10:13) [8]

    >  Но вот что-то немогу найти как активировать редактор свойства
    > ...

    RegisterPropertyEditor в процедуре Register. Посмотри в исходниках VCL, как называется стандартный редактор коллекций, и подставь его для своего свойства Items
  • Mishenka (03.09.08 17:17) [9]
    Юрий, спасибо за подробный и развёрнутый ответ! Сделал всё как вы написали. И вылезла ошибка про proxies.dcu. Разделил компонент на два юнита с runtime и designtime как советуют на форуме. Но ошибка всё равно выскакивает. Ещё вроде как советуют добавить DesignIDE к списку runtime пакетов, но честно говоря не очень понимаю что это и как это сделать?
  • Юрий Зотов © (03.09.08 19:00) [10]
    1. Не на 2 юнита, а на 2 пакета.
    2. Компилируете run-time пакет.
    3. Открываете свой design-time пакет.
    4. Правый клик по слову required, пункт "Добавить".
    5. Добавляете DesignIDE и свой run-time пакет.
    6. Компилируете и инсталлируете.
  • Mishenka (04.09.08 09:57) [11]
    Всё, разобрался. Большое спасибо за помощь!
 
Конференция "Компоненты" » Редактор свойств компонента в Design time [D6, XP]
Есть новые Нет новых   [134464   +62][b:0][p:0.001]