Newsgroup: it.comp.appl.access
Titolo: Tipo cursore: mano con dito indice

Avevo già letto qualcosa su questo NG, ma non riesco più a trovarlo.
Avrei bisogno che al passaggio del mouse su un controllo in una maschera, il
puntatore del mouse da freccia si tramutasse nella classica mano chiusa con
dito indice indicante (quello classico dei link, per intenderci).
Grazie.
--
kaloma

 wrote in message
news:bVjUc.113706$
OR2.5...@news3.tin.it

Se usi un CommandButton o una Label allora ti basta mettere
nella proprietà SubHyperlinkAddress uno Spazio.
Ciao.
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:bVjUc.113706$OR2.5...@news3.tin.it...

Ciao,
qui c'è un esempio molto semplice
 ------------------------
API: Displaying a custom Mouse icon
 
http://www.mvps.org/access/api/api0044.htm
------------------------
Ciao Giorgio

 ha scritto nel messaggio
news:39a05e73cac6de44db...@mygate.mailgate.org...

Azz... che velocità!
Grazie.
--
kaloma
P.S. A proposito: complimenti per il tuo sito. Insieme a quello del
SitoComune, lo considero una risorsa molto ricca.

 ha scritto nel
messaggio news:cfsic5$pfd$1...@lacerta.tiscalinet.it...

Per me, però, non è così semplice. Mi devo studiare con calma il listato (e
lo farò...) perché i miei corposi limiti non mi permettono diversamente
(primo fra tutti la non conoscenza della lingua inglese).
Comunque un sentito grazie.
Ciao.
--
kaloma


copia il codice del Link e inseriscilo in un modulo BAS
Poi nell'evento MouseMove del controllo in oggetto inserisci ...
-------------------------
Private Sub Testo0_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    'Cambia il cursore in manina
    MouseCursor IDC_HAND
End Sub
------------------------
Per tornare al puntatore standard nell'evento MouseMove della sezione che
contiene il controllo inserisci
-------------------------
Private Sub Corpo_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    Screen.MousePointer = 0
End Sub
-----------------------
Ciao Giorgio

 Ciao Giorgio
Ciao Giorgio, questo metodo che funziona ha perň dei
problemi che generalmente on si notano, io perň in un'applicazione
Grafica usata ho riscontrato che viene impegnata la memoria
e non liberata correttamente.
Fai una prova cosě:
Metti in una form un controllo immagine e su MouseMove del controllo
immagine applica la modifica dell'ICONA.
Apri Task Manager e vedrai che dopo pochi secondi di smanettamento
all'intyerno del controllo la Memoria va al 100%
Questo problema postato su NG americano mi risposero che č un Bugs
conosciuto, non da me almeno....!!!
Sai notizie in merito...?
@Alex.


 ha scritto nel messaggio
news:d9a3c0384e03cbce12...@mygate.mailgate.org...

Ciao @Alex,
no, non ho notizie in merito, forse era un BUG che č stato risolto perchč ho
fatto la prova e l'utilizzo della CPU rimane a 1% e l'utilizzo della memoria
non si sposta di un byte 185000 su un totale di 785900 con un sacco di roba
aperta e Sql Server in funzione.
Ho OfficeXp Sp2 su Win 2000 prof Sp4
Ciao Giorgio

 Ciao Giorgio
La cosa è nata e discussa con Lebans, se provi il Demo
Magnifie da lui realizzato e applichi la modifica del Cursore
al suo Demo si verifica l'anomalia in questione.
Anche lui nelle varie spiegazioni al problema ha supportato
l'ipotesi di un Bugs nella sovrapposizione delle cose.
Io ho la stessa configurazione da te indicata, e ho avuto
questi problemi con ARCHIFOTO realizzato qualche tempo fà.
Non ho trovato soluzione se non quella di eliminare la routine
e sftuttare la proprietà SubHyperlinkAddress= " "
con la quale non c'è nessun problema.
Ciao.



Bo!
ho scaricato l'esempio  Magnify  da
http://www.lebans.com/DownloadFiles/MagnifyVer2.zip
nell'evento MouseMove del corpo maschera ho  messo
------------
Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
    'Cambia il cursore in manina
    MouseCursor IDC_HAND
End Sub
-----------
ma la memoria e l'utilizzo della CPU rimane ferma.
Forse l'esempio non è questo o forse devo mettere il cambio del cursore in
un'altro posto ?
Ciao Giorgio

 Ciao Giorgio
No l'esempio è quello ed è la prova fatta da me
ho fatto anche un test su A97 e piattaforma NT
stesso risultato.....!!!!
Non sò che dire.
Nel mio caso addirittura s'impalla il PC, aspetto qualche
secondo e chiudo tutto...!
Vabbè che devo dire.
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------


Ciao,
E' noto che Access97  impegna il 100% della CPU anche quando non si fa
niente
-------------
ACC: Microsoft Access Shows 100% CPU Utilization During Idle Time
http://support.microsoft.com/default.aspx?scid=kb;en-us;160819&Product=acc97
-------------
e forse non gestisce bene la memoria.
Quello che non ho capito è se a te capita anche con AccessXp.
Ciao Giorgio

 Vabbč che devo dire.
Mhmm ... gatta ci cova:  il fatto che A97 dia un problema del genere non
significa che permanga con le versioni successive.
Access '97 combina diverse biricchinate di gestione della memoria che non ho
riscontrato con la versione XP.
Pixel

 Ciao Giorgio
Certamente, la cosa è risaputa, ma come ti accennavo il paragone
l'ho fatto con entrambe le versioni, per questo non mi torna molto.
Soprattutto perchè a te non dà il problema, ma quello che è anomalo
è che a suo tempo fu proprio Lebans a suggerirmi di eliminare la
chiamata SendMessage per l'Icona.
E fatto come mi suggerì nessun problema.
Non saprei cos'altro aggiungere.
Ho però notato una cosa:
Magnifie aperto normalmente con Sfondo Access Forms ecc...
non dà problemi.
Prova a creare una Form Con uncontrollo Immagine e carica una
BMP(o altro) ad alta risoluzione.
Quindi gioca con il Mouse sopra l'immagine, nella Form Magnifie
si riproduce la sezione.
Quello che noto io è:
1)Visualizzazione a SCATTI ovviamente dovuta alla saturazione
della Memoria(100%)
2)Se muovo velocemente il Mouse insistendo sull'immagine ad un certo
punto mi va in loop e per 5÷10secondi perdo il controllo.
Ho 512Mb di Ram con un 766Mhz W2K(sp4) OfficeXP (sp2) e tutti gli
aggiornamenti esistenti.
Come dicevo tutti questi problemi in effetti non sussistono se non vado su
un'immagine(non ho provato se influenza la risoluzione)
Ciao.
@Alex.


 Pixel
Se rileggi i post ho testato il tutto sia su W2K+O_XP
che WNT+O_97 e il problema persiste.
Forse con il testo che ho spiegato a Giorgio ti può essere
più chiaro la Variabile in ballo.
Ciao.


 un'immagine(non ho provato se influenza la risoluzione)
non è che stiamo usando due diversi metodi per impostare il cursore ?
Ciao Giorgio

 Ciao Giorgio
No, ho detto una cavolata....!
  lngRet = LoadCursorFromFile(strPathToCursor)
  lngRet = SetCursor(lngRet)
Computer a parte, il tuo decisamente piů aggiornato e potente
non vedo altre differenze e sinceramente non credo sia quě il
problema.... elaboro con Photoshop tranquillamente immagini HR
da 30Mb(bmp) quindi se avessi problemi di questo tipo mi accorgerei.
Ammutolito.
Non aggiungo altro se non il ringraziamento per il tempo dedicatomi.
Ciao Giorgio.
@Alex.

   lngRet = SetCursor(lngRet)
aspetta !!, forse è qui la differenza, per mettere la manina non è
necessario leggere un file , viene utilizzato quello predefinito di Windows.
----------------
lngRet = LoadCursorBynum(0&, CursorType)
lngRet = SetCursor(lngRet)
----------------
in questo modo non creo nessun cursore perchè è già definito in memoria.
Se la tua routine continua a leggere il file e a creare un nuovo handle per
il cursore ti credo che prima o poi va in Crash, ad ogni step del mouse
carichi in memoria un nuovo cursore e un nuovo handle !! in questo modo
anche a me continua ad aumentare la memoria occupata.
Prova a fare così: nel form load carichi in memoria il cursore e salvi il
suo Handle in una variabile, nell'evento Mouse_Move lo setti passando
l'handle salvato in precedenza SetCursor(TuoHandleCursore) . Quando chiudi
il form o quando devi cambiare cursore ricordati di liberare la memoria con
DestroyCursor.
anche se non ne hai bisogno ti posto il codice con cui mi  funziona
Ciao Giorgio
--------------------------------
Option Compare Database
Option Explicit
Private Declare Function LoadCursorFromFile Lib "user32" Alias _
  "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Private Declare Function SetCursor Lib "user32" _
  (ByVal hCursor As Long) As Long
Private Declare Function DestroyCursor Lib "user32" _
  (ByVal hCursor As Long) As Long
Dim MioCur As Long ' Handle cursore
Private Sub Form_Load()
       'Carico il cursore
       MioCur = LoadCursorFromFile("C:\Winnt\Cursors\harrow.cur")
End Sub
Private Sub Immagine0_MouseMove(Button As Integer, Shift As Integer, x As
Single, Y As Single)
        SetCursor MioCur
End Sub
Private Sub Form_Unload(Cancel As Integer)
      'Distruggo il cursore
      DestroyCursor MioCur
End Sub
----------------------------------

 Ciao Giorgio
[CUT]
He....!Si ha sempre bisogno tu tutto....a volte
Allora:
In realtà non uso la Manina ed è per questo che
necessito il Load da File, la tua osservazione però
nonfà una piega, e pensandoci potrebbe realmente essere
il motivo del guaio....!
Faccio una prova come mi hai indicato, mi sembra un'ottima
intuizione, non mi piacciono molto le variabili Public
per queste cose, ma eventualmente uso una STATIC nella
Function l'effetto è il medesimo...!
Ti faccio sapere in serata sicuramente.



Ciao,
io non userei uno static, potresti dichiarare la varyabile MyCur a livello
di modulo del Form e modificare la funzione pubblica in questo modo
--------------
Function PointM(strPathToCursor As String, ByVal MyCur AS Long ) AS Long
  Dim lngRet As Long
  If MyCur=0 Then
     MyCur= LoadCursorFromFile(strPathToCursor)
  End IF
  lngRet = SetCursor(MyCur)
  PointM=MyCur
End Function
---------------
quindi a livello di modulo della maschera metti
------------------
Dim MyCur As Long ' Handle cursore
Private Sub Immagine0_MouseMove(Button As Integer, Shift As Integer, x As
Single, Y As Single)
       MyCur = PointM("C:\Winnt\Cursors\harrow.cur", MyCur)
End Sub
Private Sub Form_Unload(Cancel As Integer)
 'Distruggo il cursore
 DestroyCursor (MyCur)
End Sub
----------------------------
In questo modo la funzione pubblica è valida per più maschere aperte
simultaneamente
Ciao Giorgio

Le cose sono migliorate in effetti, ma ben lungi da quello che
mi hai prospettato....!
Senza il salvataggio del handle la CPU è impallata al 100% la
memoria sembra OK ma mi sospende un sacco di processi tra
i quali ovviamente l'aggiornamento Video.
Con la memorizzazione del hendle il carico della CPU si stabilizza
al 50% circa.La cosa positiva è che non si blocca più l'aggiornamento
Video.
Ovviamente continuando a scorrere il Cursore all'interno dell'Immagine.
Anche se non risolto del tutto il mio dubbio, mi pare che a livello intutivo
sia decisamente un
ottimo concetto.
Grazie.


Grazie.
Prego ;-)
Ciao Giorgio

 idee.
Vero in effetti VB/A ci abituano male o meglio noi ci permettiamo il lusso
di non considerare questi impostanti dettagli, ma ovviamente lo strato SW
al quale accedi con le API esula da VB/A, ed è questo che lo rende
potente.
Beh non per nulla i vari ReleaseDC/ReleaseCapture/ReleaseMutex/DeleteDC
ecc..... sono da usare.....! ;-)
Ciao Giorgio bel 3D di ottimo livello tecnico, anche se forse con Access
potrebbe sembrare OT.
Io sono un pò dispiaciuto che su questi NG non si affrontano anche questi
argomenti e spesso sono costretto a spostarmi su NG(USA) con i quali
le difficoltà della lingua spesso non mi rendono la vita semplice...!
Ciao.
@Alex.

 @Alex.
Ciao Giorgio

 e tu prova a postarle anche qui, le API le usi in Access. :-)
Qualche tempo fà(un paio d'anni) ho postato qualche mail sull'argometo
ma visti i partecipanti(NN) ho deviato e per evitare X_POST inutili
ora do per scontato spostarmi.
In effetti entrambe le volte che ho avuto bisogno mi hai dato validi
suggerimenti.
Riprendeò a farlo.


 Riprendeò a farlo.
E vorrei vedere Alessandro   :-)
Su ng. come questo si dibatte di sviluppo di Database, annessi e connessi
... direi che può bastare.
Di tanto ho seguito comp-databases-ms-access: francamente di API si tratta
estremamente poco pure lì ...
Pixel

 Pixel
Si in effetti ho premesso che potrebbe essere OT(parzialmente)
ma chi programma a livelli avanzati non puň non usare API
anche con Access, e le problematiche dell'utilizzo delle API
con Access aumentano, e se proponi domande su NG(USA)
dedicati alle API non specificando che usi ACCESS spesso
non risolvi, ma spesso specificandolo vieni SNOBBATO.
Vabbč....!
Ciao.


 non risolvi, ma spesso specificandolo vieni SNOBBATO.
A parte il fatto che esistono ng. italianissimi in cui si dibatte in maniera
avanzata sull'API di win...
E comunque, insisto, le problematiche annesse e connesse all'API consentono
*d'arricchire* le applicazioni basate su Access ma non sono fondamentali.
Soprattutto considerando che le pochissime davvero utili sono a disposizione
di tutti sul web da anni (commondialog, folders, etc.)
Pixel

 avanzata sull'API di win...
Quali....?
Per il resto ritengo l'argomento attinente ad Access anche se non
implicito nell'uso di Database, ma dato che Access raggruppa in se
sia un Database che VBA non è assurdo esporre queste problematiche.
E' assurdo non ritenerle compatibili, poi chi è interessato partecipa
chi no....salta, in fondo no si parla di AUTOMOBILI....!!!


 chi no....salta, in fondo no si parla di AUTOMOBILI....!!!
Certo che non sono incompatibili: lo sarebbero se non fosse possibile
invocarle da Access.
Tuttavia hai fatto una tirata sul discorso "che da queste parti è inutile
postare richieste sull'API di win .. etc." un pochino fuori luogo dato il
tipo di prodotto di cui si dibatte in quest'area.
Pixel


[CUT]
non devi confondere la variabile VBA in cui memorizzi l'handle che ti viene
restituido da una funzione API con i meccanismi interni di windows, se
funzionasse come dici tu posso solo caricare un cursore alla volta invece ne
posso caricare quanti ne voglio (memoria permettendo)
Prova ques'esempio, carico due cursori e a seconda della posizione x
visualizzo uno o l'altro.
Il tutto va messo in un modulo di classe di una maschera un cui inserirai un
controllo immagine di 20 cm di larghezza.
Ciao Giorgio
----------------------------------
Option Compare Database
Option Explicit
Private Declare Function LoadCursorFromFile Lib "user32" Alias _
  "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Private Declare Function SetCursor Lib "user32" _
  (ByVal hCursor As Long) As Long
Private Declare Function DestroyCursor Lib "user32" _
  (ByVal hCursor As Long) As Long
Dim MyCur1 As Long 'Primo cursore
Dim MyCur2 As Long 'Secondo cursore
Private Sub Form_Load()
   MyCur1 = LoadCursorFromFile("C:\Winnt\Cursors\harrow.cur")
   MyCur2 = LoadCursorFromFile("C:\Winnt\Cursors\hcross.cur")
End Sub
Private Sub Immagine0_MouseMove(Button As Integer, Shift As Integer, x As
Single, Y As Single)
   If x < 5000 Then
      SetCursor MyCur1
   Else
      SetCursor MyCur2
   End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
 DestroyCursor (MyCur1)
 DestroyCursor (MyCur2)
End Sub
-------------------------------------- 

 [CUT]
[CUT]
umm forse al posto di tutta la spiegazione bastava questa definizione
------------------
DestroyCursor Function
Syntax
BOOL DestroyCursor(HCURSOR hCursor);
The DestroyCursor function destroys a cursor and frees any memory the cursor
occupied. Do not use this function to destroy a shared cursor.
-------------------
che senso avrebbe indicare hCursor se il numero di cursori che si può
caricare è uno solo ?
Ciao Giorgio

[CUT]
Quanto hai detto è corretto, ma da per scontata l'indicizzazione
dei cursori, o meglio l'indicizzazione della locazione di memoria
nella quale è salvato il valore a 32Bit relativo all'indirizzo di memoria
puntata, ti assicuro che è unico.
In questo caso non indicizzo nulla associo all'area CURSORE corrente
il mio Cursore.
La funzione che hai citato DestroyCursor libera la mamoria solo
dopo averla impegnata con CreateCursor, anzi è assolutamente
tassativo non eliminare altri cursori caricati con LoadCursor.
L'area di memoria del CurrentCursor non è indicizzabile solo gli Handle
possono essere associati ad una struttura indicizzata tant'è che
tu passi proprio l'handle di un'ipotetica struttura indicizzata
che possono anche essere 2 Variabili....!
SetCursor prima di impostare il nuovo Cursore con l'Handle
passato salva nello Stack il vecchio Handle e lo ritorna come
valore finita l'operazione, non è possibile che vengano salvati
continuamente Handle in qualche posto, quando lo fai già
tu se memorizzi 2 Cursori.
L'ottimizzazione non è nè quella di VB(che non centra proprio ovviamente)
ma quella dell'utilizzo della memoria, che è a livello ancora più basso
delle
API, per le quali è trasparente anche la gestione Memoria, in quanto
la maggior parte delle operazioni vengono eseguite in una Virtual Menory.


 puntata, ti assicuro che č unico.
[CUT]
LoadCursorFromFile carica un cursore in memoria, se lo esegui 10 volte viene
alloccata una parte di memoria per ogni singolo cursore.
Questo esempio carica N cursori, quando non č piů possibile caricarli stampa
il numero di di cicli eseguiti e Access comincia a fare cose strane
----------
Sub Prova()
Dim i As Long
For i = 1 To 1000000
   If LoadCursorFromFile("C:\Winnt\Cursors\harrow.cur") = 0 Then
      Debug.Print i
      Exit For
   End If
Next
End Sub
-----------
come vedi non memorizzo neanche l'handle del cursore.
Se non ti ho convinto cosě getto la spugna :(
Ciao Giorgio


Questa invece non ha problemi perchè viene liberata la memoria
-----------
Sub Prova()
Dim i As Long
Dim MyCur As Long
For i = 1 To 1000000
   MyCur = LoadCursorFromFile("C:\Winnt\Cursors\harrow.cur")
   If MyCur = 0 Then
      Debug.Print i
      Exit For
   End If
   DestroyCursor MyCur
Next
End Sub
----------
Ciao Giorgio