Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    bug di vb6: WithEvents non funziona con control array

    Avevo aperto il thread "completamento automatico vettore di caselle di testo", chiedendo dove fosse il problema senza ricevere risposta:

    Originariamente inviato da adone79
    Tempo fa su questo forum mi hanno postato la seguente classe per il completamento automatico di una casella di testo:

    codice:
    Option Explicit
    Private WithEvents m_txtComplete As TextBox
    Private m_strDelimeter As String
    Private m_strList As String
    Private Sub m_txtComplete_KeyUp(KeyCode As Integer, Shift As Integer)
    
    Dim i As Integer
    Dim strSearchText As String
    Dim intDelimented As Integer
    Dim intLength As Integer
    Dim varArray As Variant
    With m_txtComplete
    If KeyCode <> vbKeyBack And KeyCode > 48 Then
    If InStr(1, m_strList, .Text, vbTextCompare) <> 0 Then
    varArray = Split(m_strList, m_strDelimeter)
    For i = 0 To UBound(varArray)
    strSearchText = Trim(varArray(i))
    If InStr(1, strSearchText, .Text, vbTextCompare) And
    (Left$(.Text, 1) = Left$(strSearchText, 1)) And
    .Text <> "" Then
    .SelText = ""
    .SelLength = 0
    intLength = Len(.Text)
    .Text = .Text & Right$(strSearchText, Len(strSearchText) - Len(.Text))
    .SelStart = intLength
    .SelLength = Len(.Text)
    Exit Sub
    End If
    Next i
    End If
    End If
    End With
    End Sub
    
    Public Property Get CompleteTextbox() As TextBox
    Set CompleteTextbox = m_txtComplete
    End Property
    
    Public Property Set CompleteTextbox(ByRef txt As TextBox)
    Set m_txtComplete = txt
    End Property
    
    Public Property Get SearchList() As String
    SearchList = m_strList
    End Property
    
    Public Property Let SearchList(ByVal str As String)
    m_strList = str
    End Property
    
    Public Property Get Delimeter() As String
    Delimeter = m_strDelimeter
    End Property
    
    Public Property Let Delimeter(ByVal str As String)
    m_strDelimeter = str
    End Property
    e per utilizzarla ho scritto nel form principale il seguente codice:

    codice:
    Option Explicit
    
    Private m_objAutoCompleteUser As clsAutoComplete
    
    Private Sub Form_Unload(Cancel As Integer)
    Set m_objAutoCompleteUser = Nothing
    End Sub
    
    Private Sub Form_Load()
    Set m_objAutoCompleteUser = New clsAutoComplete
    With m_objAutoCompleteUser
    .SearchList = "prova,ciao"
    Set .CompleteTextbox = txtUser
    .Delimeter = ","
    End With
    End Sub
    se adesso anziché ad una sola casella di testo txtUser volessi applicare la classe a un elemento txtUser(1) di un vettore di caselle di testo txtUser() mi da errore
    altrove mi hanno detto che si tratta di un bug di vb6, che è spiegato sul sito della microsoft alla pagina http://support.microsoft.com/default...d=kb;it;625535

    purtroppo non è spiegato come aggirare il problema.. qualcuno saprebbe dirmi come uscire dall'impasse?

  2. #2
    Quella pagina di supporto Microsoft parla chiaro: non è possibile utilizzare WithEvents con un array di controlli, punto. Come mai vuoi utilizzare l'array di controlli? Li crei dinamicamente a runtime o c'è qualche altra ragione?
    Chi non cerca trova.

  3. #3

    Re: bug di vb6: WithEvents non funziona con control array

    Originariamente inviato da adone79

    altrove mi hanno detto che si tratta di un bug di vb6
    non è un bug è un limite è una cosa diversa se comunque hai un numero finito di oggetti li puoi creare a runtime così ed possibile specificare la clausola withevents
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  4. #4
    Originariamente inviato da tas
    Quella pagina di supporto Microsoft parla chiaro: non è possibile utilizzare WithEvents con un array di controlli, punto. Come mai vuoi utilizzare l'array di controlli? Li crei dinamicamente a runtime o c'è qualche altra ragione?
    esatto, sto creando un'applicazione che riceve le giornate di un campionato di calcio e crea automaticamente la classifica: ovviamente scritte le squadre nella prima giornata poi sono sempre le stesse, quindi il completamento automatico ci cascava a pennello

    L'array è creato dinamicamente perché a priori non posso sapere quante saranno le squadre, capisci?

    per ora ho rinunciato al completamento automatico e sostituito le caselle di testo dalla seconda giornata in poi con delle list box, i cui item sono le squadre scansionate nella prima giornata.

    In questo modo però l'applicazione è meno flessibile, perché l'utente è obbligato a scegliere fra un numero finito di opzioni:

    se ad esempio sbagli il nome di una squadra nella prima giornata te lo porti avanti fino all'ultima, oppure sostituire una squadra con un'altra è molto + macchinoso.

    Avete suggerimenti? Sapete se in vb.net questo limite viene superato?

  5. #5
    Per evitare l'uso di array di controlli potresti usare la collezione Controls, per esempio:
    codice:
    Dim i As Integer
    Dim tb As TextBox
    
    For i = 1 To 10
       Set tb = Me.Controls.Add("VB.TextBox", "Text" & Cstr(i))
       tb.Visible = True
       tb.Height = 255
       tb.Top = i * 285
    Next
    Se ti guardi l'help di VB6 sul metodo Add di Controls c'è un bel esempio che ti potrebbe tornare utile, dov'è trattata la tecnica per intercettare gli eventi.
    Riguardo al VB.NET... in ogni caso ti consiglio l'upgrade, ma di certo il nuovo linguaggio non ti risolverà i tuoi problemi con uno schiocco delle dita!
    Chi non cerca trova.

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.