Допустим существует библиотека: PHP: library Demo; uses cvars in 'cvars.pas'; //exports begin end. Где 'cvars.pas' подобного содержания: PHP: unit cvars; interface function mouse_Click(Button:Byte):boolean; stdcall; const M_RBUTTON = 0; M_LBUTTON = 1; M_MBUTTON = 2; var inpM_Click : array[ 0..2 ] of boolean; type Cvar = class protected public X, Y :Single; Width, Height :Single; Parent: Cvar; POnMouseClick :procedure(mButton:Integer;Sender,Parent:Cvar); constructor Create; virtual; 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_Click( M_LBUTTON ) Then POnMouseClick( M_LBUTTON, Self, Parent ); if Mouse_Click( M_RBUTTON ) Then POnMouseClick( M_RBUTTON, Self, Parent ); if Mouse_Click( M_MBUTTON ) Then POnMouseClick( M_MBUTTON, Self, Parent ); end; End; function mouse_Click; Begin Result := inpM_Click[ Button ]; inpM_Click[Button] := FALSE; End; end. вопрос к знатокам. Как правильно объявить класс в приложении и как нужно изменить код библиотеки, чтобы допустим при объявлении глобальной переменной в коде приложения: var myTest: cvar; можно было бы получать срабатывания myTest.OnMouseClick() код которой должен быть в библиотеке, а в приложении присутствовать только в качестве описания в хиддерах.
В библиотеке: 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 := <Метод класса с нужным прототипом>
спасибо большое, еще один вопрос, какой будет хиддер класса в приложении? и как понят это: <Метод класса с нужным прототипом> можно просто куском кода. я так намного быстрее понимаю.
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;
спасибо, все очень внятно. простите упустил один момент, а как правильно в приложении объявить Сvar ведь он у нас в длл.