Oppure

Loading
05/05/20 15:21
aragorn76
Salve a tutti,
eccomi tornato con nuovo quesito molto interessante, a cui non riesco ancora a trovare soluzione. (linguaggio VB Net)

Premesso:
ho un database mysql e una richtextbox1.. Ogni carattere che io digito nella richtextbox1, viene inserito anche nella tabella TESTO di mysql.. giustamente facendo i dovuti controlli, per evitare che caratteri non validi, mi diano errori nel momento dell'inserimento nel DB.. perche? se ne va la luce, non ho perso nulla.. funziona? beh si.. :)

Problema:
in questa richtextbox, qualora l'utente inserisca un Nome, vorrei trovare un modo affinchè venga riconosciuto e in tal caso, aggiungerlo nella tabella NOMI ad esempio (oltre nella tabella TESTO che gia fa).. Ho trovato quindi il comando Like e lo vorrei usare, ma in questo modo non va:

 Dim sMatch As String = RichTextBox1.Find(RichTextBox1.Text Like "\[A-Z]*")
 If sMatch <> "" Then
         MsgBox("il nome e: " & sMatch)
 End If


\[A-Z]* questo significa che appena metto \ seguito da una lettera grande, deve sapere che è un nome.. In effetti appena scrivo \F appare sottolineato, come che sappia che quella parola deve indicare qualcosa.. ma al comando msgbox mi appare: il nome e: -1

Come posso risolvere? tenendo conto che ci possono essere piu nomi/cognomi dentro la RichTextBox1, quindi dovrebbe fare un controllo costante.. mi servirebbe un aiutino, anche utilizzando altre tecniche, invece del LIKE. Grazie :)

p.s. soluzioni del tipo di creare a priori una tabella con lista nomi, non è fattibile.. ;)
Ultima modifica effettuata da aragorn76 05/05/20 15:48
aaa
05/05/20 17:34
nessuno
Non ci ho capito nulla.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità;) chiamava il gioco del Lotto Tassa sulla stupidità.
06/05/20 6:57
Thejuster
Oltre all'idea che mi sembra veramente pessima da fare, con quel sistema difficilmente funzionerà.

per verificare se in una stringa c'è una lettera maiuscola basta fare ad esempio


Dim st As String = "Paolo è un amico"

Dim val = st.Any(Function(x) Char.IsUpper(x))



Ora ponendo invece che hai

\Paolo è un amico

ma essendoci le doppie barre \
devi fare un controllo riga per riga se è presente \
in seguito fare split degli spazi vuoti e cercare il campo nell'array dov'è contenuta la stringa con \
con un substring elimini i primi 2 caratteri ovvero \ per ottenere così solo il nome.



mire.forumfree.it/ - Mire Engine
C# UI Designer
06/05/20 15:38
Carlo
Mi associo a Thejuster, e non conosco l'istruzione Like.
Per fare quello che vuoi tu puoi decidere di scrivere il nome tra dei \separatori\

Prova con questo codice, ogni parola sritta tra \parola\, viene aggiunta ad una listbox.
nel form ci devono essere una RichTextBox1 e una ListBox1

Public Class Form1
Dim pos1 As Integer = 0
Dim pos2 As Integer = 0

    Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged

        If pos1 > RichTextBox1.TextLength Then pos1 = RichTextBox1.TextLength : pos2 = 0
        Dim pos As Integer = RichTextBox1.Text.IndexOf("\", pos1)

        If pos <> -1 Then
            pos1 = pos + 2
            If pos2 > 0 Then
                ListBox1.Items.Add(RichTextBox1.Text.Substring(pos2, RichTextBox1.TextLength - pos2 - 2))
                pos2 = 0
            Else
                pos2 = pos + 2
            End If
        End If

    End Sub
End Class


dovrai gestire effetti indesiderati, per esempio se torni indietro sul testo e aggiungi/togli parole o spazi le variabili pos1 e pos2 non saranno più corrette.
Ultima modifica effettuata da Carlo 06/05/20 15:53
in programmazione tutto è permesso
06/05/20 17:48
aragorn76
Ciao,
allora intanto grazie per la risposta..

ecco come ho risolto per il momento:


 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            'verifichiamo se stiamo inserendo un nome con $
            Dim testArray() As String = Split(RichTextBox1.Text)
            Dim lastNonEmpty As Integer = -1
            For i As Integer = 0 To testArray.Length - 1
                If testArray(i) <> "" Then
                    lastNonEmpty += 1
                    testArray(lastNonEmpty) = testArray(i)
                End If
            Next
            ReDim Preserve testArray(lastNonEmpty)

            ' adesso mi prendo tutti i nomi, rimuovendo le \
            Dim val As Boolean
            For i As Integer = 0 To testArray.Length - 1
                val = testArray(i) Like "\[A-Z]*"
                If val = True Then
                    'qui inserisco solo i nomi in altra tabella
                    MsgBox("il nome è: " & UCase(Replace(testArray(i), "\", "")))
                End If
            Next
        End Sub

in questo caso mi da tutti i nomi presenti nella richtextbox1.. Speriamo che non rallenti nel caso vi siano, che so, 200 parole.... adesso lo testp e se ho problemi vi farò sapere.. Graziee
aaa
07/05/20 7:52
Carlo
Postato originariamente da aragorn76:

in questo caso mi da tutti i nomi presenti nella richtextbox1.. Speriamo che non rallenti nel caso vi siano, che so, 200 parole.... adesso lo testp e se ho problemi vi farò sapere.. Graziee


con 200 parole non avrai problemi, lo stesso codice lo puoi scrivere così, per aumentarne un po' l'efficienza:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        ' tutte le parole separate da spazio in testArray
        Dim testArray() As String = Split(RichTextBox1.Text, " ")

        ' controllo tutte le parole
        For i As Integer = 0 To testArray.Length - 1
            If testArray(i) <> "" And testArray(i) Like "\[A-Z]*" Then
                'qui inserisco solo i nomi in altra tabella
                MsgBox("il nome è: " & UCase(Replace(testArray(i), "\", "")))
            End If
        Next
 
End Sub


Hai anche cambiato il concetto della routine, eri partito che la cosa doveva avvenire mentre digitavi, per non perdere il lavoro se mancasse la corrente, invece ora hai inserito un button.
Grazie per avermi portato a conoscenza dell'istruzione Like.
Ultima modifica effettuata da Carlo 07/05/20 7:59
in programmazione tutto è permesso
07/05/20 11:24
aragorn76
Postato originariamente da Carlo:
Hai anche cambiato il concetto della routine, eri partito che la cosa doveva avvenire mentre digitavi, per non perdere il lavoro se mancasse la corrente, invece ora hai inserito un button.
Grazie per avermi portato a conoscenza dell'istruzione Like.


Si questo è un pulsante creato per prova... con la sub RichTextBox1_TextChanged comunque ad ogni cambiamento, mi salva il contenuto in una tabella :) ho provato il tuo codice e funziona alla grande, ma mi sono accorto di un altra cosa :)

Non capivo perchè se scrivevo \Fabio veniva sottolineato.. ma se usavo $Fabio (invece delle \) no.... alla fine ci sono arrivato.. veniva sottolineato perchè lo vede come un hiperlink.. quindi invece del button, potrei usare il click sul link per inserire il nome nella tabella :)

Adesso il problema è all'inverso..... Quindi adesso mi ritrovo (dopo il salvataggio) del testo \Fabio e \Gino
nella tabella nomi tutto ok invece.. perche per ogni nome mi crea un record nuovo..

nella tabella "descrizione": \Fabio e \Gino (quindi un unico link... quando invece dovrebbe separarli come in origine \Fabio e \Gino e quindi non so se posso usare \ a questo punto.... avete soluzione per farli vedere come 2 link separati?

Se riesco, dato che oltre ai nomi vi sarà pure tabella delle città.. vorrei usare sempre \ dove cliccando si apre una form con due pulsanti "Nomi" e "Città" per far capire che si sta inserendo un nome o una città.. ma questo lo vedo dopo che risolvo questa parte.
Se avete idee o suggerimenti sono Graditi :)

Certo che se vi era una soluzione che appena uno metteva che so $Milano, sapeva subito col $ che è una città e la mette in automatico nella tabella città senza cliccare nulla.... era meglio, piu professionale e meno click per l'operatore che scrive :(
Grazie
aaa
07/05/20 13:22
Carlo
Sta alla tua fantasia e a come vuoi che l'utente operi, se vuoi persegire l'approcio che un utente scrive nella RichTextBox e quando viene digitata la combinazione "magica" (\) accade qualcosa, potresti far apparire un nuovo form di input.

Per esempio così:
inserire una RichTextBox1 e una ListBox1 su Form1
Public Class Form1
    Dim pos1 As Integer = 0
    Dim FormInput As New Form
    Dim TextInput As New TextBox
    Dim Accoda As New Button
    Dim Fatto As New Button
    Dim Scelta(3) As RadioButton

    Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged

        If pos1 > RichTextBox1.TextLength Then pos1 = RichTextBox1.TextLength
        Dim pos As Integer = RichTextBox1.Text.IndexOf("\", pos1)
        If pos <> -1 Then pos1 = pos + 2 : FormInput.Show()

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' preparazione form di input
        ' meglio fare in progettazione complesso quanto vuoi
        FormInput.Text = "Scegli il tipo di record"
        FormInput.Size = New Size(300, 180)

        ' preparazione text su form di input
        TextInput.Location = New Point(10, 10)
        TextInput.Size = New Point(260, 20)
        FormInput.Controls.Add(TextInput)

        ' preparazione button su form di input
        Accoda.Text = "Accoda"
        Accoda.Location = New Point(150, 80)
        FormInput.Controls.Add(Accoda)
        AddHandler Accoda.Click, AddressOf Accoda_OnClick ' permette di avere l'evento click

        ' preparazione button su form di input
        Fatto.Text = "Fatto"
        Fatto.Location = New Point(150, 110)
        FormInput.Controls.Add(Fatto)
        AddHandler Fatto.Click, AddressOf Fatto_OnClick ' permette di avere l'evento click

        ' preparazione radiobutton su form di input
        For i = 0 To 3
            Scelta(i) = New RadioButton
            Scelta(i).Location = New Point(10, 24 * i + 40)
            FormInput.Controls.Add(Scelta(i))
        Next
        Scelta(0).Checked = True
        Scelta(0).Text = "Nome "
        Scelta(1).Text = "Cognome "
        Scelta(2).Text = "Città "
        Scelta(3).Text = "Tel. "

    End Sub

    Private Sub Accoda_OnClick(sender As Object, e As EventArgs)
        For i = 0 To 3
            If Scelta(i).Checked Then
                ListBox1.Items.Add(Scelta(i).Text & TextInput.Text)
                RichTextBox1.Text = Replace(RichTextBox1.Text, "\", "")
                RichTextBox1.Text = RichTextBox1.Text & Scelta(i).Text & TextInput.Text & " "
            End If
        Next
    End Sub

    Private Sub Fatto_OnClick(sender As Object, e As EventArgs)
        FormInput.Hide()
        RichTextBox1.Text = Replace(RichTextBox1.Text, "\", "")
    End Sub

End Class


Per renderlo funzionale ai tuoi scopi ci devi mettere del tuo.
Ultima modifica effettuata da Carlo 07/05/20 13:39
in programmazione tutto è permesso