PDA - personal digital assistant

Visualizza versione completa : 2 problemi in vb



Admin
03/11/2004, 20:29
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const ES_NUMBER = &H2000&

Dim i As Long
i = GetWindowLong(Text1.hWnd, GWL_STYLE)
Call SetWindowLong(Text1.hWnd, GWL_STYLE, i Or ES_NUMBER)


Con queste due API imposti la textbox, nel Form_Load, per accettare solo numeri. Quindi non devi intercettare nulla e puoi anche usare copia incolla, se non mi sbaglio, cancellare ed inserire numeri.

VB 6 ha poi l'evento Validate, che viene eseguito ogni volta che ti sposti a un altro campo o controllo. All'interno di questo evento controlli se il numero è valido:


Private Sub Text1_Validate(Cancel As Boolean)

On Error Resume Next

Select Case CInt(Text1.Text)
Case 800 To 16000
Case Else
Cancel = True
End Select

If Err.Number Then
Cancel = True
MsgBox "Il testo non è un numero valido!", vbExclamation
ElseIf Cancel Then
MsgBox "Digitare un numero fra 800 e 16000!", vbExclamation
End If

End Sub

Admin
03/11/2004, 20:41
Private Sub Command1_Click()
Dim FoundPos As Integer
Dim FoundLine As Integer
' Cerca il "ABC" nella RichTextBox1.
FoundPos = RichTextBox1.Find("ABC", , , rtfWholeWord)

If FoundPos <> -1 Then
' Mostra numero di riga dove la parola è stata trovata
FoundLine = RichTextBox1.GetLineFromChar(FoundPos)
MsgBox "Numero di riga: " & FoundLine
Else
MsgBox "La parola non è stata trovata."
End If
End Sub


La TextBox normale non fornisce i metodi di ricerca, mentre la RichTextBox sì (fornisce anche la formattazione del testo, illimitati dimensioni, stampa, lettura e salvataggio di testi in due formati, RTF e normale).

La RichTextBox è ideale per tutti i testi che non sono limitati a un paio di righe.

Admin
04/11/2004, 01:01
Ho capitoooooo :) !

Quindi devi fare un po di esercizi... Trovata la variabile, fai di nuovo una ricerca, per il prossimo spazio, o meglio, fai:

FoundPos = FoundPos + RichTextBox1.SelLength

Questo ti posiziona virtualmente dopo la stringa trovata.

Poi cerchi la riga nuova:

FoundPos2 = RichTextBox1.Find(vbCrLf, FoundPos)

ed estrai il valore:

Value = Trim$(Mid$(RichTextBox1.Text, FoundPos, FoundPos2 - FoundPos + 1))

Ora, non ho provato su VB, ma credo che è la formulina giusta. Caso mai ho sbagliato con il Mid$ (lunghezza della stringa).

L'altra possibilità è che selezioni tutta la riga e poi con Split() di VB separi variabile e valore.

Admin
04/11/2004, 10:27
Il problema è che avendo selezionato il testo ricercato, la richtext fa la ricerca all'interno della stringa selezionata.

Se aggiungi:

RichText1.SelLength = 0

oppure fai:

FoundPos = RichTextBox1.Find(a, 0, , rtfWholeWord)

all'inizio della funzione dovrebbe funzionare.

Comunque, dato che leggi il file dal disco, ti converrebbe farlo completamente diverso:


Private Sub Form_Load()
Dim ff As Long
Dim a As String
Dim b As String
Dim f As String
Dim vntSplit As Variant
Dim v As Variant
Dim var As Variant

f = "nomefile.dat"

ff = FreeFile

Open f For Input As #ff
Do While Not EOF(ff)
Line Input #ff, a
a = Trim$(a)
If Len(a) Then 'riga piena
If Left$(a, 1) <> "#" Then 'commento
b = b & a & vbCr
End If
End If
Loop
Close #ff

If Len(b) = 0 Then
Exit Sub
End If

b = Left$(b, Len(b) - 1) 'togli ultimo vbCr
vntSplit = Split(b, vbCr) 'Separa le righe

For Each v In vntSplit 'per ogni riga
v = Replace(v, vbTab, " ") 'converti tabulazioni
v = Replace(v, " ", " ") 'converti doppi spazi
var = Split(v, " ") 'ora hai var(0) = nome, var(1) = valore
Select Case UCase$(var(0))
Case "ABC": Text1.Text = var(1)
End Select
Next

End Sub