Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Dialog box API

Ciao,
    Come si fa (e quali api usare) ad aprire la dialog "Apri file" via api
senza usare il l'M$ Common Dialog?
Grazie a tutti.
Ciao

 senza usare il l'M$ Common Dialog?
Le funzioni sono +- queste. Le strutture a cui fanno
riferimento le trovi con l?API Text Viewer.
Declare Function SHBrowseForFolder Lib "shell32" _
    (lpbi As BROWSEINFO) As Long
Declare Function SHGetPathFromIDList Lib "shell32" _
    (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Declare Function CHOOSECOLOR Lib "comdlg32.dll" _
Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
Declare Function GetOpenFileName Lib "comdlg32.dll" _
    Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _
    "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Declare Function PRINTDLG Lib "comdlg32.dll" _
    Alias "PrintDlgA" (pPrintdlg As PRINTDLG) As Long
Declare Function PAGESETUPDLG Lib "comdlg32.dll" _
    Alias "PageSetupDlgA" (pPagesetupdlg As PAGESETUPDLG) As Long
Declare Function CHOOSEFONT Lib "comdlg32.dll" _
    Alias "ChooseFontA" (pChoosefont As CHOOSEFONT) As Long
Ti faccio un esmpio che visualizza la finestra FileOpen:
(I flag li trovi tutti con dicitura OFN_XXXXXXX,
ti consiglio di usare anche OFN_EXPLORER)
Dim OFName as OPENFILENAME
    OFName.lStructSize = Len(OFName)
    ' hWndOwner + l'handledel richiedente, può essere
    ' un tuo form, magari quello primario
    OFName.hWndOwner = hWndOwner
    OFName.hInstance = App.hInstance
    ' I filtri di apertura
    OFName.lpstrFilter = sFilter
    ' Buffer che conterrà in nome del file aperto
    OFName.lpstrFile = String(254, vbNullChar)
    OFName.nMaxFile = 255
    OFName.lpstrFileTitle = String(254, vbNullChar)
    OFName.nMaxFileTitle = 255
    ' Titolo della finestra
    OFName.lpstrTitle = sTitle
    ' I flags
    OFName.flags = nFlags
    NomeFileDaAprire = If GetOpenFileName(OFName)

riferimento le trovi con l?API Text Viewer.
[snap]
Perfetto, era proprio quello che cercavo, però in questo modo, non avendo
definito i membri String di OPENFILENAME come String * 256 la funzione
len(OFName) non ritorna il numero corretto di bytes con conseguente
GetOpenFileName = CDERR_STRUCTSIZE.
Non so a cosa questo possa portare poichè sembra funzionare tutto
correttamente...
Ciao e grazie

 correttamente...
Uhm...mumble..mumble... Potrebbe essere un problema.
In effetti si potrebbe impostare a dimensione fissa le stringhe
nella definizione Type di OPENFILENAME. Ma...
l'esempio che avevo fatto usava
    OFName.lpstrFile = String(254, vbNullChar)
    OFName.nMaxFile = 255
    OFName.lpstrFileTitle = String(254, vbNullChar)
    OFName.nMaxFileTitle = 255
OFName.nMaxFile è impostato a 255 perché riteniamo
che VB passando la stringa, ci aggiunga un terminatore
Null, ma non è detto che lo faccia in questo caso.
Prova con:
    OFName.lpstrFile = String(255, vbNullChar)
    OFName.nMaxFile = 255
    OFName.lpstrFileTitle = String(255, vbNullChar)
    OFName.nMaxFileTitle = 255
posizionando in coda alle definizioni
    OFName.lStructSize = Len(OFName)
Questo senza, ovviamente, dimensionare a valori fissi i
campi stringa della struttura (non buona abitudine).
Ciao

campi stringa della struttura (non buona abitudine).
Già provato, ma la Len (e anche LenB) misurano la lunghezza della struttura
che ad occhio sembra contenere solo i puntatori (4 bytes) per le stringhe a
lunghezza variabile.
Ciao

 lunghezza variabile.
Ho fatto una prova adesso.
Così come dicevo, la funzione restituisce 1.
Ossia funziona correttamente.
Prova un po' tu, vediamo cosa succede.

...

No... 1 equivale a CDERR_STRUCTSIZE
Riprova sarai più fortunato...
Ciao

> No... 1 equivale a CDERR_STRUCTSIZE
Niet.
La funzione ritorna 0 se si è verificato un errore
o se l'utente ha premuto il tasto "annulla" ("cancel").
Ritorna un valore non-zero se è andato tutto liscio.
Nel caso ritorni 0, se vuoi sapere quale è l'errore,
devi chiamare la funzione CommDlgExtendedError(),
la quale ti ritorna il codice d'errore effettivo.
Ciao

...

Acc...
Hai ragione... però non mi spiego come possa funzionare con un len() errato.
Ciao

> ... però non mi spiego come possa funzionare con un len() errato.
Perché dici che restituisce un valore errato ?
Se poni
    OFName.lStructSize = Len(OFName)
alla fine della definizione della struttura, ossia
quando hai assegnato i valori ai campi,
sia stringa che long, la lunghezza è corretta.

...

E com'è che a me Len(OFName) dà 76 nonostante le varie stringhe
inizializzate a 256 char?
Ciao

 inizializzate a 256 char?
"Attenzione   È possibile che la funzione Len non consenta di determinare il
numero effettivo di byte richiesti per la memorizzazione se utilizzata con
tipi di dati definiti dall'utente." (Guida di VB4)
Pero': 10 Long x 4 + 2 Integer x 2 + 8 String x 4 = 76
--
Ciao.
Maurizio

 inizializzate a 256 char?
Dipende dalla gestione delle stringhe e dei Type
effettuata da VB. Quando passi una struttura Type, le
stringhe vengono passa come puntatore alla stringa.
La stringa è posizionata altrove (dove indica il puntatore).

...

Esatto,
In questi casi, se vuoi passare la stringa ti tocca assegnarle una
dimensione fissa, tipo:
Type MioDato
   Elemento1 as integer
   Elemento2 as long
   Stringa1 as String * 10
   Stringa2 as String * 100
End Type
A questo punto len(MioDato) restituisce 2+4+10+100 = 116
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb