Конференция "Компоненты" » Редакторы свойств (TPropertyEditor)
 
  • Иваха (10.07.08 14:47) [0]
    Уважаемые программисты, здравствуйте. У меня следующая проблема.
    Есть свой редактор свойства (от базового TPropertyEditor). Так вот, вызвав в нем (ну, например, в переопределенном SetValue) SetStrValue('что-то'), ведь должно это значение записаться в *.dfm? Если нет, то как мне всё же сохранить все изменения, сделанные в Design-time? Благодарю за помощь)
  • DimaBr © (10.07.08 15:31) [1]
    Desinger.Modified
  • Иваха (10.07.08 16:46) [2]
    Спасибо, но нет, не помогло, к тому же, этот метод просто всё-таки извещает об изменениях - "Notifies property and component editors when a change is made to a component" и к установке значения не имеет отноешния. А как записываются сложные свойства компонентов, если эти свойства, например, классы?
  • Юрий Зотов © (10.07.08 22:11) [3]
    > Иваха

    Редактор свойства устанавливает значение свойства. И все. К его записи в DFM это не имеет никакого отношения.

    > А как записываются сложные свойства компонентов, если эти свойства,
    > например, классы?

    Зависит от многих факторов. Долго рассказывать, проще решить конкретную проблему. Показывайте объявление класса (и будет лучше, еслы Вы выбросите из него все, не относящееся к теме). Или посмотрите, как например, сохраняются TFont и TMenu у TForm - увидите разницу.
  • Иваха (11.07.08 09:46) [4]
    Дело в том, что при сохранении формы все ее свойства (если их значения не по умолчанию) сохраняются в dfm. В моём же случае это свойство в файле dfm не появляется.

    Если, скажем, у нас свойство, к примеру, такого вида:

     TSomeProp = class
       Name : String;
       Width : LongInt;
     end;

    Как необходимо переопределить метод SetValue и как установить заданное в редакторе значение?

    (
    я так понимаю, в конечном счете, в dfm должна появится запись:
    SomeProp.Name = 'PropName'
    SomeProp.Width = 123
    )

    а у TFont'а еще в PropertyAttribute задаются paValueList и paSubProperties  с тем, чтобы можно было редактировать каждое из свойств TFont непосредственно в инспекторе объектов. Может это как-то связано или даже необходимо для того, что я прошу?..
  • DimaBr © (11.07.08 10:52) [5]
    Такое свойство должно наследоваться от TPersistent, в нем механизм сохранения уже реализован
  • Иваха (11.07.08 11:17) [6]
    Спасибо. Я разобрался, как это делать. Посмотрел, что делает Borland, плюс точно так же это описано в одной книге "Исскуство создания компонентов Delphi". Но при вызове SetOrdValue появляется AV! такие дела...
  • DimaBr © (11.07.08 11:39) [7]
    Применение редактора свойства никак не сказывается на метод сохранения в  ресурсе.
    Разбирайтесть с редактором.
  • DimaBr © (11.07.08 11:45) [8]
    Если вы будете и дальше скрывать код редактора, то помочь вряд ли кто сможет.
  • Иваха (11.07.08 12:03) [9]
    В коде редактора две строчки:

    function TGroupEditor.GetAttributes: TPropertyAttributes;
    begin
     Result        :=      [paDialog, paFullWidthName]
    end;

    и

    procedure TGroupEditor.Edit;
    begin
     with TTreeGroupEditDlg.Create(nil) do
     try
       Grouping           :=      TGrouping(Pointer(GetOrdValue));

       if ShowModal = mrOK then
       begin
         SetOrdValue(LongInt(Grouping))
       end
     finally
       Release
     end
    end;
  • Иваха (11.07.08 12:05) [10]
    Вызов SetOrdValue генерирует Access Violation
  • DimaBr © (11.07.08 12:28) [11]
    1. Хотелось бы увидеть код SetGrouping
    2. Постарайтесь не присваивать указать, проще присвоить каждому свойству
 
Конференция "Компоненты" » Редакторы свойств (TPropertyEditor)
Есть новые Нет новых   [134464   +62][b:0][p:0]