jumpier Inserito: 28 febbraio 2005 Segnala Inserito: 28 febbraio 2005 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,hhhhhMi 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 secondae 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!
Hellis Inserita: 28 febbraio 2005 Segnala Inserita: 28 febbraio 2005 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)
jumpier Inserita: 28 febbraio 2005 Autore Segnala Inserita: 28 febbraio 2005 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 pocoe poi provare a mettere in pratica il tutto??Grazie 1000
Ospite bingobongo Inserita: 28 febbraio 2005 Segnala Inserita: 28 febbraio 2005 (modificato) 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. p.s.puoi sempre migliorarlo !Option ExplicitDefInt 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 xOn 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) Loopex: Close 1On Local Error GoTo 0Exit Subtrap: ' esce quando è finito il file Resume exEnd SubPrivate 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: 28 febbraio 2005 da bingobongo
Hellis Inserita: 28 febbraio 2005 Segnala Inserita: 28 febbraio 2005 (modificato) ok, provo a darti qualche spunto (premetto sempre che sono autodidatta )per prima cosa, nel progetto, devi referenziare Microsoft ADO (Active Data Objects) 2.5 o 2.6Menù Progetto > Riferimenti > spuntare la referenza.Creazione di un recordset temporaneo:Dim rsTmp as As New ADODB.RecordsetSet 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, adFldIsNullablersTmp.Fields.Append "bbbb", adchar, 4, adFldIsNullable... poi prosegui cojn i tuoi campirsTmp.openlettura 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 rsTmprstmp.addnew rstmp.fields("xx-xx") = trim (rvar(0)) rstmp.fields("aaaa") = trim (rvar(1)) rstmp.fields("bbbb") = trim (Rvar(2)) ...rstmp.update Loop Close #130ho 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 MSHflexgridQuesta 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 recordsetSet 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-centrome.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 proseguitieni conto che se non vuoi visualizzare una colonna, il sistema più rapido è settarne la larghezza a 0me.FlexR.ColWidth(9) = 0Spero di esserti stato d'aiuto Modificato: 28 febbraio 2005 da Hellis
jumpier Inserita: 28 febbraio 2005 Autore Segnala Inserita: 28 febbraio 2005 Grazie ad entrambi per la quantità di codice che mi avete fornito e soprattutto per il tempo che mi avetededicato. Spero di ricambiare quanto primaOra 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 dimateriale che per determinare quello che mi serviva mi avrebbe fatto impiegare davvero tanto tempo.Grazie ancora!
jumpier Inserita: 28 febbraio 2005 Autore Segnala Inserita: 28 febbraio 2005 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 checi 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 modoopportuno!Grazie ancora molte!!!
Hellis Inserita: 1 marzo 2005 Segnala Inserita: 1 marzo 2005 Non c'è di che. Comunque nel codice di Bingobongo ci sono delle cose che devo imparare....
jumpier Inserita: 1 marzo 2005 Autore Segnala Inserita: 1 marzo 2005 Sante parole! Non si finisce mai!
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora