как в приложении отлавливать функции класса [Delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by darckmilord, 14 Sep 2010.

  1. darckmilord

    darckmilord Elder - Старейшина

    Joined:
    8 Feb 2007
    Messages:
    50
    Likes Received:
    14
    Reputations:
    0
    Допустим существует библиотека:
    PHP:
    library Demo;
    uses cvars        in    'cvars.pas';
    //exports
    begin
    end
    .
    Где 'cvars.pas' подобного содержания:

    PHP:
    unit cvars;

    interface
    function 
    mouse_Click(Button:Byte):booleanstdcall;

    const
        
    M_RBUTTON 0;
        
    M_LBUTTON 1;
        
    M_MBUTTON 2;

    var
        
    inpM_Click        : array[ 0..2 of boolean;

    type
      Cvar 
    = class
      protected
      public
        
    XY            :Single;
        
    WidthHeight    :Single;
      
    Parent:    Cvar;
        
    POnMouseClick    :procedure(mButton:Integer;Sender,Parent:Cvar);

        
    constructor Createvirtual;
        
    procedure OnMouseClick;
    end;

    IMPLEMENTATION

    constructor Cvar
    .Create;
    Begin
    inherited
    ;
        
    X         := 0;
        
    Y         := 0;
        
    Width     := 0;
        
    Height    := 0;
    End;

    procedure Cvar.OnMouseClick;
    Begin
    if @POnMouseClick <> nil Then
      begin
        
    if Mouse_ClickM_LBUTTON Then POnMouseClickM_LBUTTONSelfParent );
        if 
    Mouse_ClickM_RBUTTON Then POnMouseClickM_RBUTTONSelfParent );
        if 
    Mouse_ClickM_MBUTTON Then POnMouseClickM_MBUTTONSelfParent );
      
    end;
    End;

    function 
    mouse_Click;
    Begin
        Result 
    := inpM_ClickButton ];
        
    inpM_Click[Button]    := FALSE;
    End;

    end.
    вопрос к знатокам. Как правильно объявить класс в приложении и как нужно изменить код библиотеки, чтобы допустим при объявлении глобальной переменной в коде приложения:

    var myTest: cvar;

    можно было бы получать срабатывания myTest.OnMouseClick() код которой должен быть в библиотеке, а в приложении присутствовать только в качестве описания в хиддерах.
     
  2. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    В библиотеке:
    Code:
    type
    TOnMouseClickEvent = procedure(mButton:Integer;Sender,Parent:Cvar) of object;
    Cvar = class 
      protected 
         FOnMouseClick: TOnMouseClickEvent;
      public 
        X, Y            :Single; 
        Width, Height    :Single; 
      Parent:    Cvar; 
        constructor Create; virtual; 
        procedure OnMouseClick; 
        property OnMouseClick: TOnMouseClickEvent  read FOnMouseClick write FOnMouseClick;
    end;
    И
    Code:
    procedure Cvar.OnMouseClick; 
    Begin 
    if Assigned(FOnMouseClick) Then 
      begin 
        if Mouse_Click( M_LBUTTON ) Then FOnMouseClick( M_LBUTTON, Self, Parent ); 
        if Mouse_Click( M_RBUTTON ) Then FOnMouseClick( M_RBUTTON, Self, Parent ); 
        if Mouse_Click( M_MBUTTON ) Then FOnMouseClick( M_MBUTTON, Self, Parent ); 
      end; 
    End;
    В приложении:
    Code:
    var myTest: cvar;
    
    ...
    myTest:=cvar.Create;
    myTets.OnMouseClick := <Метод класса с нужным прототипом>
     
    #2 Redeemer, 14 Sep 2010
    Last edited: 14 Sep 2010
  3. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    А вообще - экспортировать объекты из библиотек некошерно;)
     
    1 person likes this.
  4. darckmilord

    darckmilord Elder - Старейшина

    Joined:
    8 Feb 2007
    Messages:
    50
    Likes Received:
    14
    Reputations:
    0
    спасибо большое, еще один вопрос, какой будет хиддер класса в приложении?

    и как понят это: <Метод класса с нужным прототипом>
    можно просто куском кода. я так намного быстрее понимаю.
     
    #4 darckmilord, 14 Sep 2010
    Last edited: 14 Sep 2010
  5. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Code:
    TForm1 = class(TForm)
    //Тут всякое стандартное
    public
      procedure DoMouseClick(mButton:Integer;Sender,Parent:Cvar);
    end;
    
    ...
    
    TForm1.DoMouseClick(mButton:Integer;Sender,Parent:Cvar);
    begin
      //Обработка
    end;
    
    TForm1.FormCreate(Sender: TObject);
    begin
    myTest:=cvar.Create;
    myTets.OnMouseClick:=DoMouseClick;
    end;
     
  6. darckmilord

    darckmilord Elder - Старейшина

    Joined:
    8 Feb 2007
    Messages:
    50
    Likes Received:
    14
    Reputations:
    0
    спасибо, все очень внятно.

    простите упустил один момент, а как правильно в приложении объявить Сvar ведь он у нас в длл.
     
    #6 darckmilord, 14 Sep 2010
    Last edited: 14 Sep 2010