Конференция "Компоненты" » Как получить в компоненте список классов проекта? [D7, WinXP]
 
  • DimaBr © (06.09.11 14:03) [20]
    Я ничего не понимаю, У вас есть столбец, в нём 3 редактора ? В каждой строчке одинаковые 3 редактора ? Или в каждой строчке разные редакторы (по типу) ???
  • MegaVolt_old (06.09.11 14:21) [21]
    >У вас есть столбец, в нём 3 редактора ?

    В том примере что я выложил в первом столбце 3 редактора во втором 1. Вообще же может быть в каждом столбце сколько угодно редакторов. Столбцы друг от друга не зависят.

    В кажом стролбце могут быть как одинаковые так и разные редакторы.

    Т.е. сейчас к каждому столбцу прикручен экзампляр класса унаследованного от TCollection.
  • MegaVolt_old (07.09.11 16:14) [22]
    Стало понятнее?
  • DimaBr © (08.09.11 00:16) [23]
    Начните с случая попроще: 1 столбец - 1 редактор.

    TBaseEditor = class
     protected
        procedure Draw; virtual;abstract; // наследник реализует прорисовку
        procedure Edit; virtual;abstract; // наследник реализует редактирование
        function GetValue: variant; virtual;abstract; // наследник реализует получение значения
        procedure SetValue(Value: variant);virtual;abstract; // наследник реализует установку значения
    end;

  • MegaVolt_old (08.09.11 10:22) [24]
    Вопрос скорее не про то как сделать редактор а как его грамотно подсунуть компоненту в дизайнтайме и настроить его свойства.
  • DimaBr © (08.09.11 12:59) [25]

    // перечень редакторов
    TMyEditors = (eCheck, eEdit, eCyrrency, eButton);

    // базовый редактор
    TMyBaseEditor = class(TPersistent)

    end;

    TMYComponent = class(TComponent)
    published
     property Editor: TBaseEditor read fEditor;
     property TypeEditor: TMyEditors read fTypeEditor write SetTypeEditor;
    end;

    procedure SetTypeEditor(Value: TMyEditors);
    var Old: TBaseEditor;
    begin
     if fTypeEditor = Value then Exit;
     Old := Editor; // запоминаем старый редактор
     try
       case Value of // в зависимости от типа создаём новый
          eCheck: fEditor := TMyCheckEditor.Create();
          eEdit: fEditor := TMyEditEditor.Create();
          ..............
       end;
     finally
       FreeAndNil(Old); // уничтожаем старый редактор
       fTypeEditor := Value;
     end;
    end;

  • MegaVolt_old (08.09.11 13:30) [26]
    Как делать со списком понятно. А как делать если появился новый редактор? Которого не было на момент написания компонента?

    Т.е. когда список TMyEditors = (eCheck, eEdit, eCyrrency, eButton); расширен новым редактором?
  • DimaBr © (08.09.11 23:35) [27]
    Значит ввести текстовый список ('eCheck', 'eEdit', 'eCyrrency', 'eButton'), плюс регистрация нового редактора. Тогда свойство TypeEditor будет выглядеть так
    property TypeEditor: string read fTypeEditor write SetTypeEditor;

    var fRegisterEditorList: TStringsList;

    procedure RegistrEditor(TypeEditor: string; ClassEditor: TBaseEditor);
    begin
     if not Assigned(fRegisterEditorList) then fRegisterEditorList := TStringList.Create;
     if fRegisterEditorList.IndexOf(TypeEditor) >= 0 then Exit;
     fRegisterEditorList.AddObject(TypeEditor,ClassEditor);
    end;

    procedure SetTypeEditor(Value: string);
    var Old: TBaseEditor;
        n: integer;
        f: boolean;
    begin
    if fTypeEditor = Value then Exit;
    Old := Editor; // запоминаем старый редактор
    try
      f := false;
      for i := 0 to fRegisterEditorList.Count-1 do
         if SameText(fRegisterEditorList[i],Value) then begin
            fEditor := TMyBaseEditor(fRegisterEditorList.Objects[i]).Create();
            f := true;
            Break;
         end;
      if not f then Exit;
    finally
      FreeAndNil(Old); // уничтожаем старый редактор
      fTypeEditor := Value;
    end;
    end;

    initialization
     RegistrEditor('eCheck',TMyCheckEditor);
     RegistrEditor('eEdit',TMyEditEditor);
    end.

    // ===============================
    // новый модуль
    initialization
     RegistrEditor('eButton',TMyButtonEditor);
    end.


  • MegaVolt_old (08.09.11 23:41) [28]
    !!! Передавать имя класса через строку я не догадался... Всё искал как же получить список доступных в дизайн тайме эдиторов.

    Бальшущее спасибо.
  • DimaBr © (09.09.11 02:16) [29]
    Для свойства можно организовать редактор свойства, который и будет показывать список доступных редакторов (тавтология какая-то).
 
Конференция "Компоненты" » Как получить в компоненте список классов проекта? [D7, WinXP]
Есть новые Нет новых   [118460   +14][b:0][p:0.002]