Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.08;
Скачать: CL | DM;

Вниз

Как программно открыть редактор коллекции свойства   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
3-1131884292
Ольга
2005-11-13 15:18
2006.01.08
Заполнение таблицы БД данными из файла (csv / xls / txt ...)


2-1135031457
Majesto
2005-12-20 01:30
2006.01.08
Компонент TEdit


14-1134678847
palva
2005-12-15 23:34
2006.01.08
Библия... Флёнова


4-1130775758
sd_simf
2005-10-31 19:22
2006.01.08
"Остановить" приложение


14-1134647613
Хинт
2005-12-15 14:53
2006.01.08
Оптимизация и/или защита DLL