Конференция "Компоненты" » Как сделать класс и форму на подобие TDataModule ? [D7, WinXP]
 
  • incm (17.12.07 17:35) [0]
    Нужно сделать форму-контейнер на подобие TDataModule, но со своими свойствами. Гдавное что бы можно было создавать в дизайнере форму, на которую размещать невизуальные компоненты.
    Пробовал наследо ваться от TDataModule. Потом создавал форму типа DataModule, а в созданном класссе место наследования от TDataModule, подставлял свой класс, который наследован от TDataModule.
    Но после сохранения и повторного открытия этой формы, она приобретала вид обычной визуальной формы.
  • Юрий Зотов © (17.12.07 17:46) [1]
    А почему именно форма, чем DataModule не устраивает? Это ведь и есть контейнер невизуальных компонентов.

    Чтобы добавить свои свойства - делаем пакет с наследником DataModule, в наследнике добавляем эти свойства и регистрируем его через вызов RegisterCustomModule в процедуре Register.
  • incm (17.12.07 18:15) [2]

    > Юрий Зотов


    Пробовал так, разве что не регистрировал через RegisterCustomModule.
    Делал как описал выше, создавал форму от TDataModule, но вместо наследования от нее наследовался от своей. Но после открытия сохраненного проекта, форма превращалась из контейнера в обычную визуальную форму.
  • Юрий Зотов © (17.12.07 18:41) [3]
    > incm   (17.12.07 18:15) [2]

    Прочитал 2 раза. Не понял ни разу. Например, не понял, каким образом можно "создать форму от TDataModule". Остального тоже не понял. Сорри.
  • incm (18.12.07 10:15) [4]

    > Юрий Зотов


    > Прочитал 2 раза. Не понял ни разу. Например, не понял, каким
    > образом можно "создать форму от TDataModule". Остального
    > тоже не понял. Сорри.


    Вобщем делал так:

    создал модуль данный, там создался класс
    MyClass = class(TDataModule)
    .......

    я подключив модуль со своим классом TParentClass, который наследует TDataModule, поправил в созданном класе вот так:

    MyClass = class(TParentClass)
    ......

    Изначально все компилилось, но когда я сохранил проект, закрыл а потом открыл его, то форма в модуле с MyClass превратилась из контейнера в обычную визуальную форму.
  • Kolan © (18.12.07 10:43) [5]
    Все слова знаю понять ниче не могу. Еще эта стиховорная форма, меня убивает…

    создал модуль данный…
    я подключив модуль …
    Мояковский?

    TParentClass А это кто? Про него не слова же нет…

    Весь ко секции interface приведите, понять ниче невозможно…
  • Kolan © (18.12.07 10:43) [6]

    > Весь ко

    Весь код
  • Юрий Зотов © (18.12.07 11:10) [7]
    > incm   (18.12.07 10:15) [4]

    Если TParentClass - форма, то удивляться нечему, все так и должно быть. А если нет, то непонятно, о какой форме идет речь.
  • DrPass © (18.12.07 11:39) [8]

    > Юрий Зотов ©   (18.12.07 11:10) [7]


    > А если нет, то непонятно, о какой форме идет речь.

    Ну почему непонятно. Догадаться несложно - если класс-контейнер не зарегистрирован, Delphi не знает, какой дизайнер ему подсунуть и подсовывает дефолтный дизайнер, т.е. дизайнер форм. Это ее стандартное поведение.


    > incm   (17.12.07 18:15) [2]
    >
    > > Юрий Зотов
    >
    >
    > Пробовал так, разве что не регистрировал через RegisterCustomModule.
    >

    Молодец. Теперь попробуй еще раз, но без "разве что не"
  • Юрий Зотов © (18.12.07 11:49) [9]
    > DrPass ©   (18.12.07 11:39) [8]

    То есть, Вы хотите сказать, что если TParentClass - наследник TDataModule, то MyClass все равно откроется в виде формы?
  • DrPass © (18.12.07 12:03) [10]

    > Юрий Зотов ©   (18.12.07 11:49) [9]

    Да. Это фича такая... По крайней мере, во времена D6 я с ней сталкивался.
  • Юрий Зотов © (18.12.07 12:07) [11]
    Точно, только что проверил (D7). По крайней мере, если TParentClass сидит не в пакете, а в проекте, то так оно и есть.

    Значит, все дело в регистрации.
  • jack128_ (19.12.07 10:06) [12]

    > Значит, все дело в регистрации.

    ИМХО дело в том, что dfm'у нуно подправить. первым словом там не object , а inherited должно идти...
  • Юрий Зотов © (19.12.07 15:19) [13]
    > jack128_   (19.12.07 10:06) [12]

    Девствиттно.
    (с) Майор Староконь.

    > incm

    Это означает, что можно обойтись без регистрации и воообще без создания пакета - то есть, все файлы будут только в проекте. Но нужно не менять предка MyClass вручную, а сразу создавать MyClass через File-New-Other, затем в диалоге перейти на вкладку проекта, там выбрать TParentClass, проставить птичку "inherits" и нажать ОК.
  • DevilDevil © (25.12.07 19:41) [14]
    сталкивался с такой проблемой недавно.
    (не могу сдержаться. "компоненты Delphi - удивительно хорошая вещь!!!")

    1) создать пакет с компонентом TMyDataModule, наследованный от TDataModule.
    2) создать ещё один файл, "PackageUnit.pas", например; добавляешь юнит в поект. В нём объявляешь процедуру Register, в которой регистрируешь свой класс-модуль.
    3) компилируешь проект.
    4) создаёшь DataModule, меняешь TDataModule на свой класс.
    5) наслаждаешься жизнью.
 
Конференция "Компоненты" » Как сделать класс и форму на подобие TDataModule ? [D7, WinXP]
Есть новые Нет новых   [120324   +112][b:0][p:0.001]