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

    [VB6]Numerare righe textbox e altro HELP ME...

    Ciao a tutti.
    Ho 2 quesiti da porvi... Partiamo dal primo:
    Ho una textbox dove immetto del testo e ho bisogno che in automatico mi immetta i numeri di riga sequenziali,faccio un'esempio:

    PANE
    PASTA
    RISO
    GRANO
    Devono diventare:

    N10 PANE
    N20 PASTA
    N30 RISO
    N40 GRANO

    Sarebbe il massimo poi se nel caso io togliessi un dato,es:

    N10 PANE
    N20 PASTA

    N40 GRANO

    ci fosse la possibilità di rinumerare il tutto in automatico ottenendo questo risultato:

    N10 PANE
    N20 PASTA
    N30 GRANO

    E il primo quesito è andato...passiamo al secondo
    Ho una calcolatrice e mi servirebbe poter immettere il risultato del calcolo(visualizzato in una textbox) in un'altra textbox ma nel punto preciso dove si trova il cursore in quel momento.
    Nel caso sia meglio usare delle Rich al posto delle text non ho problemi a sostituirle.
    Grazie a chiunque proverà ad aiutarmi

  2. #2
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Ciao.
    Secondo me sarebbe meglio non influenzare il testo con il conteggio delle linee.
    Comunque prova questo:
    codice:
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As _
    Integer, ByVal lParam As Any) As Long
    
    Private Sub Text1_Change()
    Const EM_GETLINECOUNT = &HBA
    Static LineeTotaliP As Long
    Dim LineeTotali As Long
    
    LineeTotali = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    If LineeTotali <> LineeTotaliP Then
      LineeTotaliP = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
      Numera
    End If
    End Sub
    
    Private Sub Numera()
    Const EM_LINEFROMCHAR = &HC9
    Const EM_GETLINECOUNT = &HBA
    Const EM_LINELENGTH = &HC1
    Dim LineeTotali As Long
    Dim LunghezzaLinea As Long
    '-
    Dim Cont1 As Long
    Dim Cont2 As Long
    Dim Str1 As String
    Static LineeTotaliP As Long
    Dim Start As Long
    '-
    
    Start = Text1.SelStart
    For Cont1 = 1 To LineeTotaliP
      Str1 = "N" & CStr(Format((Cont1 * 10), "00#")) & " "
      Text1.Text = Replace(Text1.Text, Str1, "")
    Next Cont1
    If Cont2 <> Len(Text1.Text) Then
    LineeTotali = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
      For Cont1 = 1 To LineeTotali
        Text1.Text = Mid(Text1.Text, 1, Cont2) & "N" & CStr(Format((Cont1 * 10), "00#")) & " " & Mid(Text1.Text, Cont2 + 1)
        LunghezzaLinea = SendMessage(Text1.hwnd, EM_LINELENGTH, Cont2, 0&)
        Cont2 = Cont2 + LunghezzaLinea + 2 'CrLf
      Next Cont1
      Cont2 = Cont2 - 2 'Ultimo CrLf
      LineeTotaliP = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    End If
    Text1.SelStart = Start + 5
    End Sub
    Funziona, ma necessita di una "sistematina"
    ... e non usare while wend è una sintassi deprecata

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    Non funziona......
    E' QUASI PERFETTO!!!!!!!!!!

    Solo un problemino...io devo numerare di 100 in 100 e mi serve che i primi numeri non siano cosi:
    N00100
    N00200
    N00300
    ma cosi:
    N100
    N200
    N300
    Ho modificato il codice cosi:
    Start = EDITOR.SelStart
    For Cont1 = 1 To LineeTotaliP
    Str1 = "N" & CStr(Format((Cont1 * 100 ), "00#")) & " "
    EDITOR.Text = Replace(EDITOR.Text, Str1, "")
    Next Cont1
    If Cont2 <> Len(EDITOR.Text) Then
    LineeTotali = SendMessage(EDITOR.hwnd, EM_GETLINECOUNT, 0&, 0&)
    For Cont1 = 1 To LineeTotali
    EDITOR.Text = Mid(EDITOR.Text, 1, Cont2) & "N" & CStr(Format((Cont1 * 100 ), "00#")) & " " & Mid(EDITOR.Text, Cont2 + 1)
    LunghezzaLinea = SendMessage(EDITOR.hwnd, EM_LINELENGTH, Cont2, 0&)
    Cont2 = Cont2 + LunghezzaLinea + 2 'CrLf
    Next Cont1
    Cont2 = Cont2 - 2 'Ultimo CrLf
    LineeTotaliP = SendMessage(EDITOR.hwnd, EM_GETLINECOUNT, 0&, 0&)
    End If
    EDITOR.SelStart = Start + 5
    End Sub
    ma quando arriva a contare 1000 si blocca tutto,se mi sistemi sto problemino è TOTALMENTE PERFETTO

    Non so come ringraziarti mabi!
    So che hai gia fatto abbastanza ma se riuscissi a risolvere anche il mio 2 problema....

  4. #4
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Originariamente inviato da seifter
    ma quando arriva a contare 1000 si blocca tutto
    Prova così:
    codice:
    Private Sub Numera()
    Const EM_LINEFROMCHAR = &HC9
    Const EM_GETLINECOUNT = &HBA
    Const EM_LINELENGTH = &HC1
    Dim LineeTotali As Long
    Dim LunghezzaLinea As Long
    '-
    Const Mlt = 100
    Const Formato = "0000#"
    Dim Cont1 As Long
    Dim Cont2 As Long
    Dim Str1 As String
    Static LineeTotaliP As Long
    Dim Start As Long
    '-
    
    Start = Text1.SelStart
    For Cont1 = 1 To LineeTotaliP
      Str1 = "N" & CStr(Format((Cont1 * Mlt), Formato)) & " "
      Text1.Text = Replace(Text1.Text, Str1, "")
    Next Cont1
    LineeTotali = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    For Cont1 = 1 To LineeTotali
      Str1 = "N" & CStr(Format((Cont1 * Mlt), Formato)) & " "
      Text1.Text = Mid(Text1.Text, 1, Cont2) & Str1 & Mid(Text1.Text, Cont2 + 1)
      LunghezzaLinea = SendMessage(Text1.hwnd, EM_LINELENGTH, Cont2, 0&)
      Cont2 = Cont2 + LunghezzaLinea + 2 'CrLf
    Next Cont1
    Cont2 = Cont2 - 2 'Ultimo CrLf
    LineeTotaliP = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    LunghezzaLinea = SendMessage(Text1.hwnd, EM_LINELENGTH, Cont2, 0&)
    Text1.SelStart = Start + LunghezzaLinea
    End Sub
    La numerazione viene mantenuta di lunghezza fissa:
    codice:
    10  --> 00010
    200 --> 00200
    Se invece non vuoi questo "tipo" di numerazione, ti basta cancellare l'uso della Format.
    Anche così però, qualche problema credo rimanga ugualmente.
    Per il secondo problema, prova così:
    codice:
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As _
    Integer, ByVal lParam As Any) As Long
    
    Private Sub Command1_Click()
    Const WM_PASTE = &H302
    
    Clipboard.SetText (Text1.Text)           'Valore da copiare
    SendMessage Text2.hwnd, WM_PASTE, 0&, 0& 'TextBox
    SendMessage RT.hwnd, WM_PASTE, 0&, 0&    'RichTextBox
    End Sub
    ... e non usare while wend è una sintassi deprecata

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    Inizio col ringraziarti perchè senza di tè sarei stato rovinato
    Ho provato i codici che mi hai dato,allora:
    quello per la numerazione funziona bene ed è esattamente come mi serviva(ho tolto il format) se è possibile c'è ancora una piccola miglioria da fare,mi spiego meglio:
    Funziona alla perfezione come numerazione solamente che quando immetto i dati (sono circa 10 righe di testo che vengono immesse in una volta sola nella text) da un form secondario ci mette una vita ad apparire forse perchè si trova a dover calcolare 10 numerazioni tutte assieme,mi và bene anche cosi ma magari esiste una soluzione anche per questo piccolo problema.
    il programma lo sto sviluppando come exe standard e i codici che mi hai dato li ho messi nel form magari devo fare un modulo?
    Il codice per immettere il testo nella posizione del cursore funzione bene solo che il valore ho bisogno di immetterlo nella text dove si trova il cursore ma nel form che ho attivo in quel momento e non in una text prefissata come nel caso che mi hai fatto tu.
    Ti rinnovo i ringraziamenti sei stato gentilissimo

  6. #6
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Originariamente inviato da seifter
    se è possibile c'è ancora una piccola miglioria da fare,mi spiego meglio:
    Funziona alla perfezione come numerazione solamente che quando immetto i dati (sono circa 10 righe di testo che vengono immesse in una volta sola nella text) da un form secondario ci mette una vita ad apparire forse perchè si trova a dover calcolare 10 numerazioni tutte assieme,mi và bene anche cosi ma magari esiste una soluzione anche per questo piccolo problema.
    Hai ragione. La velocità di elaborazione diminuiva con l'aumentare dei dati perchè nella procedura si lavorava direttamente sulla Text e soprattutto perchè la si richiamava nella Change.
    In questo modo la velocità era ridotta di tre volte per le continue modifiche al testo che quindi richiamavano la change.
    Per questo ho pensato di spostare l'elaborazione su delle variabili risolvendo anche il problema del SelStart:
    codice:
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As _
    Integer, ByVal lParam As Any) As Long
    
    Private Sub Text1_Change()
    Const EM_GETLINECOUNT = &HBA
    Static LineeTotaliP As Long
    Dim LineeTotali As Long
    
    LineeTotali = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    If (LineeTotali <> LineeTotaliP) Then
      LineeTotaliP = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
      Numera
    End If
    End Sub
    
    Private Sub Numera()
    Const EM_GETLINECOUNT = &HBA
    Const EM_LINELENGTH = &HC1
    Dim LineeTotali As Long
    Dim LunghezzaLinea As Long
    '-
    Const Mlt = 100&   'Moltiplicazione
    Dim Cont1 As Long
    Dim Cont2 As Long
    Dim Cont3 As Long
    Dim Str1 As String 'Numerazione
    Dim Str2 As String 'Nuovo testo
    Dim Str3 As String 'Testo senza numerazione
    Static LineeTotaliP As Long
    Dim Start As Long  'Selstart nuovo testo
    '-
    
    Start = Text1.SelStart
    Str3 = Text1.Text
    For Cont1 = 1& To LineeTotaliP
      Str1 = "N" & CStr(Cont1 * Mlt) & " "
      Str3 = Replace$(Str3, Str1, "")
    Next Cont1
    LineeTotali = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    Cont2 = 1&
    Cont3 = 1&
    For Cont1 = 1& To LineeTotali
      Str1 = "N" & CStr(Cont1 * Mlt) & " "
      Cont3 = (InStr(Cont3, Str3, vbCrLf) + 2&)
      If (Cont3 = 2&) Then Cont3 = (Cont2 + 1&)
      Str2 = Str2 & Str1 & Mid$(Str3, Cont2, (Cont3 - Cont2))
      Cont2 = Cont3
    Next Cont1
    Text1.Text = Str2
    LineeTotaliP = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
    LunghezzaLinea = SendMessage(Text1.hwnd, EM_LINELENGTH, Start, 0&)
    Text1.SelStart = (Start + LunghezzaLinea)
    End Sub
    ... e non usare while wend è una sintassi deprecata

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    Ero sicuro che mi avresti risolto anche questo piccolo difetto!
    Grazie 1000 ora funziona tutto a meraviglia.

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.