Newsgroup: it.comp.appl.access
Titolo: muovere oggetto tramite api

ciao a tutti
qualcuno ha idea di come muovere una casella di testo oppure un'etichetta su
una maschera?  Sicuramente tramite le api di win si può fare, ma non sono
ancora riuscito a capire come. Basta che si muova, non deve fare nessuna
operazione.
grazie in anticipo
stwe

 ha scritto nel messaggio
news:A6qXb.313261$_P.10...@news4.tin.it...

Perchè API... non vanno usate per abbellire il codice, si
rischia di dare un tono lassativo......!
Le API se non si conoscono bene sono pericolose e complesse, conviene
perdere tempo a conoscere i normali modi di gestione di Access BENE,
e dove possibile evitare di usarle.
Nel tuo caso:
Occorre distinguere se lo spostamento deve essere definitivo o solo
Runtime Temporaneo.
1°Caso    PERMANENTE
Nemmeno con l'alveare intero lo puoi fare se non Apri la Form in modalità
acDesign o Struttura di conseguenza poi le API non servono poichè sempre
da codice esistono le proprietà riferite alla posizione del controllo Left e
Top
da usare, alla fine Chiudi la Form e salvi.
Se non vuoi che si veda Echo=False--->Modifica--->Echo=True
2°Caso    DINAMICO TEMPORANEO
A maggior ragione le API non servono, quelle famose proprietà di cui sopra
funzionano benissimo.
@Alex.

 ha scritto nel messaggio
news:c0ll9f$ai4$1...@lacerta.tiscalinet.it...

[cut]
innanzi tutto grazie per la sgridata, non avevo comunque intenzione di fare
l'apicoltore.
ora il mio problema è di farle restare in modo permantente, cerco di
spiegarmi meglio:
ho una maschera con un'immagine come sfondo e un'elenco di etichette
popolate con i dati di una tabella, ora la mia esigenza è che l'utente possa
spostare l'etichetta sull'immagine dove c'è il valore corrispondente (sto
facendo un catalogo interattivo), che si veda mentre la sposti e che rimanga
li quando chiudo la maschera o cambio visualizzazione.
credo di dover utilizzare le proprietà Left e Top, sull'evento mousespostato
della casella di testo, ma poi? come faccio a far si che si muova quando ci
clicco sopra e che quando rilascio il mouse si fermi li?
grazie
stwe

 stwe
Io credo tu abbia un problema.
Nel  senso che per muovere un controllo basta intercettare
l'evento MouseDown Per abilitare  il MouseMove che ti restituisce
X/Y della Posizione e passarli al controllo con i dovuti aggiustamenti.
Quando lo molli MouseUp e disabiliti il Move.
Il problema è che se chiudi la Form e la Apri sono dov'erano prima dello
spostamento.
Per farlo devi aprire dopo aver disabilitato l'Echo del Monitor(Docmd.Echo
False)
la Form in questione in modalità struttura come ti accennavo, ciclare i
controlli che
prima hai mosso e spostarli, quindi uscire salvando le modiviche e
Docmd.Echo True.
Il problema è dove salvi il tutto...?
La soluzione è Apparentemente complessa, ma molto flessibile
    Ti crei una Tabella con 3 campi
    NomeControllo      (testo)
    Left                        (Intero Lungo)
    Top                        (Intero Lungo)
    Quando intercetti il MouseDown abiliti il MouseMove e di conseguenza
    sposti RUNTIME il controllo, su evento MouseUp cancelli all'interno
della
    Tabella il Record con NomeControllo=Attuale(intercettando l'errore se
non presente)
    e gli riscrivi il nuovo dato nome controllo e Left/Top.
    Quando chiudi la Form passi il controllo ad una Form Fittizia o una
Routine Public
    che Blocca l'aggiornamento del monitor, apre la Form in modalità
disegno, carica in un Recordset
    l'elenco dei Controlli da Spostare e li cicla, li sposti, salvi e
chiudi.
Non ti spaventare, è banale anche se potrebbe sempbrare complessa.
Pensaci un pò, poi aggiustiamo il codice, è una bella cosetta se la
strutturi bene servono non più
di una 20 di righe di codice.....!
Ciao.
@Alex.

 ha scritto nel messaggio
news:c0lovk$d13$1...@lacerta.tiscalinet.it...

il problema a questo punto è di questo tipo, se vado in modalita struttura
perdo l'informazione che è visualizzata sull'etichetta, che è 1 in modalità
struttura, ma che viene popolata con l'evento apertura maschera con il
seguente codice:
Me.RecordSource = "SELECT manubri.ID, manubri.Prezzo FROM manubri where
manubri.Codice  "
Dim varX1 As Variant
varX = DLookup("[codice]", "manubri", "[ID] = 1")
Etichetta1.Caption = varX
forse ho capito male io, ma se scrivo sull'evento clic della casella:
DoCmd.OpenForm "inserimento", acNormal
perdo il contenuto fino a quando non cambio modalità
uffa sono confuso
non esiste qualcosa che mi faccia muovere facilmente questa cavolo di
casella, sigh
grazie comunque per l'aiuto
stwe

Si hai fatto proprio una bella Confusione.
1)CReati la Tabella
2)Durante le varie movimentazioni con Form Aperta in modalità
operativa(Normale)
    non devi passare in modalità struttura, ma solo muovere il Controllo.
    Di conseguenza abiliti l'Evento MouseMove appena verifichi l'Evento
    MouseDown sullo stesso:
    Su evento MouseDown:
    Me.OnMouseMove="[Event Procedure]"
    Ovvio che nell'Evento Su Mouse Spostato non devi inserire la chiamata
all'evento di Default
    ma lo faremo come indicato via codice......!(Poi lo rimuoviamo)
    Su evento Move a questo punto:
    screen.activecontrol.Left=X
    screen.Activecontrol.Top=Y
    e lo lasci scorrere......!
    Su evento MouseUp:
    CurrentDb.Execute "DELETE * FROM NomeTabella WHERE NomeControllo='" &
screen.activecontrol.name
 & "';",dbfailonerror
    CurrentDb.Execute "INSERT INTO Nometabella (NomeControllo, Left, Top) "
& _
                                   VALUES ('" & 
screen.activecontrol.Name
 &
"', " & _
                                   screen.activecontrol.Left & ", " &
screen.activecontrol.Top & ");",dbfailonerror
    In questo modo hai inserito le coordinate nella Tabella, rimuoviamo
l'evento MouseMove:
    Me.OnMOuseMove=vbnullstring
    Quindi su evento Close della Form lanci una Function prima di aprire la
maschera successiva....!
    Nella Funcion apri in modalità acDesign, poi sfrutti un Recordset:
    Dim rs as DAO.Recordset
    Set rs=Curentdb.OpenRecordset("NomeTabella", dbOpenTable")
    If rs.Eof AND rs.Bof then Exit Sub
    Docmd.Openform "NomeForm",acDesign
    rs.Movefirst
    Do Until rs.Eof
        Forms!NomeForm.Controls(rs!NomeControllo).Left=rs!Left
        Forms!NomeForm.Controls(rs!NomeControllo).Top=rs!Top
        rs.Movenext
    Loop
    Docmd.Close acForm, "NomeForm",acSaveYes
    CurrentDb.Execute "DELETE * FROM NomeTabella;",dbfailonerror
Ovviamente non ti ho scritto tutto e soprattutto non ho verificato nulla,
ma ti ho scritto quello che mi veniva in mente.
Se riesco mi metto a fare un esempietto e te lo mando.......!
Ciao.
@Alex.

 ha scritto nel messaggio
news:c0m0dk$hgf$1...@lacerta.tiscalinet.it...

Grazie infinite, sono quasi cotto ma ora provo, sei veramente gentile
stwe