Конференция "Компоненты" » Оповещения TDesignWindow об изменении в компоненте [D7]
 
  • r00xus © (04.09.15 12:27) [0]
    Здравствуйте. Пишу компонент-контейнер TrxsList, который содержит компоненты-элементы TrxsItem. Задумал сделать для TrxsList дизайнер. Окно дизайнера наследую от TDesignWindow. В нем будет список скорее всего ListView с TrxsItems, которые включены в TrxsList с возможностью добавить или удалить элементы. По сути напоминает ActionList с Action-ами.

    Вопрос заключается в том, как оповестить мое окно дизайнера о том что пользователь в Object inspector поменял свойства выбранного TrxsItem?

    Это нужно для того чтобы отразить изменения по нему в ListView. Видел метод TDesignWindow.ItemsModified, но что-то не понял как им пользоваться...

    Код формы дизайнера:
    unit rxsListEditorForm;

    interface

    uses
     Classes, Controls, Forms, Dialogs, DesignWindows, DesignIntf, rxsList,
     StdCtrls, ComCtrls, ToolWin;

    type
     TListEditorForm = class(TDesignWindow)
       lv_1: TListView;
       tlb_1: TToolBar;
       btn_Add: TToolButton;
       procedure FormClose(Sender: TObject; var Action: TCloseAction);
       procedure btn_AddClick(Sender: TObject);
     private
       FDesigner: IDesigner;
       FList: TrxsList;
     protected
       procedure Notification(AComponent: TComponent; Operation: TOperation); override;    
     public
       constructor Create(AOwner : TComponent; AList : TrxsList; ADesigner : IDesigner); reintroduce;
       procedure ItemsModified(const Designer: IDesigner); override;
       property List : TrxsList read FList;
     end;

    var
     ListEditorForm: TListEditorForm;

    implementation

    {$R *.dfm}

    constructor TListEditorForm.Create(AOwner: TComponent; AList: TrxsList;
     ADesigner: IDesigner);
    begin
     inherited Create(AOwner);
     FDesigner := ADesigner;
     FList := AList;
    end;

    procedure TListEditorForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Action := caFree;
    end;

    procedure TListEditorForm.ItemsModified(const Designer: IDesigner);
    begin

    end;

    procedure TListEditorForm.Notification(AComponent: TComponent;
     Operation: TOperation);
    begin
     inherited;
     if (Operation = opRemove) and (AComponent = FList) then Free;
    end;

    procedure TListEditorForm.btn_AddClick(Sender: TObject);
    var
     LItem : TrxsItem;
    begin
     LItem := TrxsItem.Create(FList.Owner);
     LItem.Name := FDesigner.UniqueName(LItem.ClassName);
     FList.AddItem(LItem);
    end;

    end.



    Код создания формы в редакторе компонента:
    procedure TrxsListEditor.Edit;
    var
     i : Integer;
     LEditForm : TListEditorForm;
     LForm : TCustomForm;
    begin
     for i := 0 to Screen.FormCount - 1 do begin
       LForm := Screen.Forms[i];
       if LForm is TListEditorForm then
         if TListEditorForm(LForm).List = Component then begin
           LForm.Show;
           if LForm.WindowState = wsMinimized then
             LForm.WindowState := wsNormal;
           Exit;
         end;
     end;
     LEditForm := TListEditorForm.Create(Application, TrxsList(Component), GetDesigner);
     Component.FreeNotification(LEditForm);
     LEditForm.Show;
    end;

  • DimaBr © (07.09.15 07:46) [1]

    > Видел метод TDesignWindow.ItemsModified, но что-то не понял
    > как им пользоваться...

    Двигаетесь в правильно направлении. ItemsModified срабатывает при изменении свойств вашего компонента (в том числе и при уничтожении). Поэтому обновляйте свой список в этом событии.
  • r00xus © (07.09.15 08:18) [2]
    Привет.
    Да я уже разобрался. Но как выяснилось ItemsModified срабатывает не только на мой компонент но и вообще на любые изменения объектов в Object Inspector. Поэтому приходиться делать проверку:
    procedure TListEditorForm.ItemsModified(const Designer: IDesigner);
    var
     i: integer;
     LSelList: IDesignerSelections;
     LItem : TrxsItem;
    begin
     LSelList := CreateSelectionList;
     Designer.GetSelections(LSelList);

     for i := 0 to LSelList.Count - 1 do
     begin
       if (LSelList.Items[i] is TrxsItem) then
       begin
         LItem := TrxsItem(LSelList.Items[i]);
         if LItem.List = FList then
         begin
     
           UpdateItemInList(LItem);
         end;
       end;
     end;
    end;

    а вот про уничтожение я не понял. как понять что объект уничтожается в этом событии. я решил что для этого подойдет только соседнее ItemDeleted?
  • DimaBr © (08.09.15 07:33) [3]

    > как понять что объект уничтожается в этом событии.

    наверное так
    procedure TBrCustomEditorFrm.ItemsModified(const Designer: IDesigner);
    begin
     if not (csDestroying in ComponentState) then UpdateListCategory(lbCategory.ItemIndex);
    end;

  • r00xus © (08.09.15 10:25) [4]
    Спасибо. попробую...
  • имя (20.10.15 19:50) [5]
    Удалено модератором
 
Конференция "Компоненты" » Оповещения TDesignWindow об изменении в компоненте [D7]
Есть новые Нет новых   [134427   +35][b:0][p:0.001]