Форум: "Компоненты";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
ВнизКак программно открыть редактор коллекции свойства Найти похожие ветки
← →
Priest (2005-07-05 16:49) [0]У меня есть компонент. У него одним из свойств является коллекция. Я хочу, что бы по двойному клику по компоненту не создавался обработчик первого события, а вызывался редактор коллекции. Я так понимаю, что необходимо создать редактор компонента с одним элементом меню. А как сам редактор коллекции вызвать?
← →
Priest (2005-07-05 18:03) [1]Нашёл. Оказывается есть встроенная функция ShowCollectionEditor. Её я и использую
← →
Юрий Зотов © (2005-07-05 18:26) [2]> 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-06 11:15) [3]>>Юрий Зотов ©
Действительно красиво сделано ...
У меня вопрос по данному коду
Selections := TDesignerSelections.Create;
try
Designer.GetSelections(Selections);
GetComponentProperties(Selections, [tkClass], Designer,
GetPropProc)
finally
Selections.Free
end
Как я понимаю здесь сначало получаем выделенный в текущий момент компонент, а затем с помощью GetComponentProperties пробегаем по всем свойствам помпонента типа tkClass. А нельзя было просто получить список свойств найти в цикле нужное и вызвать метод Edit? Как я понял самое главное там IProperty.Edit.
← →
Юрий Зотов © (2005-07-06 12:07) [4]> Priest (06.07.05 11:15) [3]
Получить список свойств - не вопрос, найти нужное - тоже. Но как получить ссылку на его редактор?
А тут она проиходит в callback уже готовая и остается только вызвать Edit.
← →
Priest (2005-07-06 16:59) [5]>>Юрий Зотов
Я использовал вашу процедуру для компонента, который загружается в Dream Designer. Она работает, а ShowCollectionEditor выдаёт ошибку. По видимому причина в том, что Дримы создали свой редактор коллекций..
← →
Юрий Зотов © (2005-07-06 17:36) [6]> Priest (06.07.05 16:59) [5]
Так и есть. И не только коллекций. Там есть формочка, которая используется во многих своих редакторах.
Для Дримов та же задача решается и иначе (проще). Создается (обычным образом) редактор компонента со своими пунктами меню, а когда надо, чтобы один из них сработал, то получаем ссылку на него и вызываем Click. Деталей уже не помню, но когда-то я так и делал.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c