-
Как сделать чтоб если в Design time по моему компоненту щёлкнуть два раза мышкой, то открывался редактор свойства Items, как например это сделано в ListView и других...
-
> [0] Mishenka (29.08.08 15:15)
А что уже сделано в этом направлении? Свой редактор компонента создан? Зарегистрирован? А двойной клик - нужно перекрыть у наследника TComponentEditor(т.е. твоего редактора) метод Edit....
-
Своё редактор не создавался. Свойство Items это обычная коллекция и меня вполне устраивает стандартный редактор, который вызывается в инспекторе объектов. Хочу, чтоб при двойном щелчке по компоненту вызывался он же.
> А двойной клик - нужно перекрыть у наследника TComponentEditor
Тобишь если редактор стандартный то всё равно придётся писать наследника ?
-
> Mishenka (29.08.08 15:31) [2]
То, что Вы хотите называется "редактор компонента" (наследник TComponentEditor), а не "редактор свойства" (наследник TPropertyEditor). Редактор компонента и надо написать, а в его методе ExecuteVerb уже активировать редактор свойства (если параметр равен нулю). Примеры редакторов компонентов есть в поставке Delphi (папка Demos).
-
Вроде разобрался с редактором компонентов. Но вот что-то немогу найти как активировать редактор свойства ...
-
unit MyCompReg;
interface
uses
SysUtils, Classes, DesignIntf, DesignEditors, VCLEditors, ToolsAPI, TypInfo,
MyComp;
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;
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.
-
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;
-
не тот тег поставил
-
> Но вот что-то немогу найти как активировать редактор свойства > ...
RegisterPropertyEditor в процедуре Register. Посмотри в исходниках VCL, как называется стандартный редактор коллекций, и подставь его для своего свойства Items
-
Юрий, спасибо за подробный и развёрнутый ответ! Сделал всё как вы написали. И вылезла ошибка про proxies.dcu. Разделил компонент на два юнита с runtime и designtime как советуют на форуме. Но ошибка всё равно выскакивает. Ещё вроде как советуют добавить DesignIDE к списку runtime пакетов, но честно говоря не очень понимаю что это и как это сделать?
-
1. Не на 2 юнита, а на 2 пакета. 2. Компилируете run-time пакет. 3. Открываете свой design-time пакет. 4. Правый клик по слову required, пункт "Добавить". 5. Добавляете DesignIDE и свой run-time пакет. 6. Компилируете и инсталлируете.
-
Всё, разобрался. Большое спасибо за помощь!
|