2013-12-03 3 views
-1

У меня есть небольшая проблема. Мне нужно создать компонент, который захватывает некоторые события определенного типа независимого от компонента совета их количества. Пример: Мне нужно каждый раз, когда он называется событием TIBDatabase активным компонентом (Palette Interbase), прежде чем мой компонент, который запускает код события, активирует автоматическую настройку некоторых свойств компонента. Это делается автоматически? Пример: В то время, когда я помещаю компонент в форму, он автоматически делает это подключение к событиям? спасибо.Прикрепите или зацепите событие всех компонентов

Примечание: Я не мог воспроизвести примеры (How can I dynamically inject code into event handlers in Delphi?)

Отредактировано:

Я пытаюсь использовать пример "Ritsaert Hornstra". В примере принятого ответа мне пришлось бы сканировать все компоненты.

Пример работает только при активации компонента события, который я хочу контролировать. Пример: компонент «TIBQuery» имеет событие «AfterOpen», когда я воспроизвожу пример ссылки не работает. Однако, если я помещу что-либо в этом событии в экземпляре экземпляра компонента. Он не делает автоматически. Я использую Delphi XE3.

Edited 2:

Привет Craig Young. Сегодня у меня есть несколько систем в активном производстве. Что я хочу сделать, это реализовать журнал безопасности, который не был выполнен в то время, когда были разработаны системы. Это будет 13-й труд Геркулеса, который сделает это вручную во всех из них. Что мне нужно сделать. Компонент, который, когда adiconado в модуле данных подключает/присоединяет некоторые события компонентов базы данных InterBase. Мне просто нужен рабочий пример для меня, чтобы сделать все остальное. Я просто хочу знать, кто сделал, когда это было сделано, и что было сделано. Переменные System: g_s_user, g_s_date, g_s_sql. Поскольку почти все компоненты подключены к TDataset, я намерен сделать это и внедрить этот компонент.

У меня нет готового кода, потому что я до сих пор не знаю, как это сделать!

спасибо.

+2

Поскольку принятый ответ на указанную вами ссылку отлично работает, и ваш ответ выглядит как дубликат вопроса. Вы можете показать, что вы пробовали, а что - нет. – bummi

+0

Что именно вы пробовали? Кроме того, посмотрите на реализацию «TApplicationEvents». –

+4

Эти виды супер-родовых, автомагических, серебряных-пулевых ** псевдо-решений - вот что заставляет вас создавать серьезные проблемы, создавая ужасно сложные, очень жесткие и тем не менее системы. Я предлагаю вам скорее конкретно определить, чего вы пытаетесь достичь, и придумать конкретное решение конкретной проблемы. Например. Вы можете определить свой собственный компонент для использования вместо стандартных компонентов IB. Вы можете создавать свои компоненты во время работы с использованием фабрики; чтобы они были правильно настроены с самого начала. Наиболее подходящее решение зависит от ** особенностей ** вашей проблемы. –

ответ

0

Добавление обработчика событий программно в Delphi не так уж сложно. Например, предположим, что вы хотите добавить обработчик события для ответа на событие BeforeDelete. Вы делаете это так:

interface 

type 
    TMyDatasetHook = class 
    protected 
    TargetDataset: TDataset; 
    PreviousBeforeDelete: TDataSetNotifyEvent; 
    procedure DatasetBeforeDelete(aSender: TObject); 
    procedure CleanupHooks(aDataset: TDataset); 
    procedure SetupHooks(aDataset: TDataset); 
    public 
    constructor Create(aDataset: TDataset); 
    destructor Destroy; override; 
    end; 

implementation 

constructor TMyDatasetHook.Create(aDataset: TDataset); 
begin 
    TargetDataset := aDataset; 
    SetupHooks(TargetDataset); 
end; 

destructor TMyDatasetHook.Destroy; 
begin 
    CleanUpDataset(TargetDataset); 
    inherited; 
end; 

procedure TMyDatasetHook.DatasetBeforeDelete(aSender: TObject); 
begin 
    // Here goes your code to handler BeforeDelete 
    if Assigned(PreviousBeforeDelete) then 
    PreviousBeforeDelete(aSender); // Here we call the existing handler 
end; 

procedure TMyDatasetHook.CleanupHooks(aDataset: TDataset); 
begin 
    aDataset.BeforeDelete := PreviousBeforeDelete; 
end; 

procedure TMyDatasetHook.SetupHooks(aDataset: TDataset); 
begin 
    PreviousBeforeDelete := aDataset.BeforeDelete; // Here we save the existing handler 
    aDataset.BeforeDelete := DatasetBeforeDelete; 
end; 

Что вам нужно сделать сейчас, чтобы создать экземпляр этого класса прохождения целевого набора данных в конструктор

var 
    myDatasetHook: TMyDatasetHook; 
begin 
    myDatasetHook := TMyDatasetHook.Create(someTargetDataset); 
end; 

Что вам сейчас нужно адаптировать класс выше для удовлетворения ваши особые потребности.

0

AlexSC

Dude благодарит за ответ. Я действительно решил проблему. Это было некрасиво. но это сработало. Рад узнать, что есть такие люди, как вы, желающие помочь и сделать конструктивные комментарии. В отличие от нашего благородного друга Крейга. В дополнение к тому, что я не помогал, мой вопрос стал отрицательным. Если я пришел к stackoverflow, потому что я действительно изо всех сил пытаюсь это сделать. Представьте, что я хочу. Но все в порядке. Я очень благодарен всем, кто каким-то образом помог мне решить мою проблему. Что касается вас AlexSC, я опубликую то, что я сделал: PS: Я позволю себе улучшить свой код с примерами ok?

unit Sample; 

interface 

uses 
    System.SysUtils, System.Classes, Dialogs, IBDatabase, Data.DB, System.Win.Registry, Winapi.Windows; 

type 
    TSample = class(TComponent) 
    private 
    FBanco: TIBDatabase; 
    FDataSet: TDataSet; 
    L_FBeforeScroll: TDataSetNotifyEvent; 
    L_FBeforeRefresh: TDataSetNotifyEvent; 
    Procedure OnRefresh(DataSet: TDataSet); 
    Procedure OnScroll(DataSet: TDataSet); 
    Procedure SetBanco(Value: TIBDatabase); 
    public 
    { Public declarations } 
    constructor Create(AOwner : TComponent); override; 
    destructor Destroy;override; 
    published 
    { Published declarations } 
    property Database: TIBDatabase read FBanco write SetBanco; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('DataXML', [TSample]); 
end; 

constructor TSample.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
end; 

destructor TSample.Destroy; 
begin 
    inherited; 
end; 

procedure TSample.OnRefresh(DataSet: TDataSet); 
begin 
    if Assigned(L_FBeforeRefresh) then 
    L_FBeforeRefresh(FDataSet); 
end; 

procedure TSample.OnScroll(DataSet: TDataSet); 
begin 
    if Assigned(L_FBeforeScroll) then 
    L_FBeforeScroll(FDataSet); 
end; 

procedure TSample.SetBanco(Value: TIBDatabase); 
begin 
    FBanco := Value; 
    FDataSet := FBanco.DataSets[0]; 
    L_FBeforeScroll := FDataSet.BeforeScroll; 
    L_FBeforeRefresh := FDataSet.BeforeScroll; 
    FDataSet.BeforeScroll:=OnScroll; 
    FDataSet.BeforeScroll:=OnRefresh; 
end; 

end. 
Смежные вопросы