![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно открыть редактор коллекции свойства
Priest © (2005-07-05 16:49:00)У меня есть компонент. У него одним из свойств является коллекция. Я хочу, что бы по двойному клику по компоненту не создавался обработчик первого события, а вызывался редактор коллекции. Я так понимаю, что необходимо создать редактор компонента с одним элементом меню. А как сам редактор коллекции вызвать?
Юрий Зотов (2005-07-06 17:36:00) [1]> Priest (06.07.05 16:59) [5]
Так и есть. И не только коллекций. Там есть формочка, которая используется во многих своих редакторах.
Для Дримов та же задача решается и иначе (проще). Создается (обычным образом) редактор компонента со своими пунктами меню, а когда надо, чтобы один из них сработал, то получаем ссылку на него и вызываем Click. Деталей уже не помню, но когда-то я так и делал.
Priest (2005-07-06 16:59:00) [2]>>Юрий Зотов
Я использовал вашу процедуру для компонента, который загружается в Dream Designer. Она работает, а ShowCollectionEditor выдаёт ошибку. По видимому причина в том, что Дримы создали свой редактор коллекций..
Юрий Зотов (2005-07-06 12:07:00) [3]> Priest (06.07.05 11:15) [3]
Получить список свойств - не вопрос, найти нужное - тоже. Но как получить ссылку на его редактор?
А тут она проиходит в callback уже готовая и остается только вызвать Edit.
Priest (2005-07-06 11:15:00) [4]>>Юрий Зотов ©
Действительно красиво сделано ...
У меня вопрос по данному коду
Selections := TDesignerSelections.Create;
try
Designer.GetSelections(Selections);
GetComponentProperties(Selections, [tkClass], Designer,
GetPropProc)
finally
Selections.Free
end
Как я понимаю здесь сначало получаем выделенный в текущий момент компонент, а затем с помощью GetComponentProperties пробегаем по всем свойствам помпонента типа tkClass. А нельзя было просто получить список свойств найти в цикле нужное и вызвать метод Edit? Как я понял самое главное там IProperty.Edit.
Юрий Зотов (2005-07-05 18:26:00) [5]> Priest (05.07.05 18:03) [1]
А вот так можно вызвать редактор ЛЮБОГО свойства, не только коллекции (в данном примере это объектное свойство MyItems класса TMyComp).
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;
{ TMyCompEditor }
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;
Priest (2005-07-05 18:03:00) [6]Нашёл. Оказывается есть встроенная функция ShowCollectionEditor. Её я и использую