Vai al contenuto
PLC Forum


Vb6, Lettura File E Datagrid


jumpier

Messaggi consigliati

Ciao a tutti!

Tramite un piccolo programmino VB6 vado a leggere un file in modo sequenziale;

ogni linea è formattata sempre allo stesso modo come seque:

xx-xx,aaaa,bbbb,cccc,dddd,eeee,ffff,gg,hhhhh

Mi chiedevo se era possibile in qualche modo leggere il file ed inserire i vari "campi"

racchiusi tra le virgole in un controllo datagrid.

In questo modo avrei tutti i valori relativi a "xx-xx" nella prima colonna del datagrid, "aaaa" nella seconda

e così via. Premetto che è una idea ma non so se la cosa è fattibile in quanto sono abbastanza profano in VB6.

Grazie 1000 x qualsiasi info! :P

Link al commento
Condividi su altri siti


Beh io ho realizzato qualcosa del genere nel modo seguente:

- creo un recordest virutale, dotato dei campi necessari

- apro il file e lo leggo in modo sequenziale associando le stringe ai vari campi del recordset

- riempito il recordset lo associo ad una mshflexgrid (mi trovo meglio che con le dbgrid)

Link al commento
Condividi su altri siti

Grazie Hellis. La teoria l'ho capita ma ... ora fare il tutto in pratica la vedo un po ' dura :(<_<;) .

(almeno per le mie conoscenze attuali di VB)

Puoi cortesemente darmi qualche info in più o qualche links internet o similari per studiare un poco

e poi provare a mettere in pratica il tutto??

Grazie 1000 :D

Link al commento
Condividi su altri siti

Ospite bingobongo

potresti usare un dbgrid in modalità unbound, e nella form che la contiene potresti scrivere qualcosa del genere.

è un pò in stile "spaghetti code", ma penso proprio che funzioni.

:D

p.s.

puoi sempre migliorarlo !

Option Explicit

DefInt A-Z

'

'ipotizzo max 100 righe nel file

'

Dim a1$, a2$(100), a3$(100), a4$(100), a5$(100), a6$(100), a7$(100), a8$(100), a9$(100)

Private Sub Form_Load()

dim x

On Local Error GoTo trap

Open "c:\iltuofile.txt" For Input As 1

Do

x=x+1

Input #1, a1$(x), a2$(x), a3$(x), a4$(x), a5$(x), a6$(x), a7$(x), a8$(x), a9$(x)

Loop

ex:

Close 1

On Local Error GoTo 0

Exit Sub

trap:

' esce quando è finito il file

Resume ex

End Sub

Private Sub DBGrid1_UnboundReadData(ByVal RowBuf As MSDBGrid.RowBuffer, StartLocation As Variant, ByVal ReadPriorRows As Boolean)

Dim incr, row, rowsFetched

Dim curRow&

If ReadPriorRows Then

incr% = -1

Else

incr% = 1

End If

' If StartLocation is Null then start reading at the

' end or beginning of the data set.

If IsNull(StartLocation) Then

If ReadPriorRows Then

curRow& = RowBuf.RowCount - 1

Else

curRow& = 0

End If

Else

' Find the position to start reading based on the

' StartLocation bookmark and the lngIncr% variable

curRow& = CLng(StartLocation) + incr%

End If

' Transfer data from our data set array to the RowBuf

' object which DBGrid uses to display the data

For row% = 0 To RowBuf.RowCount - 1

If curRow& < 0 Or curRow& >= 100 Then Exit For

'

'i 9 campi nelle 9 colonne

'

RowBuf.Value(row%, 0) = a1$(curRow& + 1)

RowBuf.Value(row%, 1) = a2$(curRow& + 1)

RowBuf.Value(row%, 2) = a3$(curRow& + 1)

RowBuf.Value(row%, 3) = a4$(curRow& + 1)

RowBuf.Value(row%, 4) = a5$(curRow& + 1)

RowBuf.Value(row%, 5) = a6$(curRow& + 1)

RowBuf.Value(row%, 6) = a7$(curRow& + 1)

RowBuf.Value(row%, 7) = a8$(curRow& + 1)

RowBuf.Value(row%, 8) = a9$(curRow& + 1)

' Set bookmark using CurRow& which is also our

' array index

RowBuf.Bookmark(row%) = CStr(curRow&)

curRow& = curRow& + incr%

rowsFetched% = rowsFetched% + 1

Next row%

RowBuf.RowCount = rowsFetched%

End Sub

Modificato: da bingobongo
Link al commento
Condividi su altri siti

ok, provo a darti qualche spunto (premetto sempre che sono autodidatta :D )

per prima cosa, nel progetto, devi referenziare Microsoft ADO (Active Data Objects) 2.5 o 2.6

Menù Progetto > Riferimenti > spuntare la referenza.

Creazione di un recordset temporaneo:

Dim rsTmp as As New ADODB.Recordset

Set rsTmp = New ADODB.Recordset

'**** Aggiunta campi ****

rsTmp.Fields.Append "xx-xx", adinteger, 4, adFldIsNullable

' "xx-xx" corrisponde al nome della colonna

' adinteger è il tipo di dato (adchar, addouble, addecimal, etc etc)

' 4 è la lunghezza del campo

' adFldIsNullable è l'attributo del campo (nel caso specifico accetta valori Null)

rsTmp.Fields.Append "aaaa", adchar, 4, adFldIsNullable

rsTmp.Fields.Append "bbbb", adchar, 4, adFldIsNullable

... poi prosegui cojn i tuoi campi

rsTmp.open

lettura e formattazione dei dati:

Dim rvar(8) As String

Open namfile For Input As #130

Do Until EOF(130)

Line Input #130, strfile

'***PROCESSO ALLA STRINGA***

For X = 0 To 8

lun = Len(strfile)

If lun = 0 Then Exit For

midpoint = InStr(strfile, ",")

If midpoint > 0 Then

rvar(X) = Left(strfile, midpoint - 1)

Else

rvar(X) = strfile

End If

strfile = Right(strfile, lun - midpoint)

Next X

'append dei dati a rsTmp

rstmp.addnew

rstmp.fields("xx-xx") = trim (rvar(0))

rstmp.fields("aaaa") = trim (rvar(1))

rstmp.fields("bbbb") = trim (Rvar(2))

...

rstmp.update

Loop

Close #130

ho estrapolato questo codice da due o tre applicazioni che ho scritto, quindi potrebbe contenere qualche errore.

Dovresti implementare questo codice con alcuni controlli, ad esempio una procedura per verificare che le variabili che vanno in append al recordset non siano nulle (altrimenti ti da errore)

Associazione del recordset alla MSHflexgrid

Questa operazione va effettuata dopo aver creato una flexgrid con le caratteristiche da te desiderate. Attenzione: quando associ un recordset alla flexgrid, questa si arrangia un pò al recordset. Se ad esempio hai una flex con una sola colonna, e carichi il tuo recordset con 9 colonne, la flexfgrid automaticamente si setta a 9 colonne. Quindi c'è bisogno di un pò di preformattazione prima di associare il recordset

Set Me.FlexR.Recordset = rsTmp

rsTmp.Close: Set rsTmp = Nothing

'==============================================================

'fromattazione FlexR

'==============================================================

me.FlexR.ColHeaderCaption(0, 0) = "XX-XX"

me.FlexR.ColWidth(0) = 950

me.FlexR.ColAlignmentHeader(0) = 4 'centro-centro

me.FlexR.ColAlignment(0) = 4 'DX-centro

me.FlexR.ColHeaderCaption(0, 1) = "aaaa"

me.FlexR.ColWidth(1) = 1100

me.FlexR.ColAlignmentHeader(1) = 4 'centro-centro

me.FlexR.ColAlignment(1) = 1 'DX-centro

... poi prosegui

tieni conto che se non vuoi visualizzare una colonna, il sistema più rapido è settarne la larghezza a 0

me.FlexR.ColWidth(9) = 0

Spero di esserti stato d'aiuto

Modificato: da Hellis
Link al commento
Condividi su altri siti

Grazie ad entrambi per la quantità di codice che mi avete fornito e soprattutto per il tempo che mi avete

dedicato. Spero di ricambiare quanto prima

Ora scappo da un cliente ma a breve provo le soluzioni e faccio sapere com'è andata!

Per Hellis: avevo iniziato a cercare qualcosa su http://www.visual-basic.it/ ma ho trovato una mole tale di

materiale che per determinare quello che mi serviva mi avrebbe fatto impiegare davvero tanto tempo.

Grazie ancora!

Link al commento
Condividi su altri siti

Ed eccomi ...

Dunque, entrambe le soluzioni sono ottime ma alla fine ho optato per la seconda.

Per ora le uniche motivazioni sono che l'ho trovata più snella (prendete tale affermazione con le molle dato che

ci capisco poco più di zero in VB6 ;):( ) e perchè il file ha lunghezza (e quindi linee) variabili.

In questo caso con il codice proposto da Hellis non devo preoccuparmi di dimensionare vettori in modo

opportuno!

Grazie ancora molte!!! B)

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...