Конференция "Компоненты" » Как сохранить свойство в dfm отличным от оригинального образом. [D7, WinXP]
 
  • MegaVolt_old (05.01.12 15:51) [0]
    Собственно задача стоит в том чтобы сохранить свойство в dfm неким альтенативным образом.

    Есть некий classА и classB входящий в classА.
    Я хочу чтобы classB сохранялся иначе чем он сохраняется IDE по умолчанию.

    Через DefineProperty это реально. Но нужно отменить стандартное сохранение. Для этого можно написать:

    property x:TClassB .... stored False;



    Можно ли то же самое сделать изнутри ClassB чтобы ClassA не нужно было править?
  • DimaBr © (05.01.12 18:03) [1]
    Не публиковать ClassB свойства или для всех ClassB свойств запретить сохраниение
  • MegaVolt_old (05.01.12 18:47) [2]
    Публиковать нужно.

    >или для всех ClassB свойств запретить сохраниение

    O!!!! Это идея :)))
  • MegaVolt_old (05.01.12 18:50) [3]
    А может есть ещё пути? А то ведь это во всех наследниках ClassB придётся поля таким же образом писать :(

    Может есть альтернативные пути подменить стандартныую процедуру сохранения?
  • DimaBr © (06.01.12 10:46) [4]
    А что трудно в наследнике написать stored False ???
    Честно говоря - непонятный велосипед
  • MegaVolt_old (06.01.12 11:53) [5]
    Если наследник пишу не я то это уже некое правило которое должно быть описано толково и мало того ещё и должно быть прочитано. Ведь пропустят же. Да и сам через годик забуду... Т.е. хотелось бы чтобы хитрости реализации пользователям были неведомы.
  • DimaBr © (06.01.12 13:08) [6]
    Если наследник пишу я и вижу что моё свойство не сохраняется - долго рву волосы и забрасываю форумы вопросами
  • MegaVolt_old (06.01.12 13:42) [7]
    Я же написал в что свойство будет сохраняться неким альтернативным образом. Т.е. я хочу подменить стандартное созранение. А не убрать его на 100%
  • DimaBr © (07.01.12 02:02) [8]
    Хотелось бы узнать как и для чего всё это нужно, может решение вовсе не здесь
  • MegaVolt_old (07.01.12 04:37) [9]
    да вот хочу заметить у коллекции родное сохранение на своё. Чтобы при создании элемента можно было задать класс отличный от того что по умолчанию.
  • DimaBr © (07.01.12 14:33) [10]
    У вас ошибка в ДНК. Не нужно менять поведение коллекций. Вам нужен список разных классов ? Так сохраняйте эти классы ? Уйдите от коллекций, они не для этого предназначены. Коллекции - список однотипных элементов. TCollection от TList ничем не отличаются.
  • MegaVolt_old (07.01.12 14:57) [11]
    Сдалась вам моя ДНК?
    Я не получаю результат я изучаю среду.
    Коллекции отлично хранят разнотивные элементы. Мало того созданные элементы отлично сохраняются и отображаются в инспекторе и дереве объектов!!!! Единственной проблемой является то что они при создании действиетельно создаются все одиноковыми. Если подправить вычитывание из dfm то я получу то что мне нужно минимальной кровью.

    Вот я спрашиваю можноли как то порулить тем как коллекция создаётся из dfm?
  • DimaBr © (07.01.12 21:56) [12]
    Если подправить сохранение коллекций то это приведет к сохранению обычных вложенных компонентов. Напишите, в каком виде вы видите сохранение ваших компонентов
  • MegaVolt_old (07.01.12 22:14) [13]
    Вид может быть каким угодно. Главное что добавиться всего один параметр описывающий имя класса. Это можно сделать через DefineProperties.

    При чтении важно чтобы я мог влиять на создаваемый объект путём создания объекта ранее сохранённого типа.

    Ну например так в зависимости какое кусок кода замещать:

       Columns = <
         item
           ClassType = TClassA
           MaxWidth = 10
           MinWidth = 34
         end
         item
           ClassType = TClassB
           MaxWidth = 36
         end
         item
           ClassType = TClassC
           MinWidth = 456
         end>



    Или так

       Columns = <
         item : TClassA
           MaxWidth = 10
           MinWidth = 34
         end
         item : TClassB
           MaxWidth = 36
         end
         item : TClassC
           MinWidth = 456
         end>

  • DimaBr © (08.01.12 02:23) [14]
    Вид №1
    Реализуется обычным вложенным классом, тип которого задаётся (если хотите) свойством элемента коллекции.
    Вид № 2
    Если выкинуть Columns - ничем не отличается от списка вложенных компонент аля TAction  или TFields
  • MegaVolt_old (08.01.12 05:06) [15]
    Вариант №1 если я правильно понял будет содержать в каждой item по 2 класса. Сама Item и вновь соданный класс? А напрямую никак?

    Вариант №2 TAction и TField наследуются от TComponent и там нету примера того как подменить стандартное сохранение. :(
  • DimaBr © (08.01.12 11:23) [16]
    Вариант 1.
    Всё правильно, в зависимости от свойства ClassType создаётся/пересоздаётся внутренний класс. Напрямую никак - потому что коллекция - список однотипных элементов.

    Вариант 2.
    Ничего подменять не надо, всё и так уже готово. Сохраняется и тип элемента и его внутренние свойства, причём у каждого могут быть свои
    object ActionList1: TActionList
      Left = 336
      Top = 96
      object EditCut1: TEditCut  // 1 элемент
        Caption = 'Cu&t'
      end
      object EditCopy1: TEditCopy // 2 элемент
        Caption = '&Copy'
      end
      object EditPaste1: TEditPaste // 3 элемент
        Caption = '&Paste'
      end
    end

  • MegaVolt_old (08.01.12 14:55) [17]
    >в зависимости от свойства ClassType создаётся/пересоздаётся внутренний класс

    Можно тут поподробнее? Как я могу пересоздать сам себя? Ведь при присваивании некого свойства я должен буду пересоздать сам себя. Как это возможно?

    >Ничего подменять не надо, всё и так уже готово.

    Я про то что Если Item не унаследована от TComponent то фокус не пройдёт и сохраняться так как TAction и TField не будет.
  • DimaBr © (08.01.12 15:52) [18]
    2. А вам принципиально наследование TPersistent ? TComponent никак не подходит ?

    1. Не нужно пересоздавать самого себя

    TBaseSubClass = class(TPersistent);
    TFirstSubClass = class(TBaseSubClass);
    TSecondSubClass = class(TBaseSubClass);

    TMyItem = class(TCollectionItem)
     published
        property MyClassType: TMyClassType read fMyClassType write SetMyClassType;
        property SubClass: TBaseSubClass read fSubClass write SetSubClass;
    end;

    procedure SetMyClassType(Value: TMyClassType );
    var Old: TBaseSubClass ;
    begin
     if fMySubClass = Value then Exit;
     Old := fSubClass;
     try
        case Value of
          FirstValue: fSubClass := TFirstSubClass.Create;
          SecondValue: fSubClass := TSecondSubClass.Create;
        end;
        fMySubClass := Value;
        Old.Free;
      except
         fSubClass := Old;
      end;
    end;

  • MegaVolt_old (08.01.12 16:29) [19]
    >2. А вам принципиально наследование TPersistent ? TComponent никак не подходит ?

    нет принципиально конечно. Но возникают проблемы:
    1. Малой кровью и легкой правкой коллекция я не отделаюсь.
    2. TComponent содержит массу лишнего

    >1. Не нужно пересоздавать самого себя

    Про создать поле с нужным классом это понятно но это лишний уровень в дереве объектов что совсем некрасиво :(((
 
Конференция "Компоненты" » Как сохранить свойство в dfm отличным от оригинального образом. [D7, WinXP]
Есть новые Нет новых   [118475   +36][b:0][p:0.002]