Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Eventi del form
Forum - Delphi - Eventi del form

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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 )
?????

PM
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 18:15
Venerdì, 17/09/2010
Spero di aver capito bene :

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

es.

Codice sorgente - presumibilmente Delphi

  1. unit Unit1;
  2.  
  3.  
  4. interface
  5.  
  6. uses
  7.   Classes, SysUtils;
  8.  
  9. type
  10.  
  11.    { TClasse }
  12.  
  13.    TClasse = class(TObject)
  14.         private
  15.           FOnRun  : TNotifyEvent;
  16.         public
  17.           procedure Run;
  18.           property OnRun : TNotifyEvent read FOnRun write FOnRun  ;
  19.       end;
  20.  
  21.  
  22. implementation
  23.  
  24. { TClasse }
  25.  
  26.  
  27.  
  28.  
  29. procedure TClasse.Run;
  30. begin
  31.   //codice
  32.   if Assigned(FOnRun) then
  33.     FOnRun(Self);
  34.   //codice
  35. end;
  36.  
  37. end.



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

Codice sorgente - presumibilmente Delphi

  1. unit Unit2;
  2.  
  3. {$mode objfpc}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs ,Unit1;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     procedure FormCreate(Sender: TObject);
  16.   private
  17.     Ogg : TClasse;
  18.   public
  19.     procedure Run(Sender : TObject);
  20.   end;
  21.  
  22. var
  23.   Form1: TForm1;
  24.  
  25. implementation
  26.  
  27. { TForm1 }
  28.  
  29. procedure TForm1.FormCreate(Sender: TObject);
  30. begin
  31.   Ogg := TClasse.Create;
  32.   Ogg.OnRun := @Run;
  33.   ogg.Run;
  34. end;
  35.  
  36. procedure TForm1.Run(Sender : TObject);
  37. begin
  38.   //codice
  39.   ShowMessage('ciao');
  40. end;
  41.  
  42.  
  43. initialization
  44.   {$I unit2.lrs}
  45.  
  46. end.




PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 19:10
Venerdì, 17/09/2010
Unit secondaria :
Codice sorgente - presumibilmente Delphi

  1. Tclasse=class
  2. procedure mouseUp(Sender: TObject; Button: TMouseButton;
  3.   Shift: TShiftState; X, Y: Integer);
  4. Constructor Create;
  5. end;
  6.  
  7. implementation
  8. Constructor Tclasse.Create;
  9. begin
  10. application.mainform.onmouseup:=mouseUp;
  11. end;
  12. procedure Tclasse.mouseUp(Sender: TObject; Button: TMouseButton;
  13.   Shift: TShiftState; X, Y: Integer);
  14. begin
  15. showmessage('asd');
  16. end;


Programma principale.
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.FormShow(Sender: TObject);
  2. var t:Tclasse;
  3. begin
  4.    t:=tclasse.create;
  5.    form1.onmouseup:=nil ; // ecco qui la classe non funziona piu correttamente è questo il problema !
  6. 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 il 17/09/2010 alle 19:13
PM
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 21:01
Sabato, 18/09/2010
Non so,ma secondo me quello che tu vorresti fare non rispetta l'OOP.

Codice sorgente - presumibilmente Delphi

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



In questo codice credo che tu sbagli con :
Codice sorgente - presumibilmente Plain Text

  1. 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 :
Codice sorgente - presumibilmente Plain Text

  1. application.mainform.onmouseup:=mouseUp;



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

Codice sorgente - presumibilmente Plain Text

  1. Form1.OnMouseUp:=@mouseUp;



Spero di essere stato d'aiuto,:)


Ultima modifica effettuata da Saladino il 18/09/2010 alle 21:03
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 21:59
Sabato, 18/09/2010
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! .

Codice sorgente - presumibilmente Plain Text

  1. 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 .

PM
Usa i commenti per chiedere spiegazioni o ringraziare le risposte.