Oppure

Loading
17/09/10 15:13
Ho una classe che va ad interagire con gli eventi del form solo che se il programmatore che andrà ad utilizzare quella classe va a sovrascrivere i vari eventi del form che utilizza la classe non funziona più correttamente .
Come posso far funzionare la classe senza che essa utilizza per forza gli eventi del form (ad esempio : Onmousedown OnmouseUp Onmousemove )
?????
17/09/10 16:15
Saladino
Spero di aver capito bene :

Se vuoi che la tua classe abbia dei suoi eventi fai così :

es.

unit Unit1; 


interface

uses
  Classes, SysUtils;

type

   { TClasse }

   TClasse = class(TObject)
        private
          FOnRun  : TNotifyEvent;
        public
          procedure Run;
          property OnRun : TNotifyEvent read FOnRun write FOnRun  ;
      end;


implementation

{ TClasse }




procedure TClasse.Run;
begin
  //codice
  if Assigned(FOnRun) then
    FOnRun(Self);
  //codice
end;

end.     
 
 


Poi crei delle tue procedure con il tuo form e fai cosi :


unit Unit2; 

{$mode objfpc}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs ,Unit1;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Ogg : TClasse;
  public
    procedure Run(Sender : TObject);
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Ogg := TClasse.Create;
  Ogg.OnRun := @Run;
  ogg.Run;
end;

procedure TForm1.Run(Sender : TObject);
begin
  //codice
  ShowMessage('ciao');
end;


initialization
  {$I unit2.lrs}

end.                         



aaa
17/09/10 17:10
Unit secondaria :
Tclasse=class
procedure mouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Constructor Create;
end;

implementation
Constructor Tclasse.Create;
begin
application.mainform.onmouseup:=mouseUp;
end;
procedure Tclasse.mouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
showmessage('asd');
end;

Programma principale.
procedure TForm1.FormShow(Sender: TObject);
var t:Tclasse;
begin
   t:=tclasse.create;
   form1.onmouseup:=nil ; // ecco qui la classe non funziona piu correttamente è questo il problema !
end;



Questo intendo il problema ,è che voglio trovar un modo alternativo di usare gli eventi del form senza dover provocar il problema sopra posto.
Ultima modifica effettuata da 17/09/10 17:13
18/09/10 19:01
Saladino
Non so,ma secondo me quello che tu vorresti fare non rispetta l'OOP.

      procedure TForm1.FormShow(Sender: TObject);
      var t:Tclasse;
      begin
         t:=tclasse.create;
         form1.onmouseup:=nil ; // ecco qui la classe non funziona piu correttamente è questo il problema !
      end;


In questo codice credo che tu sbagli con :
 form1.onmouseup:=nil ;


Scusa non puoi prima attribuire un qualcosa al tuo form e poi toglierlo con nil.
Quindi devi togliere quella linea precedente.

E per questa :
application.mainform.onmouseup:=mouseUp;


Puoi direttamente darla al tuo form.
Es.
se il tuo form si chiama form1 fai :

Form1.OnMouseUp:=@mouseUp;


Spero di essere stato d'aiuto,:)

Ultima modifica effettuata da Saladino 18/09/10 19:03
aaa
18/09/10 19:59
Allora :
Tu metti di non sapere cosa fa dietro quella classe .. :
Un programmatore che usa quella classe se per caso va a modificare quell' evento che usa la classe ( in questo caso Mouseup) il programma non funziona piu questo intendo dire! .

form1.onmouseup:=nil 


Per quanto riguarda se mettere application.mainform o form1 non fa molta differenza .

E per questo che cerco un modo alternativo di intercettare quando si muove il mouse ecc.. per poter evitar questi problemi per il programmatore che usa la classe .