Newsgroup: it.comp.lang.delphi
Titolo: Cambiare la forma del cursore del mouse su di un componente

Avrei bisogno di cambiare la forma al cursore del mouse su di un TPaintBox
quando accadono alcuni eventi...
Cambiando la proprietà Cursor funziona, ma se il mouse è già sopra il
PaintBox il cursore viene aggiornato solo non appena viene spostato il
mouse...
Come faccio a rendere subito effettiva la modifica del cursore senza dover
attendere il movimento del mouse?
Grazie mille!
    Dario

 attendere il movimento del mouse?
non sono sicuro di aver capito. Ho provato a simulare un simile problema nel
codice seguente.
Secondo me puoi  provare ad inviare un messaggio al paintbox di tipo
WM_MOUSEMOVE. Segue uno stralcio del codice:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyMessage: TMessage;
begin
  Test := True;
  MyMessage.Msg := WM_MOUSEMOVE;
  PaintBox1.Dispatch(MyMessage);
end;
ovviamente nell'evento onMouseMove del paintbox:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
  if not test then
    Screen.Cursor := crHourglass
  else
    Screen.Cursor := crDefault;
end;
ciao
guastatore

Ti ringrazio intanto della risposta, ho provato a fare come dicevi ma non mi
ha cambiato...
In pratica vorrei che premendo il tuo Button1 (con la tastiera, mentre il
mouse č sopra il PaintBox) si cambiasse il cursore del mouse (senza
muoverlo)...
Come dicevo cambiando solo la proprietą cursor del PaintBox il cursore
cambia solo al movimento del mouse... e anche inviando il messaggio
WM_MOUSEMOVE non succede niente... mistero?
Grazie!
    Dario

 Come dicevo cambiando solo la proprietà cursor del PaintBox il cursore


Grazie č quello che cercavo...
ma (purtroppo c'č un ma) non funziona! (un ma da poco :-) )
In effetti ho provato a fare una nuova applicazione funziona mettendo come
hai detto tu nel onclick di un TButton...
perň nel mio programma dovrebbe funzionare da una procedura qualsiasi e
purtroppo (non ho capito il xchč non va)...
Ho fatto un sacco di prove... e da una procedura qualsiasi funziona se
cambio il Screen.Cursor oppure se mando il messaggio SetCursor (anche se con
questo non riesco a decidere che cursore dare al PaintBox... ehm).
Per provare in un'applicazione vuota ho comunque creato il PaintBox e per
cambiarne il cursore anziche il pulsante ho messo un timer che alterna i
cursori ogni secondo... e con
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if paintbox1.cursor=crhourglass then paintbox1.cursor:=crHandPoint
                                 else paintbox1.cursor:=crhourglass;
  PaintBox1.perform(CM_CURSORCHANGED, 0, 0);
end;
non funziona... sai percaso perchč ??
Grazie ancora cmq,
... Dariosky ...

 non funziona... sai percaso perchè ??
Probabilmente non funziona correttamente perché il tuo perform si intreccia
con il metodo privato SetCursor che la classe TControl usa per settare la
proprietà Cursor. Controllerò meglio.
ciao
guastatore
Segue la unit:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls ;
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure CambiaCursore;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure CambiaCursore;
begin
  Form1.PaintBox1.Cursor := crDefault;
//  Form1.PaintBox1.Perform(CM_CURSORCHANGED, 0, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  CambiaCursore;
end;
end.