Конференция "Начинающим" » Inherited в dfm-файле
 
  • Германн © (11.01.17 02:02) [0]
    Какой сакральный смысл имеет строка в dfm-файле
    например
    inherited OKBtn: TButton


    Очевидно я никогда раньше не сталкивался с наследованием форм, кроме праматери TForm.
  • johnny © (11.01.17 08:42) [1]
    Удалено модератором
  • KSergey © (11.01.17 14:30) [2]
    Это для всех так кнопок (и в чистом проекте), или с этой кнопкой вы что-то особенное делали?
  • Inovet © (11.01.17 15:58) [3]
    Что-то менялось у кнопки по сравнению с родительской формой.
  • Германн © (11.01.17 20:37) [4]
    Вот весь файл
    inherited fSaveVarDlg: TfSaveVarDlg
     Caption = #1042#1082#1083#1102#1095#1080#1090#1100' '#1101#1090#1086#1090' '#1074#1072#1088#1080#1072#1085#1090' '#1074' '#1089#1087#1080#1089#1086#1082' '#1080#1079#1074#1077#1089#1090#1085#1099#1093'?'
     ClientWidth = 476
     PixelsPerInch = 96
     TextHeight = 13
     inherited Bevel1: TBevel
       Width = 457
     end
     inherited OKBtn: TButton
       Left = 62
       Top = 181
       Caption = #1044#1072
       ModalResult = 6
     end
     inherited CancelBtn: TButton
       Left = 342
       Top = 181
       Caption = #1053#1077#1090
       ModalResult = 0
     end
     object LabeledEdit1: TLabeledEdit
       Left = 16
       Top = 32
       Width = 121
       Height = 21
       EditLabel.Width = 61
       EditLabel.Height = 13
       EditLabel.Caption = 'LabeledEdit1'
       TabOrder = 2
     end
     object LabeledEdit2: TLabeledEdit
       Left = 174
       Top = 32
       Width = 121
       Height = 21
       EditLabel.Width = 61
       EditLabel.Height = 13
       EditLabel.Caption = 'LabeledEdit2'
       TabOrder = 3
     end
    end

  • Германн © (12.01.17 02:26) [5]
    Сомневаюсь что даже Юрий Сергеевич не сможет ответить для чего это когда-то, кем-то было придумано. Разве что на всякий случай. Типа - "хуже не будет, а если что, то придумаем как использовать". :)
  • Inovet © (12.01.17 08:19) [6]
    Наследуешься тыканьем мышкой от собственной же базовой формы в проекте, у чего-то из имеющегося изменил, например, ширину

     inherited Bevel1: TBevel
       Width = 457
     end


    Добавил ещё что-то

     object LabeledEdit1: TLabeledEdit

  • Inovet © (12.01.17 08:19) [7]
    Или о чём речь?
  • icWasya © (12.01.17 09:26) [8]
    Inherited - это указание загрузчику формы что объект не нужно создавать, он уже создан в родительской форме, и надо только поменять некоторые свойства.
  • Юрий Зотов © (12.01.17 12:51) [9]
    >  для чего это когда-то, кем-то было придумано

    Кем - разработчиками Delphi. Еще в Borland'е.

    Когда - вместе с репозиторием. То есть, в первой же версии Delphi, насколько помню (впрочем, могу и ошибаться, ведь с тех пор 20 лет прошло).

    Для чего - уже ответили. Для поддержки наследования не только кода, но и  ресурсов (ведь DFM - это ресурс).
  • Германн © (13.01.17 01:19) [10]

    > Юрий Зотов ©   (12.01.17 12:51) [9]

    Судя по отсутствию примеров из собственной твоей практики, это было придумано как возможность, но не придумано как получить пользу из такого наследования.
    Может я и ошибаюсь, но в моем случае такой код получился, когда я решил добавить в программу некий диалог. Для чего решил воспользоваться стандартным шаблоном из репозитория Standard Dialog (Horizontal).
    Menu - File - New - Other
    Изменил в нем заголовок, добавил несколько LabeledEdit.
    И каким-то образом получил такой dfm. Что тут, отчего, как и для чего наследуется не понимаю.

    P.S.
     Побочным следствием такого глюка явилось исчезновение из репозитория того самого Standard Dialog (Horizontal). Хотя файл
    "c:\Program Files (x86)\CodeGear\RAD Studio\5.0\ObjRepos\DelphiWin32\OKCANCL1.PAS" никуда не делся и ничуть не испортился.
  • Юрий Зотов © (13.01.17 09:20) [11]
    > Судя по отсутствию примеров из собственной твоей практики,
    > это было придумано как возможность, но не придумано как
    > получить пользу из такого наследования.


    Примеры я просто не стал приводить, и без них все ясно. А польза - несомненная. Один раз делаем форму-предок (и выносим в нее все общее), затем плодим от нее кучу потомков (добавляя или меняя в каждом из них все индивидуальное). Причем даже не обязательно в одном проекте, можно и в разных.

    > Что тут, отчего, как и для чего наследуется не понимаю.

    1. Все, что с inherited - наследуется. При этом некоторые свойства могут быть изменены:

    inherited CancelBtn: TButton // Кнопка унаследована от формы-предка
     Left = 342 // И у этой кнопки изменена горизонтальная позиция
    end


    2. Все, что с object - добавлено.

    3. Как наследуется. Сначала загружается DFM самой первой (старшей) формы-предка и при этом создается все, что на ней лежит. Потом последовательно читаются DFM всех потомков, от старшего к младшему. При чтении каждого потомка все, что с object - создается, а все, что с inherited - модифицируется.

    4. Зачем наследуется. Повторное использование DFM предков в потомках снижает трудоемкость разработки и уменьшает объем EXE. Кроме того, удобно вносить общие изменения (вносим их в DFM только предка, а действуют они во всех потомках).
  • Германн © (14.01.17 00:14) [12]
    Спасибо за разъяснения.
  • Германн © (14.01.17 03:00) [13]
    Уже примерно ясно для чего нужен репозиторий, кроме банального использования.
Есть новые Нет новых   [84873   +46][b:0.001][p:0.004]