Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Оповещения TDesignWindow об изменении в компоненте [D7]


r00xus ©   (04.09.15 12:27

Здравствуйте. Пишу компонент-контейнер 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]

Удалено модератором


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо