Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2008, 12:49   #1
Fausto
 
Регистрация: 06.06.2008
Сообщений: 3
По умолчанию Создание события формы, доступного в Disign-time

Подскажите, как можно создать событие формы, так что бы оно было доступно в Object Inspector. Вроде бы все делаю верно... Создал форму, прописал событие в секции Published, но когда создаю потомка этой самой формы, то событие в OI не появляется . В чем может быть ошибка?

Вот объявление класса

Код:
unit uCustomTmplEdit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, dxSkinsCore, dxSkinsDefaultPainters, dxSkinscxPCPainter,
  Menus, cxLookAndFeelPainters, StdCtrls, cxButtons, cxControls, cxPC, DB,
  dxmdaset, ADODB, uTmplFunctions;

type
  TPrepareProc = function (DataSet: TADOQuery; ID:Variant; Params:TParams):boolean of object;

  TfrmCustomTmplEdit = class(TForm)
    cxTabControl1: TcxTabControl;
    cxTabControl2: TcxTabControl;
    btnCancel: TcxButton;
    btnOK: TcxButton;
    dsMain: TDataSource;
    qMain: TADOQuery;
    procedure btnCancelClick(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
//    m_MasterRS        : TADOQuery;
    UseLinkToMasterRS : boolean;

    FOnCheckData    : TNotifyEvent;     // Событие для проверки введенных данных
    FOnPrepareAdd   : TPrepareProc;     // Подготовка добавления
    FOnPrepareEdit  : TPrepareProc;     // Подготовка редактирования
    FOnPrepareDel   : TPrepareProc;     // Подготовка удаления
    FOnPrepareView  : TPrepareProc;     // Подготовка просмотра
  protected
    KeyFieldName    : string;
    KeyFieldValue   : Variant;
    TableName       : string;
    Mode            : integer;
    MR_Res          : integer;
    CloseFlag       : boolean;

    AddFormCaption  : string;
    EditFormCaption : string;
    DelFormCaption  : string;
    ViewFormCaption : string;
    AddBtnCaption   : string;
    EditBtnCaption  : string;
    DelBtnCaption   : string;

    AddParams       : TParams;
    EditParams      : TParams;
    DelParams       : TParams;
    ViewParams      : TParams;

    function  CopyRecord(ID:variant;Params:TParams):boolean;
    procedure LinkToMasterRS(MasterRS:TADOQuery);
  public
    class function Add(Params:TParams; MasterDataSet:TADOQuery):boolean;
    class function Edit(ID:variant; Params:TParams; MasterDataSet:TADOQuery):boolean;
    class function Delete(ID:variant; Params:TParams; MasterDataSet:TADOQuery):boolean;
    class function View(ID:variant; Params:TParams; MasterDataSet:TADOQuery):boolean;
  published
    property OnPrepareAdd  :TPrepareProc read FOnPrepareAdd write FOnPrepareAdd stored True;
    property OnPrepareEdit :TPrepareProc read FOnPrepareEdit write FOnPrepareEdit stored True;
    property OnPrepareDel  :TPrepareProc read FOnPrepareDel write FOnPrepareDel stored True;
    property OnPrepareView :TPrepareProc read FOnPrepareView write FOnPrepareView stored True;
    property OnCheckData   :TNotifyEvent read FOnCheckData write FOnCheckData stored True;
  end;


implementation

uses DataBase;
{$R *.dfm}
...
Fausto вне форума Ответить с цитированием
Старый 06.06.2008, 13:05   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Форму нужно зарегистрировать так-же как и компонент:

Код:
procedure Register;

implementation
..
procedure Register;
begin
    RegisterCustomModule(TfrmCustomTmplEdit , TCustomModule);
end;
Но и тогда, чтобы свойства появились, нужно проделать дополнительную работу. Создаем новую форму, сохраняем, меняем класс предок на наш класс. И только после повторного открытия Delphi свойства будут доступны.

Я бы не советовал применять этот подход. Мороки больше, чем получаемых преимуществ (если они вообще есть). Проще создать форму нужного класса в run-time.
alexBlack вне форума Ответить с цитированием
Старый 06.06.2008, 14:08   #3
Fausto
 
Регистрация: 06.06.2008
Сообщений: 3
По умолчанию

Спасибо, все получилось.

А в чем недостатки этого подхода?
Fausto вне форума Ответить с цитированием
Старый 06.06.2008, 15:34   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Fausto Посмотреть сообщение
А в чем недостатки этого подхода?
Один из недостатков я описал - неочевидный путь создания формы.
А дальше начинаются проблемы с поддержкой. Меняем форму, приходится вспоминать какие наследники были от этой формы и как изменения повлияют на них. А если такая форма в библиотеке и наследники в других проектах - вообще беда. К тому же не вижу особых преимуществ в добавлении published свойств к форме.
alexBlack вне форума Ответить с цитированием
Старый 06.06.2008, 16:12   #5
Fausto
 
Регистрация: 06.06.2008
Сообщений: 3
По умолчанию

Думаю, тут "палка о двух концах"... И все будет зависеть от конкретной задачи... Я как раз и хочу сделать несколько типовых форм, что бы от них наследовать все остальные. Таким образом функционал типовых форм будет постоянно расширяться, и не будет необходимости править наследников. Хотя согласен, что нужно внимательно добавлять изменения в шаблоны, особенно если какая-то из форм наследников серьезным образом переделана, и в ней перекрыто много методов родителя.
Fausto вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция Time SanekIrk Общие вопросы Delphi 2 11.07.2008 22:13
Создание события потока Arteom Общие вопросы Delphi 9 11.01.2008 21:16
Создание формы Pilot Microsoft Office Excel 2 15.11.2007 10:35
создание не прямоугольной формы Илюха Общие вопросы Delphi 5 14.10.2007 15:56