Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сгруппировать СОБЫТИЯ в инспекторе объектов / 15 сообщений из 15, страница 1 из 1
25.08.2017, 09:45:20
    #39510248
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Добрый день,
имеется следующий код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
  TOptionsForm = class(TInterfacedPersistent)
  private
    FInstanceMode         : TInstanceMode;
    FSaveProps            : TOptionsFormSaveProps;
    FFormIsModal          : Boolean;
    FOnObjectAssigment    : TNotifyEvent;
    FOnLoadPersistent     : TNotifyEvent;
    FOnSavePersistent     : TNotifyEvent;
    FSetControlState      : TNotifyEvent;
    FOnInstanceIdentified : TNotifyEvent;
  protected
    aForm: TBaseCustomForm;
  public
    constructor Create(AOwner: TComponent);
    procedure Assign(Other: TPersistent); override;
  published
    property InstanceMode: TInstanceMode         read FInstanceMode write FInstanceMode default fimMultiple;
    property SaveProps   : TOptionsFormSaveProps read FSaveProps    write FSaveProps;
    property FormIsModal : Boolean               read FFormIsModal  write FFormIsModal  default False;

    property OnLoadPersistent    : TNotifyEvent read FOnLoadPersistent     write FOnLoadPersistent;
    property OnSavePersistent    : TNotifyEvent read FOnSavePersistent     write FOnSavePersistent;
    property OnObjectAssigment   : TNotifyEvent read FOnObjectAssigment    write FOnObjectAssigment;
    property SetControlState     : TNotifyEvent read FSetControlState      write FSetControlState;
    property OnInstanceIdentified: TNotifyEvent read FOnInstanceIdentified write FOnInstanceIdentified;
  end;

  //Базовая форма
  TBaseCustomForm = class(TForm)
  private
    FOptionsForm: TOptionsForm;
    procedure SetOptionsForm(const Value: TOptionsForm);
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ActiveOptionsForm : TOptionsForm read FOptionsForm write SetOptionsForm;
  end;



при этом в инспекторе объектов видно следующее


но во вкладке событий соответствующей группы нет


Что я делаю не верно?
...
Рейтинг: 0 / 0
25.08.2017, 09:47:46
    #39510250
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
блин почему то не вставились ссылки
вот первое изображение
...
Рейтинг: 0 / 0
25.08.2017, 09:48:08
    #39510251
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
вот соответственно второе
...
Рейтинг: 0 / 0
25.08.2017, 10:17:44
    #39510273
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
FoxJr,

Отдельный редактор свойств для TOptionsForm поможет.
...
Рейтинг: 0 / 0
25.08.2017, 10:22:33
    #39510278
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Самое интересное, если я использую вместо TPersistent - TComponent, то все нормально, НО появляется невизуальный компонент, который мне нафиг не нужен.
...
Рейтинг: 0 / 0
25.08.2017, 10:25:42
    #39510282
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
DarkMasterFoxJr,

Отдельный редактор свойств для TOptionsForm поможет.

Это как?
...
Рейтинг: 0 / 0
25.08.2017, 10:55:35
    #39510312
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
...
Рейтинг: 0 / 0
25.08.2017, 12:06:52
    #39510378
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
DimaBr,

Не, это немного не то.
...
Рейтинг: 0 / 0
25.08.2017, 12:41:39
    #39510407
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Это то что вы хотите
...
Рейтинг: 0 / 0
25.08.2017, 12:46:50
    #39510416
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Вот так это выглядит у меня
...
Рейтинг: 0 / 0
25.08.2017, 12:49:54
    #39510421
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Вот так это выглядит у "Девочек"
...
Рейтинг: 0 / 0
25.08.2017, 13:25:46
    #39510460
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Спасибо огромадное, действительно был не прав.

получилось


Если кому нужно вот исходник

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
unit UnitTest;

interface

uses
  Classes,
  Vcl.Forms,
    DesignIntf,DesignEditors;

Type
  TAccessMethodProperty = class(TMethodProperty);

  TInstanceMode = (fimMultiple, fimSingle, fimSingleForID);

  TOptionsFormSaveProp = (opspPosition, opspState, opspGrid, opspFilter, opspMisc);

  TOptionsFormSaveProps = set of TOptionsFormSaveProp;

  TOptionsForm = class;
  TBaseCustomForm = class;

  TEventListProperty = class(TPropertyEditor)
  protected
    function GetInternalObject: TPersistent; virtual;
  public
    function GetName: string; override;
    function GetValue: string; override;
    function GetAttributes: TPropertyAttributes; override;
    procedure GetProperties(Proc: TGetPropProc); override;
  end;

  TOptionsForm = class(TPersistent)
  private
    FInstanceMode         : TInstanceMode;
    FSaveProps            : TOptionsFormSaveProps;
    FFormIsModal          : Boolean;
    FOnObjectAssigment    : TNotifyEvent;
    FOnLoadPersistent     : TNotifyEvent;
    FOnSavePersistent     : TNotifyEvent;
    FSetControlState      : TNotifyEvent;
    FOnInstanceIdentified : TNotifyEvent;
    function GetContainer: TComponent;
  protected
    aForm: TBaseCustomForm;
    function GetOwner : TPersistent; override;
  public

    constructor Create(AOwner: TComponent);
    procedure Assign(Other: TPersistent); override;
    procedure AssignTo(Dest: TPersistent); override;

    property Container: TComponent read GetContainer;
  published
    property InstanceMode: TInstanceMode         read FInstanceMode write FInstanceMode default fimMultiple;
    property SaveProps   : TOptionsFormSaveProps read FSaveProps    write FSaveProps;
    property FormIsModal : Boolean               read FFormIsModal  write FFormIsModal  default False;

    property OnLoadPersistent    : TNotifyEvent read FOnLoadPersistent     write FOnLoadPersistent;
    property OnSavePersistent    : TNotifyEvent read FOnSavePersistent     write FOnSavePersistent;
    property OnObjectAssigment   : TNotifyEvent read FOnObjectAssigment    write FOnObjectAssigment;
    property SetControlState     : TNotifyEvent read FSetControlState      write FSetControlState;
    property OnInstanceIdentified: TNotifyEvent read FOnInstanceIdentified write FOnInstanceIdentified;
  end;

  //Базовая форма
  TBaseCustomForm = class(TForm)
  private
    FOptionsForm: TOptionsForm;
    function GetActiveEvent: TNotifyEvent;
    procedure SetActiveEvent(const Value: TNotifyEvent);
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ActiveOptionsForm : TOptionsForm read FOptionsForm write FOptionsForm;
    property ActiveEvents : TNotifyEvent read GetActiveEvent write SetActiveEvent;
  end;

Procedure Register;

implementation

uses
  System.TypInfo;

Procedure Register;
begin
  RegisterClasses([TOptionsForm, TBaseCustomForm]);
  RegisterCustomModule(TBaseCustomForm, TCustomModule);
  RegisterPropertyEditor(TypeInfo(TNotifyEvent), TBaseCustomForm, 'ActiveEvents', TEventListProperty);
end;

{ TEventListProperty }

function TEventListProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paSubProperties, paReadOnly, paVolatileSubProperties]
end;

function TEventListProperty.GetInternalObject: TPersistent;
begin
  Result := TBaseCustomForm(GetComponent(0)).ActiveOptionsForm;
end;

function TEventListProperty.GetName: string;
begin
  Result := 'ActiveEvents';
end;

function TEventListProperty.GetValue: string;
begin
  Result := '(' + GetInternalObject.ClassName + ')';
end;

procedure TEventListProperty.GetProperties(Proc: TGetPropProc);
var
  EventCount, i: integer;
  EventList : PPropList;
  EventEditor: TMethodProperty;
begin
  EventCount := GetPropList(GetInternalObject.ClassInfo, tkMethods, nil);
  if EventCount > 0 then
  begin
    GetMem(EventList, EventCount * SizeOf(PPropInfo));
    try
      GetPropList(GetInternalObject.ClassInfo, tkMethods, EventList);
      for i := 0 to EventCount - 1 do
      begin
        EventEditor := TMethodProperty.Create(Designer, 1);
        with TAccessMethodProperty(EventEditor) do
        begin
          SetPropEntry(0, GetInternalObject, EventList[i]);
            Initialize;
            if ValueAvailable then
              Proc(EventEditor as IProperty)
        end
      end
    finally
      FreeMem(EventList, EventCount * SizeOf(PPropInfo))
    end
  end
end;

{ TOptionsForm }

procedure TOptionsForm.Assign(Other: TPersistent);
begin
  if Other = nil then
    Exit;

  if (Other is TOptionsForm) then
    begin
      FInstanceMode      := TOptionsForm(Other).InstanceMode;
      FSaveProps         := TOptionsForm(Other).SaveProps;
      FFormIsModal       := TOptionsForm(Other).FormIsModal;
      FOnObjectAssigment := TOptionsForm(Other).OnObjectAssigment;
      FOnLoadPersistent  := TOptionsForm(Other).OnLoadPersistent;
      FOnSavePersistent  := TOptionsForm(Other).OnSavePersistent;
      FSetControlState   := TOptionsForm(Other).SetControlState;
      FOnInstanceIdentified := TOptionsForm(Other).OnInstanceIdentified;
    end
  else
    inherited;
end;

procedure TOptionsForm.AssignTo(Dest: TPersistent);
begin
  if Dest = nil then
    Exit;

  if (Dest is TOptionsForm) then
    begin
      TOptionsForm(Dest).InstanceMode         := FInstanceMode;
      TOptionsForm(Dest).SaveProps            := FSaveProps;
      TOptionsForm(Dest).FormIsModal          := FFormIsModal;
      TOptionsForm(Dest).OnObjectAssigment    := FOnObjectAssigment;
      TOptionsForm(Dest).OnLoadPersistent     := FOnLoadPersistent;
      TOptionsForm(Dest).OnSavePersistent     := FOnSavePersistent;
      TOptionsForm(Dest).SetControlState      := FSetControlState;
      TOptionsForm(Dest).OnInstanceIdentified := FOnInstanceIdentified;
    end
  else
    inherited;
end;

constructor TOptionsForm.Create(AOwner: TComponent);
begin
//  inherited Create(AOwner);
  aForm := AOwner as TBaseCustomForm;
  //Устанавливаем значения по-умолчанию
  FInstanceMode := fimMultiple;
  FSaveProps    := [opspPosition, opspState, opspGrid, opspFilter, opspMisc];
  FFormIsModal  := False;
end;


function TOptionsForm.GetContainer: TComponent;
begin
  Result := aForm as TComponent;
end;

function TOptionsForm.GetOwner: TPersistent;
begin
  Result := aForm;
end;

{ TBaseCustomForm }

constructor TBaseCustomForm.Create(AOwner: TComponent);
begin
  inherited;
  ActiveOptionsForm := TOptionsForm.Create(Self);
end;


destructor TBaseCustomForm.Destroy;
begin
  FOptionsForm.Free;
  inherited;
end;

function TBaseCustomForm.GetActiveEvent: TNotifyEvent;
begin
  Result := nil;
end;

procedure TBaseCustomForm.SetActiveEvent(const Value: TNotifyEvent);
begin
  //Do nothing
end;

end.


...
Рейтинг: 0 / 0
25.08.2017, 13:26:54
    #39510461
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
Блин да что за фигня с этими рисунками. Вот прикрепляю результат
...
Рейтинг: 0 / 0
25.08.2017, 13:44:34
    #39510490
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
FoxJrБлин да что за фигня с этими рисунками.

Вот ваш пост
...
Рейтинг: 0 / 0
25.08.2017, 13:50:03
    #39510501
FoxJr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгруппировать СОБЫТИЯ в инспекторе объектов
DimaBr,

=), спасибо, а то я уже себя ущербным считаю, что не могу нормально вставить изображение.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сгруппировать СОБЫТИЯ в инспекторе объектов / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]