Newsgroup: it.comp.appl.access
Titolo: DB a 32bit:  --> 64bit

Un saluto a tutti
Non funziona bene un Db fatto con A03 che vado ad aprire con A16.
Probabilmente è dovuto al discorso 32bit --> 64bit  ?
Mi segnala di aggiornare le istruzioni Declare e contrassegnare con PtrSafe.
Ho provato a leggere tanti post al riguardo ma, sicuramente, a causa delle mie scarse conoscenze di Vba non riesco a venirne fuori.
Chiedo cortesemente, per risolvere il problema, se esiste una istruzione "semplice" ed eventualmente dove dovrebbe essere immessa.
Ringrazio in anticipo chiunque vorrà aiutarmi.
  Gabriele

Potrebbe essere molto complicato... il PtrSafe serve solo per la compatibilità standard VBA7... ma ci sono chiamate API 64Bit che modificano il vartype sia dei parametri che del restituito.
Ne consegue che potrebbe servire una compilazione condizionata non solo sulle dichiarazioni ma anche nelle funzioni che le chiamano.
Quindi la cosa va analizzata bene.
 
@Alex


Grazie comunque per la risposta.
Pazienza, mi inventerò qualcosa.
Tanto per informare ho anche provato a fare un Db nuovo e importare tutti gli oggetti ma non va.
 Di nuovo saluti
  Gabriele

Ovviamente non può andare... devi modificare le dichiarazioni in modo sostanziale... inutile ti faccia un esempio... se hai poche dichiarazioni(3 o 4) pubblicale e possiamo vedere... poi dovrai verificare i punti di chiamata e modificarli in conseguenza.
Se sono tante... credo non sia praticabile.
 
@Alex


Grazie di nuovo per la disponibilità.
In effetti sarebbe soltanto una (scaricata dal sito comune che mi serve per riallegare le tabelle).
di seguito le due righe dove si blocca.
Public Declare Function CHOOSECOLOR Lib "comdlg32.dll" _
    Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
eventualmente se si tratta di una cosa semplice proverò altrimenti vedrò di trovare una soluzione.
 Gabriele

Come vedi la Chiamata CHOOSECOLOR ha bisogno di una TypeStructure che è affetta anch'essa da Compatibilità 64Bit... quindi puoi sostituire il tuo codice con questo sotto, che come vedi non è così banale.
 
La chiamata va fatta semplicemente alla Funzione [aDialogColor] passando come parametro il Colore Attuale, se esiste, e restituisce un LONG da assegnare al colore...
 
Me.NomeRectangle.BackColor=aDialogColor(Me.NomeRectangle.BackColor)
 
In questo modo passi il colore del rettangolo e lo riassegni...
 
Option Compare Database
Option Explicit
 
 
' Constantes utilisées par aDialogColor
Private Const CC_RGBINIT = &H1&
Private Const CC_FULLOPEN = &H2&
Private Const CC_PREVENTFULLOPEN = &H4&
Private Const CC_SHOWHELP = &H8&
Private Const CC_ENABLEHOOK = &H10&
Private Const CC_ENABLETEMPLATE = &H20&
Private Const CC_ENABLETEMPLATEHANDLE = &H40&
Private Const CC_SOLIDCOLOR = &H80&
Private Const CC_ANYCOLOR = &H100&
 
'   Type API de structure de couleur
#If VBA7 Then
    Private Type apiCOLORSCHEMA
      lStructSize As Long
      hwnd As LongPtr
      hInstance As LongPtr
      rgbResult As Long
      lpCustColors As String
      flags As Long
      lCustData As LongPtr
      lpfnHook As LongPtr
      lpTemplateName As String
    End Type
#Else
    Private Type apiCOLORSCHEMA
      lStructSize As Long
      hwnd As Long
      hInstance As Long
      rgbResult As Long
      lpCustColors As String
      flags As Long
      lCustData As Long
      lpfnHook As Long
      lpTemplateName As String
    End Type
#End If
 
'   Constante de couleur "solide"
Private Const API_SOLIDCOLOR = &H80
 
'''""""""""""""""""""""""""""""""""""""""""""""""""""'''
'
'                   API cmdlg32.dll
'
'''""""""""""""""""""""""""""""""""""""""""""""""""""'''
#If VBA7 Then
    Private Declare PtrSafe Function apiChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As apiCOLORSCHEMA) As Long
#Else
    Private Declare Function apiChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As apiCOLORSCHEMA) As Long
#End If
 
#If VBA7 Then
    ' fonction qui permet d'affecter une couleur à une propriété
    Public Function aDialogColor(DefaultColor) As Long
      Dim X As LongPtr, cs As apiCOLORSCHEMA
      Dim CustColor(16) As LongPtr
      cs.lStructSize = LenB(cs)
      If Not IsNumeric(DefaultColor) Then DefaultColor = 0
      cs.hwnd = hWndAccessApp
      cs.rgbResult = DefaultColor
      cs.lpCustColors = String$(16 * 4, 0)
      cs.flags = CC_ANYCOLOR Or CC_RGBINIT Or CC_FULLOPEN ' API_SOLIDCOLOR
      X = apiChooseColor(cs)
      If X = 0 Then
        aDialogColor = -1
      Else
        ' Normal processing
         aDialogColor = cs.rgbResult
      End If
 
    End Function
#Else
    ' fonction qui permet d'affecter une couleur à une propriété
    Public Function aDialogColor(DefaultColor As Long) As Long
      Dim X As Long, cs As apiCOLORSCHEMA
      Dim CustColor(16) As Long
      cs.lStructSize = Len(cs)
 
      cs.hwnd = hWndAccessApp
      cs.rgbResult = DefaultColor
      cs.lpCustColors = String$(16 * 4, 0)
      cs.flags = CC_ANYCOLOR Or CC_RGBINIT Or CC_FULLOPEN ' API_SOLIDCOLOR
      X = apiChooseColor(cs)
      If X = 0 Then
        aDialogColor = -1
      Else
        ' Normal processing
         aDialogColor = cs.rgbResult
      End If
 
    End Function
#End If
 
@Alex

 Come vedi la Chiamata CHOOSECOLOR ha bisogno di una TypeStructure che è affetta anch'essa da Compatibilità 64Bit... 
 
Cut
 
Secondo te, si poteva evitare tutta questa roba oppure farla meglio?
 
-- 
Greg

Definisci "farla meglio"... il.codice che ho postato è fatto meglio perché è scritto tecnicamente in modo corretto e funziona bene.
 
Quindi chiarisci il tuo punto di vista.
 
Si poteva evitare...? SI in almeno 2 modi:
1°
Se ti accontenti di una Pelette di colori ristretta si basta una maschera con N commandButton ognuno con un colore... 
Nessuna API, ovviamente ha dei limiti.
Questo lo avevo già pubblicato come esempio.
 
2° usi 3 Slider control sempre fatti in VBA che corrispondono ad RGB con campo 0÷255 e a seconda del loro valore componi il LONG dato dalla combinazione Esadecimale dei 3.
Quello che manca in questo caso è la visualizzazione grafica del punto colore all'interno della palette.
Amche questo lo avevo anche pubblicato come esempio...
 
Saluti
@Alex

 Quindi chiarisci il tuo punto di vista.
 
Si scusa, hai ragione, poi ho riletto meglio, è la complessità delle api che quando le vedo... ecco mi sembrano un 
decreto legge!
 
-- 
Greg