Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
14-1134455289
Гриха
2005-12-13 09:28
2006.01.08
Блок Инета


14-1134396057
VirEx
2005-12-12 17:00
2006.01.08
синхронизация потоков в API


14-1134652120
(CHALING 32)S K i N E R
2005-12-15 16:08
2006.01.08
Delphi 6 and Delphi 7


2-1134922994
Arazel
2005-12-18 19:23
2006.01.08
Как отсортировать название файлов/папок ListBox как Explorer?


4-1130938577
Piter
2005-11-02 16:36
2006.01.08
Shutdown компьютера.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский