Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    6

    [VB6] Problemi con gli array

    Salve ragazzi/e

    Ho un problemino con un codice che ho scritto per mandare a capo in automatico una stringa di testo.(altrimenti nella stampa la stringa viene stampata tutta in una riga, sovrascrivendo altri dati presenti nella stessa coordinata x )
    Esemplificando io faccio un len(string) per ottenere il numero dei caratteri
    dopodichè in base al num caratteri, creo un if per vedere se il num caratteri della stringa è superiore al num caratteri consentito!
    poi creo 3 strighe con la funzione Mid$ e dopo aver definito la lunghezza delle stringhe creo 3 array
    poi con un ciclo for estraggo il contenuto degli array e poi creo una nuova stringa per unirli e formattarli
    riporto qui sotto il codice! voglio solo dire che, con 2 array tutto funziona bene, ma con 3 array.... beh se mi potete aiutare, vedete voi...

    '----------------------------------------------------------------------------------
    Dim str1 As String
    Dim str2 As String
    Dim str3 As String
    Dim array1 As Variant
    Dim array2 As Variant
    Dim array3 As Variant
    Dim lung As integer
    Dim contarray1 As Integer
    Dim contarray2 As Integer
    Dim contarray3 As Integer

    lung = Len(ds1) + 1

    If (Len(ds1) >= 94) Then

    str1 = Mid$(ds1, 1, 47)
    array1 = Split(str1, " ")

    str2 = Mid$(ds1, 48, 94)
    array2 = Split(str2, " ")

    str3 = Mid$(ds1, 95, lung)
    array3 = Split(str3, " ")

    contarray1 = UBound(array1)
    contarray2 = UBound(array2)
    contarray3 = UBound(array3)

    str1 = ""
    str2 = ""
    str3 = ""

    Dim a1 As Integer
    Dim a2 As Integer
    Dim a3 As Integer

    For a1 = 0 To contarray1 - 1
    str1 = str1 & "-" & array1(a1)
    Next
    For a2 = 1 To contarray2 - 1
    str2 = str2 & "-" & array2(a2)
    Next
    For a3 = 1 To contarray3
    str3 = str3 & "-" & array3(a3)
    Next

    ds1 = str1 & vbCrLf & array1(contarray1) & array2(0) & " " & str2 & vbCrLf & array2(contarray2) & array3(0) & " " & str3
    ds1 = Replace(ds1, " ", "")
    ds1 = Replace(ds1, "-", " ")
    ds1 = Trim(ds1)
    Else
    End If
    '----------------------------------------------------------------------------------

    Mi potete dire dove ho sbagliato?
    Grazie in ogni caso a chiunque leggerà il mio post e soprattutto a chiuque potrà/vorrà darmi una mano!

  2. #2
    ciao,
    non ho analizzato tutto il codice perchè è sbagliato già in partenza come logica: dividendo la stringa in 3 stringhe senza chiederti se l'ultimo carattere è uno spazio (per esempio dividi la stringa 1 dalla 2 al carattere 47, chi ti dice che lì non c'è una lettera?) rischi di spezzare le parole.
    Inoltre non sempre puoi basarti sul numero di caratteri, visto che lo spazio che una stringa occupa dipende anche dal tipo di font.
    Se ti interessa ecco il codice per mandare a capo un testo senza troncare stringhe e dando come limite non il numero di caratteri, ma la dimensione orizzontale in mm e la font con cui andrai a stampare.
    codice:
    Dim Righe() As String
    Dim ContatoreRighe as Integer
    dim Messaggio as String
    
    printer.ScaleMode = XXXX 'a seconda del caso millimetri, pixel, pollici etc... un numero tra 0 e 7, vedi la proprietà ScaleMode di una form
    FF = FreeFile
    Open "D:\Elaborazioni\ProvaStampa.txt" 
         For Input As #FF
            X = 0
            Do Until EOF(FF)
                Line Input #FF, prova(X)
                Righe() = DividiInRighe (prova(x), "Arial", 10, false)
                Messaggio = ""
                For ContatoreRighe = 0 to ubound(Righe)
                   Messaggio = Messaggio & Righe(ContatoreRighe) & VbCrLf
                Next ContatoreRighe
                MsgBox Messaggio
                X = X + 1
            Loop
     Close #FF
    
    Private Function DividiInRighe(Stringa As String, Font As String, Dimensione As Double, Grassetto As Integer) As String()
        Dim NumeroDiRighe As Integer
        Dim i As Integer
        Dim Vettore
        Dim Righe() As String
        
        Vettore = Split(Stringa, " ")
        
        Printer.FontName = Font
        If Grassetto = 1 Then
            Printer.FontBold = True
        Else
            Printer.FontBold = False
        End If
        Printer.FontSize = Dimensione
        
        NumeroDiRighe = 1
        ReDim Preserve Righe(1)
        
        For i = 0 To UBound(Vettore)
            Righe(NumeroDiRighe) = Trim(Righe(NumeroDiRighe) & " " & Vettore(i))
            If Printer.TextWidth(Righe(NumeroDiRighe)) > AreaDiStampaOrizzontale Then
                Righe(NumeroDiRighe) = Trim(Left(Righe(NumeroDiRighe), Len(Righe(NumeroDiRighe)) - Len(Vettore(i))))
                NumeroDiRighe = NumeroDiRighe + 1
                ReDim Preserve Righe(NumeroDiRighe)
                Righe(NumeroDiRighe) = Vettore(i)
            End If
        Next i
        DividiInRighe = Righe
    End Function
    La funzione DividiInRighe partendo da un testo lungo quanto vuoi, ti restituisce un vettore di stringhe (le varie righe).


  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    6
    Originariamente inviato da Luciano79
    ciao,
    non ho analizzato tutto il codice perchè è sbagliato già in partenza come logica: dividendo la stringa in 3 stringhe senza chiederti se l'ultimo carattere è uno spazio (per esempio dividi la stringa 1 dalla 2 al carattere 47, chi ti dice che lì non c'è una lettera?) rischi di spezzare le parole.
    Non è sbagliato,ne illogico anche se all'inizio del codice puo' sembrare...ma se leggi il codice finale vedi che anche se l'ultimo carattere di una stringa è uno spazio o se le parole si spezzano tra un array e l'altro, poi riunisco tutto con i 3 cicli for e con la formattazione finale delle stringhe!...ecco il codice finale
    codice:
    For a1 = 0 To contarray1 - 1
    str1 = str1 & "-" & array1(a1)
    Next
    For a2 = 1 To contarray2 - 1
    str2 = str2 & "-" & array2(a2)
    Next
    For a3 = 1 To contarray3
    str3 = str3 & "-" & array3(a3)
    Next
    
    ds1 = str1 & vbCrLf & array1(contarray1) & array2(0) & " " & str2 & vbCrLf & array2(contarray2) & array3(0) & " " & str3
    ds1 = Replace(ds1, " ", "")
    ds1 = Replace(ds1, "-", " ")
    ds1 = Trim(ds1)
    Se hai tempo fai una prova...vedrai che tutto è formattato nel giusto modo, solo che la seconda riga riporta anche alcune parole della terza riga!
    E non dovrebbe succedere! E' questo il mio problema
    Ho provato allora a disossare il codice per vedere dov'era il problema, ho tolto i 3 cicli, le tre variabili contarray, ho fatto 3 join(array) e poi ho passato tutto su una stringa!
    e il problema persiste, cioè alcune parole del terzo array sono presenti anche alla fine del secondo array! e questo non dovrebbe accadere!

    Ti ringrazio tanto per il tuo codice, ma volevo capire cosa non va nel mio, visto che usando solo 2 array tutto va alla perfezione, ma usandone 3 capita che quando estraggo le parole dagli array, le parole contenute nel terzo sono presenti anche nel secondo!!e non me ne capacito!

  4. #4
    L'errore è nella seconda Mid
    anziche'

    codice:
    Mid$(ds1, 48, 94)
    devi scrivere
    codice:
    Mid$(ds1, 48, 47)
    Sembra che interpreti i parametri della Mid come:
    Stringa - dal - al

    invece di
    Stringa - dal - lunghezza.

    Nella terza Mid puoi anche omettere la lunghezza

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    6
    Infatti!!!
    Pensavo fosse mid$(str, da, a)
    nella terza la ometto perchè tanto è inutile, capito!
    grazie mille!!
    ciao, stammi bene


  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ghanje
    ... Pensavo ...
    Ecco perche' penso e dico sempre che programmare e' prima di tutto "documentarsi" ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    6
    Originariamente inviato da oregon
    Ecco perche' penso e dico sempre che programmare e' prima di tutto "documentarsi" ...
    Io mi sono documentato!!...certo ho interpretato male, ma non puoi dire che non mi sono documentato!
    E dopo aver scritto il codice, visto che appunto, avevo interpretato male l'uso di mid, ho postato sul forum, per capire ciò che non avevo capito o ciò che avevo sbagliato! E nei forum solitamente si chiede aiuto proprio per questo, a persone + esperte...persone che vogliono aiutare!
    E scusami, non voglio assolutamente offenderti, ma farti solo presente che la tua saccenza, oltre che ad essere fuori luogo, non mi ha aiutato!
    cmq, grazie pure a te!
    ciao

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ghanje
    Io mi sono documentato!!...certo ho interpretato male, ma non puoi dire che non mi sono documentato!
    E dopo aver scritto il codice, visto che appunto, avevo interpretato male l'uso di mid, ho postato sul forum, per capire ciò che non avevo capito o ciò che avevo sbagliato! E nei forum solitamente si chiede aiuto proprio per questo, a persone + esperte...persone che vogliono aiutare!
    E scusami, non voglio assolutamente offenderti, ma farti solo presente che la tua saccenza, oltre che ad essere fuori luogo, non mi ha aiutato!
    cmq, grazie pure a te!
    ciao
    Per me "documentarsi" significa leggere la documentazione, fare delle prove e capire se tutto va come dovrebbe. In caso contrario (se la mid non si comportava come avevi interpretato studiandola), approfondivi il problema sulla mid per utilizzarla solamente quando eri sicuro di come funzionasse. Questo per evitare che la cattiva interpretazione si ripercuotesse su tutti i tuoi programmi.

    Ma il mio era un discorso generale, nessuna saccenza.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.