Newsgroup: it.comp.lang.delphi
Titolo: Problema sulla creazione di un nuovo componente

Salve a tutti, ho creato un nuovo componente ereditato dall'oggetto 
TWebBrowser.
Sul nuovo oggetto dovrei aggiungere gli eventi onmousemove, onmouseup e 
onmousedown e utilizzarli per caricarci delle procedure.
Problema: sono riuscito a creare gli eventi ma tutto quello che 
inserisco come codice in ognuno di essi, non va.. il codice che ho 
creato è questo:
unit WebBrowser9;
interface
uses
  SysUtils, Classes, Controls, OleCtrls, SHDocVw;
type
  TWebBrowser9 = class(TWebBrowser)
  private
  FOnMouseDown: TMouseEvent;
    { Private declarations }
  protected
    { Protected declarations }
  public
  procedure WebBrowserMouseDown(Button: TMouseButton; Shift: TShiftState;
    X, Y: Integer);
    { Public declarations }
  published
  property onMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
    { Published declarations }
  end;
procedure Register;
implementation
procedure TWebBrowser9.WebBrowserMouseDown(Button: TMouseButton;
                              Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(FOnMouseDown) then
        FOnMouseDown(Self, Button, Shift, X, Y);
end;
procedure Register;
begin
  RegisterComponents('Rocco', [TWebBrowser9]);
end;
end.
Qualcuno mi saprebbe dire dove sbaglio?
--- posted by geoForum on 
http://www.delphiedintorni.it

 Qualcuno mi saprebbe dire dove sbaglio?
Semplicemente, non assegni mai FOnMouseDown.
FOnMouseDown sarà sempre not assigned....
-- 
Alberto Salvati
A NEAPOLITAN Delphi Developer who is studying c# and .net
"Dicette 'o pappece 'nfaccia 'a noce dammi 'o tiempo che pure te spertoso"


Come lo risolvo?


 Come lo risolvo?
Alberto, per favore, ti invito a non rispondere.
Non se ne può più.
E basta!
Ciao,
Andrea

Non se ne può più.
In primis, è una settimana che sto cercando di farlo funzionare..
Comunque ho anche provato a non assegnare FOnMouseDown.
Se creo solo l'evento con property OnMouseDown...., tutto quello che vado
ad inserire come codice, alla pressiode del tasto del mouse non funziona


> Comunque ho anche provato a non assegnare FOnMouseDown.
xche, prima lo assegnavi? se si, dove?
Magari non hai postato il codice completo...


 E basta!
Andrea, č una vita che dico basta....
Questa volta lo diro + forte, ok?


> Come lo risolvo?
Prima di tutto, documentandoti su metodi astratti, virtuali e la loro 
ridefinizione nelle classi discendenti, con particolare riferimento ai 
costruttori.
Inoltre, gia che ci 6, vediti anche le interfacce.
Chi lavora in delphi spesso non ha l'esigenza di usarle xche, a 
differenza di c#, delphi permette di dichiarare metodi astratti in 
classi non astratte.
Poiche' c# non permette cio, l'unico modo di usare comodamente metodi 
estratti, non avendo l'ereditarietą multipla da classi (GRANDE NON 
AVERLA!) ma solo da interfacce, e' prp l'uso delle interfacce.
Tutto cio di cui ho parlato in questo post č documentato:
a) guida in linea di delphi
b) guida in linea di 
visualstudio.net
c) credo anche su documentazione di suite di sviluppo ij java
d) un qualsiasi manuale di programmazione OOP, in quanto pur esistendo 
differenze tra i vari linguaggi (ad esempio c# non permette di ereditare 
i costruttori ma solo di richiamare il costruttore del genitore..) i 
paradigmi di metodo virtuale, classe e metodi astratti, ereditarietą 
multipla da classe e da interfaccia, proprieta e metodi statici sono 
essenzialmente uguali
e) 
msdn.com
f) una svrangata di siti dedicati alla programmazione
GudNait


 Questa volta lo diro + forte, ok?
Mi rendo conto che moderare il newsgroup è inutile, insensato e dannoso,
però qualche K-line ci vorrebbe...
Andrea

Premessa: il codice che devo far funzionare lo devo inserire nell'evento
onmousedown, non dal codice dell'oggetto ma dall'evento stesso tipo
onmousedown del TEdit.
Ho provato anche cosě, ma non va! Tutto il codice che inserisco in
onmousedown non funziona; č come se non sapesse che al click del mouse
dove effettuare la procedura inserita in onmousedown.
unit WebBrowser9;
interface
uses
  SysUtils, Classes, Controls, OleCtrls, SHDocVw, Dialogs;
type
  FOnMouseDown = procedure(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) of object;
  TWebBrowser9 = class(TWebBrowser)
  private
  FOMouseDown: TMouseEvent;
    { Private declarations }
  protected
    { Protected declarations }
  public
  constructor Create(Aowner : TComponent); override;
  procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
    { Public declarations }
  published
  property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
    { Published declarations }
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Rocco', [TWebBrowser9]);
end;
{ TWebBrowser9 }
constructor TWebBrowser9.Create(Aowner: TComponent);
begin
  inherited;
FOnMouseDown:=OnMouseDown;
end;
procedure TWebBrowser9.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
if Assigned(FOnMouseDown) then
        FOnMouseDown(Self, Button, Shift, X, Y);
end;
end.


viper78 ha scritto:
[cut]
Quello che non dici (o che non ho capito) e voglio sperare che come 
minimo tu l'abbia già verificato, è se MouseDown viene richiamato e non 
viene eseguito FOnMouseDown perchè risulta non assegnato, oppure se 
nemmeno MouseDown viene eseguito... sarebbe già un buon punto di 
partenza per risolvere il problema.
Inoltre, se non ricordo male, ma è da verificare con i soliti mezzi, per 
gli eventi, override o no, è necessaria la clausola message, oppure è 
necessario scrivere una parte di wndproc del controllo... Sicuramente, 
se hai la necessità di inserire un nuovo evento, non stai eseguendo 
l'override in uno già esistente...
Ciao,
Gianluca.

viper78 ha scritto:
[cut]
Ci ho pensato solo ora.
Valuta anche l'ipotesi di impostare correttamente l'orario del computer. 
Mi "fa strano" rispondere ad una domanda che viene posta mezz'ora dopo ;)
Ciao,
Gianluca.


L'orario come si imposta, visto che' l'orario di windows è corretto?
Se richiamo la procedura mousedown in onmousedown, tutto quello che metto
all'interno della procedura non viene eseguito se invece la procedura la
richiamo in un evento già esistente dell'oggetto, va!


 richiamo in un evento già esistente dell'oggetto, va!
Io insisto sempre perchè si sia chiari nell'analizzare, ma soprattutto 
nel proporre agli altri problemi.
Cosa vuol dire che *tutto* il codice che metti all'interno di una 
procedura non viene eseguito?
Assioma 1:
Una procedura può non essere /richiamata/ o /non richiamata/, ma dal 
momento che al suo interno c'è almeno una riga valida, il suo codice 
sarà *sempre* /eseguito/.
Quindi, rifacendomi all'altro mio post:
WebBrowserMouseDown, viene richiamata o no?
Se si, allora una riga di codice al suo interno viene *sempre* eseguita. 
Solo che probabilmente il test di Assigned non è corretto.
Se no, allora significa che il problema è un'altro: il controllo non 
contiene il codice per rispondere a al messaggio WM_xxx che non ricordo 
quale sia. Hai provato a vedere le varie direttive /message/, 
/DefWindowProc/, ecc.?
Se quello che hai scritto è tutto il sorgente del controllo, come minimo 
manca proprio il pezzo di codice che permette l'associazione della 
procedura evento al messaggio inviato dal Sistema Operativo.
Ciao,
Gianluca.


Se la procedura Mousedown la richiamo da onmousedown non va, se la
richiamo da un'altro evento va, quindi l'evento onmousedown non è
associato al click in giu del mouse!


 associato al click in giu del mouse!
Che RAZZO significa "non và"?
Che errore ottieni?
Ciao,
Andrea


Non ottengo nessun errore, semplicemente la procedura, se la richiamo
dall'evento onmousedown non funziona!
P.S. L'evento onmousedown è un evento che ho creato io nell'oggetto
webbrowser.
Il problema è che l'evento onmousedown non sa che deve avviarsi quando si
presenta il click in giù del mouse
