powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сгруппировать СОБЫТИЯ в инспекторе объектов
15 сообщений из 15, страница 1 из 1
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #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
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510250
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин почему то не вставились ссылки
вот первое изображение
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510251
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот соответственно второе
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510273
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxJr,

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

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

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

Не, это немного не то.
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510407
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это то что вы хотите
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510416
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так это выглядит у меня
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510421
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так это выглядит у "Девочек"
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #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
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510461
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин да что за фигня с этими рисунками. Вот прикрепляю результат
...
Рейтинг: 0 / 0
Как сгруппировать СОБЫТИЯ в инспекторе объектов
    #39510490
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxJrБлин да что за фигня с этими рисунками.

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

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


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