Newsgroup: it.comp.lang.visual-basic
Titolo: COME CAVOLO FACCIO a scrivere/leggere dati binari in un file?

Sto sclerando....
Cosa voglio fare? Semplice a dirsi...
Voglio memorizzare la configurazione della stampante in un file :-)
Però dopo averla scritta non riesco più aleggerla in modo utilizzabile...
come faccio?
variabili:
    Dim StringaPer As str_DEVMODE
    Dim StringaPer2 As str_DEVMODE
    Dim strModalitàExtraPer As String
    Dim strModalitàExtraPer2 As String
    Dim DM2 As type_DEVMODE
    Dim DM As type_DEVMODE
    Dim rpt As Report
    Dim strDrv As String * 662
    Dim strDrv2 As String * 662
Codice:
    DoCmd.OpenReport "Mtest2", acDesign
    Set rpt = Reports("Mtest2")
    Open "c:\cfg.txt" For Binary Access Write As #1 'scrivo i dati binari
    Put #1, , rpt.PrtDevMode
    strModalitàExtraPer = strDrv                       'usati per debug
    StringaPer.RGB = strModalitàExtraPer      'usati per debug
    LSet DM = StringaPer                                  'usati per debug
    Close #1
e così scrivo i dati, faccio i conti.. la struttura occupa 1324 byte, il
file anche... quindi va tutto bene penso...
il problema è che non riesco più a leggerli in modo utilizzabile.
    Open "c:\cfg.txt" For Binary Access Read As #1
    Get #1, , strDrv2
    strModalitàExtraPer2 = strDrv2                         'usati per debug
    StringaPer2.RGB = strModalitàExtraPer2        'usati per debug
    LSet DM2 = StringaPer2                                   'usati per
debug
    Close #1
A questo punto controllo i dati, ed in DM ovviamente ho i dati del driver...
in DM2 ho del rudo :-(((
E' tutta mattina che ci provo.... ci sono varie cose che non capisco... ho
paura che il VB faccia casino cercando di interpretare i dati nelle stringhe
quando li leggo. Infatto io scrivo 1324 bytes... ma la stringa che li
contiene (sia strDrv che strDrv2 ) è lunga 662 caratteri.
Stringendo... come cavolo faccio a prendere la stringa che mi ritorna
rpt.PrtDevMode, metterla in un file, poi riprenderla dal file, e rimetterla
al suo posto (in rpt.PrtDevMode)?
Max (che sto diventando scemo)

>     Get #1, , strDrv2
Devi già sapere quanti byte estrarre dal file...
Così fai: strDrv2=space$(Numbyte)
poi:
    Get #1, , strDrv2
Se non puoi fare altrimenti scrivi un long all'inizio della stringa con la
sua lunghezza...
            Ciao
                    Allanon

Secondo me ti conviene crearti un tuo tipo di variabile:
Type MIO_TIPO
    Dim StringaPer As str_DEVMODE
    Dim StringaPer2 As str_DEVMODE
    Dim strModalitàExtraPer As String
    Dim strModalitàExtraPer2 As String
    Dim DM2 As type_DEVMODE
    Dim DM As type_DEVMODE
    Dim rpt As Report
    Dim strDrv As String * 662
    Dim strDrv2 As String * 662
End Type
Dim MiaConf as MIO_TIPO
e poi lo scrivi e leggi con una sola istruzione
'Lettura
    Open "c:\cfg.txt" For Binary As #1
        Get #1, , MiaConf
    Close
'Scrittura
    Open "c:\cfg.txt" For Binary As #1
        Put #1, , MiaConf
    Close

 ha scritto nel messaggio
news:9gn6um$fog$1...@fe1.cs.interbusiness.it...

GRANDE IDEA! Così va che è una favola :-)
Ecco come salvare/ripristinare tutta la configurazione della stampante di un
dato report:
Type prnCfg
    prtDevMode As Variant
    prtMip As Variant
    PrtDevNames As Variant
End Type
Public Sub Salva()
    Dim rpt As Report
    Dim vrt As prnCfg
    ' Apre il report in visualizzazione Struttura.
    DoCmd.OpenReport "Mtest2", acDesign
    Set rpt = Reports("Mtest2")
    Open "c:\cfg.txt" For Binary Access Write As #1
    vrt.prtDevMode = rpt.prtDevMode
    vrt.prtMip = rpt.prtMip
    vrt.PrtDevNames = rpt.PrtDevNames
    Put #1, 1, vrt
    Close #1
End Sub
Public Sub Ripristina()
    Dim rpt As Report
    Dim vrt As prnCfg
    ' Apre il report in visualizzazione Struttura.
    DoCmd.OpenReport "Mtest2", acDesign
    Set rpt = Reports("Mtest2")
    Open "c:\cfg.txt" For Binary Access Read As #1
    Get #1, 1, vrt
    Close #1
    rpt.prtDevMode = vrt.prtDevMode
    rpt.prtMip = vrt.prtMip
    rpt.PrtDevNames = vrt.PrtDevNames
    DoCmd.Close acReport, rpt.Name, acSaveYes
End Sub
Uso le variabili di tipo variant che vanno sempre bene e funzionano
(altrimenti ho paura che il VB faccia casino cercando di interpretare le
stringhe che conterrebbero dati binari)
Max (Grazie a tutti :-)

> GRANDE IDEA! Cosě va che č una favola :-)

In genere e' vero il contrario... Cmq finche' non cerchi di lavorare su quei
Variant penso che possa ancora andarti bene.
Direi che VB salva nel file in uscita il variant type ed il relativo offset
del dato, potrebbe essere interessante studiare l'output di un write binario
di Variant...
Ciaotutti,
Asterix

 di Variant...
In effetti il file è lievemente più grande... occupa qualche byte in più
rispetto ai 1324 che da in uscita  rpt.prtDevMode, tuttavia credo siano i
dati che usa VB per identificare il tipo dati come variant, dato che anche
in VB
debug.print lenB(rpt.prtDevMode) da 1324
ed anche
debug.print lenB(variantContenentePrtDevMode) da 1324
Purtroppo al momento non ho un editor esadecimale a portata di mano.... (e
soprauttto ho poco tempo)
Stassera magari provo a vedere cosa cambia nel file scritto usando variant o
stringhe, a lunghezza fissa o variabile.
Ciao, Max

di Variant...
F1 ragazzi!
Stà tutto scritto lì!
--> Istruzione Put <--
Ci sono 2 pagine di come si comporta VB con i file binari.
Ciao

 ha scritto nel messaggio
news:A9NX6.8676$i51.1...@news2.tin.it...

Lo so... è basandomi su quelle (e su tante altre pagine di help :-) che sono
riuscito a NON far funzionare la cosa usando le stringhe.... :-)
Appena ho tempo studio la cosa....
Max


wrote:

Allanon mi meraviglio di te!!! La mia prima domanda che postai su
questo ng fu simile a quella a cui hai risposto!! Normalmente sei tu
il primo a dire che bisogna prima guardare i post vecchi....:-)))
Ciao,
	Salvo