Конференция "Компоненты" » Как сохранить свойство в 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. Не нужно пересоздавать самого себя

    Про создать поле с нужным классом это понятно но это лишний уровень в дереве объектов что совсем некрасиво :(((
  • DimaBr © (08.01.12 16:41) [20]
    Вам не нужна коллекция, у вас разнотипные элементы
  • MegaVolt_old (08.01.12 17:21) [21]
    Это я уже слышал. Я побуду упрямым. Я хочу сделать по своему. Есть идеи кка? Я не хочу обсуждать альтернативные варианты.
  • brother © (08.01.12 17:26) [22]
    > Я не хочу обсуждать альтернативные варианты.

    проктологу расскажешь...
  • DimaBr © (08.01.12 21:30) [23]
    Хорошо. У вас есть некий список, элементы которого вы хотите сохранить в ресурс собственным способом, отличным от стандартного. DefineProperties вам в помощь.
  • MegaVolt_old (09.01.12 01:20) [24]
    >DefineProperties вам в помощь.

    Это будет вариант 1 из [13] но нужно ещё как то пересоздать item
  • DimaBr © (09.01.12 01:40) [25]
    Если честно, то мне так и не ясно - зачем так уродовать коллекции. Вы хотите перестроить структуру (что бы создавались разнотипные Item-ы), вы хотите перестроить серриализацию.
    А ради чего всё это ? Ради TCollectionEditor ???
  • MegaVolt_old (09.01.12 10:09) [26]
    Ради того чтобы не писать свою коллекцию которая в паре деталей отличается от родной. Т.е. само собой можно взять исходник от коллекции творчески его допилить подправив пару мест но как то это не красиво смотриться :( Тащить гору дублирующего кода вместо того чтобы подправить пару мест.
  • DimaBr © (10.01.12 00:34) [27]
    > Тащить гору дублирующего кода
    Может вам лучше в сторону KOL посмотреть ???
  • MegaVolt_old (10.01.12 00:44) [28]
    >Может вам лучше в сторону KOL посмотреть ???

    Меня не размер кода волнует а скорее некая условная красота кода. По которой исправленные 2-3 функции это красиво. Содранный целиком класс не очень.

    Я как тот страус - лучше день потерять потом за 5 минут  долететь (с) Мультик

    Кстати возникла проблема :( Свойства которые сохраняет DefineProperty сохраняются в конце списка свойст а не в начале :(((
  • DimaBr © (10.01.12 02:07) [29]
    И в чём же здесь проблема ? Какая разница что и где сохраняется ?
  • DimaBr © (10.01.12 02:12) [30]

    > Ради того чтобы не писать свою коллекцию которая в паре деталей отличается от родной.


    TList - тоже коллекция, и хранить можно что угодно, а сохраняете всё равно по своему. Чем не устраивает ???
  • MegaVolt_old (10.01.12 10:13) [31]
    >Какая разница что и где сохраняется ?

    Если тип сохранён первым то при вычитывании есть возможность создать нужный класс и дальше он будет заполнен автоматом. Если же запись о типе класса последняя то поля отсутствующие в предке выдадут ошибку :(

    >TList - тоже коллекция, и хранить можно что угодно, а сохраняете всё равно по своему. Чем не устраивает ???

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