Avatar billede Slettet bruger
30. august 2013 - 08:16 Der er 21 kommentarer og
1 løsning

Chat auto opdatere chat tekst

Jeg er igang med at lave en chat som går over min FTP, og køre på Richtextbox. Og bedt om at scroolbaren skal holdes i bunden da teksten bliver vist der som det sidst nye i chatten. Men jeg vil gerne have at den opdatere sig automatisk. Og jeg har prøvet en kode som auto automatisk opdatere chatten, men problemet her ligger i at min Richtextbox scroolbar hopper op til toppen, også ned igen som normal. og sådan gøre den heletiden når der er gået det x antal sekunder. Og dette er jeg træt af. Er det muligt med en form af et script som ikke påvirker scroolbaren med at hoppe op og ned heletiden Men bare opdatere sig uden at scroolbaren hopper op og ned hver gang den opdatere sig?

Visual Basic 2013
Avatar billede keysersoze Ekspert
30. august 2013 - 09:19 #1
Web, Windows eller?
Avatar billede Slettet bruger
30. august 2013 - 11:57 #2
#1 Bruger VB.net så alt er baseret i et windows hvis det er det du mener.?
Avatar billede keysersoze Ekspert
30. august 2013 - 12:21 #3
du kan også sagtens lave web i vb.net og det er nok her man oftest ser en chat.

Prøv at kom med et kodeeksempel så folk herinde kan se hvad du laver.
Avatar billede moddi100 Seniormester
30. august 2013 - 13:43 #4
Hvis nyt indhold altid tilføjes i bunden, kan du jo bare tjekke antal tegn der står i din textbox. Det antal tegn starter du så med at fjerne fra din nye tekst inden den tilføjes til din textbox. Brug

textBox1.AppendText(str.substring(textBox1.TextLength - 1))


Hvor str altså er den fulde tekst
Avatar billede moddi100 Seniormester
30. august 2013 - 14:01 #5
Nej hov, det skal vidst bare være

textBox1.AppendText(str.substring(textBox1.TextLength))
Avatar billede Slettet bruger
30. august 2013 - 15:30 #6
Det er måske lidt uoverskueligt dette. Men dette er min kode

Imports System.Net
Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim client As New Net.WebClient
            'Downloader TXT filen til chatten
            client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If


        Catch ex As Exception

        End Try




        'Uploader txt fil til FTP Server
        Dim name As String
        name = TextBox1.Text
        Try
            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXXX", "XXXXXXXX")
            client.UploadString("ftp://computer-teknologi.dk/test/chat.txt", RichTextBox1.Text & "" & name & ": " & RichTextBox2.Text & vbNewLine)
            RichTextBox2.Clear()
        Catch ex As Exception
            MsgBox("fejl denne fejl tager vi os af.", MsgBoxStyle.Critical, "Fejl!")
        End Try
        Try
            'Downloader TXT filen til chatten
            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If
        Catch ex As Exception

        End Try
    End Sub





    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'Refresh txt filen fra FTP server til Knap nr 2
        Try
            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If


        Catch ex As Exception

        End Try
    End Sub


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


        'Refresh txt filen fra FTP server til Knap nr 2

        Try

            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXXX", "XXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If


        Catch ex As Exception

        End Try
        'Sørger for at Scrollbaren holdes ned
        Me.RichTextBox1.SelectionStart = Me.RichTextBox1.Text.Length - 1
        Me.RichTextBox1.SelectionLength = 1

        Me.RichTextBox1.ScrollToCaret()
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        'Husker brugernavn
        My.Settings.remember = TextBox1.Text
        My.Settings.Save()
    End Sub


    Private Sub Form1_Load(sender As Object, ByVal e As EventArgs) Handles MyBase.Load


        'Refresh txt filen fra FTP server
        Try
            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If


        Catch ex As Exception

        End Try



        'Huster ens brugernavn
        TextBox1.Text = My.Settings.remember
        'Tjekker om Textbox1 har et brugernavn

        If TextBox1.Text.Trim().Length = 0 Then
            MsgBox("Skriv brugernavn tak!")
        Else
            TextBox1.Enabled = False
        End If


    End Sub

    Private Sub RichTextBox2_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox2.TextChanged
        'Gøre det muligt at Trykke ENTER
        AcceptButton = Button1
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs)
        RichTextBox1.Refresh()

        'Refresh txt filen fra FTP server til Knap nr 2

        Try

            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXXX", "XXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If


        Catch ex As Exception

        End Try

    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    End Sub
End Class



Det kan godt være at koden kan sættes pænere op. og muligvis sættes op så det kan arbejde hurtigere?  Men jeg har fjernet auto opdateringen da jeg ikke kunne bruge den. uden at det irriteret en.
Avatar billede moddi100 Seniormester
01. september 2013 - 18:49 #7
Har du prøvet at kigge på det jeg skrev?
Avatar billede arne_v Ekspert
02. september 2013 - 03:24 #8
Det design er vist ikke godt. Der kan opstaa samtidigheds problemer og dit brugernavn/password kan nemt fiskes ud afdit program.
Avatar billede Slettet bruger
06. september 2013 - 17:11 #9
#7 Ja har kigget lidt på det, men kan ikke rigtig få det til efter mit ønske
Avatar billede Slettet bruger
06. september 2013 - 17:12 #10
#8 Nej ved godt at du kan åbne det også se hele kildekoden der, men det burde på en eller anden måde være muligt at kryptere det, så det ikke kan unkryptere det, så man ikke kan finde de oplysninger.?
Avatar billede moddi100 Seniormester
08. september 2013 - 01:14 #11
Udskrift
{div]  'Downloader TXT filen til chatten
            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If[/div]

Med følgende:


'Downloader TXT filen til chatten
Dim client As New Net.WebClient
client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXXX")
Dim str As String = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")

RichTextBox1.AppendText(str.substring(RichTextBox1.TextLength))


Det skulle gerne virke. Ovenstående burde så smides ind i en funktion, så du ikke skal skrive alle linjerne hver gang, men blot bruger en linje, på at kalde en funktion.
Derudover bør du helt sikkert lytte til arne_v's kloge ord, da jeg blot er en novice indenfor Visual Basic.
Avatar billede moddi100 Seniormester
08. september 2013 - 01:16 #12
Fantastisk stavning på dette tidspunkt af døgnet. Der skulle selvfølgelig have stået "Udskift":

'Downloader TXT filen til chatten
Dim client As New Net.WebClient
client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXXX")
RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
If RichTextBox1.Text = RichTextBox1.Text Then

Else : RichTextBox1.Text = RichTextBox1.Text

End If


Med
'Downloader TXT filen til chatten
Dim client As New Net.WebClient
client.Credentials = New Net.NetworkCredential("XXXXXXXX", "XXXXXXXXX")
Dim str As String = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")

RichTextBox1.AppendText(str.substring(RichTextBox1.TextLength))
Avatar billede MadsHaupt Juniormester
15. september 2013 - 20:31 #13
Du kunne jo prøve at opdater i baggrunden.

Kode i load eventet:

Control.CheckForIllegalCrossThreadCalls = False
        Call New Threading.Thread(Sub()
                                      While True
                                          RichTextBox1.Refresh()

        'Refresh txt filen fra FTP server til Knap nr 2

        Try

            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXXX", "XXXXXXXX")
            RichTextBox1.Text = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If


        Catch ex As Exception

        End Try
                                      End While
                                  End Sub).Start()
'Huster ens brugernavn
        TextBox1.Text = My.Settings.remember
        'Tjekker om Textbox1 har et brugernavn

        If TextBox1.Text.Trim().Length = 0 Then
            MsgBox("Skriv brugernavn tak!")
        Else
            TextBox1.Enabled = False
        End If


Og fjerne timeren.
Avatar billede arne_v Ekspert
16. september 2013 - 02:49 #14
jeg vil fraraade den her:

Control.CheckForIllegalCrossThreadCalls = False

det er saa nemt at goere det rigtigt med Invoke
Avatar billede MadsHaupt Juniormester
16. september 2013 - 19:43 #15
arne_v hvis man bruger Invoke funktionen så vil formen gå i stå, og den vil skrive at den ikke svarar.
Avatar billede arne_v Ekspert
17. september 2013 - 03:33 #16
Hvis Invoke haenger saa er det p.g.a. en anden fejl - Invoke er det man skal bruge.
Avatar billede MadsHaupt Juniormester
17. september 2013 - 12:31 #17
arne_v hvorfor er det lige Invoke funktionen der er den rigtige og ikke "Control.CheckForIllegalCrossThreadCalls = False"?.
Avatar billede arne_v Ekspert
17. september 2013 - 20:14 #18
WinForms er ikke thread safe. Hvis controller opdateres paa forskellige traade, saa kan der ske fejl.

Derfor har MS lagt et lille check ind der giver en fejl hvis man forsoeger at opdatere en control fra en anden traad end event traaden.

Udviklerne kan saa goere en af to ting:

1) vaelge den sikre loesning og bruge Invoke til at faa udfoert alle opdateringer i event traaden

2)bruge CheckForIllegalCrossThreadCalls = False, opdatere fra en anden traad, krydse fingrene og haabe at det gaar godt
Avatar billede arne_v Ekspert
17. september 2013 - 20:15 #19
Hvad synes du lyder mest tiltalende?
Avatar billede MadsHaupt Juniormester
18. september 2013 - 09:44 #20
Du kunne jo prøve at opdater i baggrunden.

Kode i load eventet:

'Huster ens brugernavn
        TextBox1.Text = My.Settings.remember
        'Tjekker om Textbox1 har et brugernavn

        If TextBox1.Text.Trim().Length = 0 Then
            MsgBox("Skriv brugernavn tak!")
        Else
            TextBox1.Enabled = False
        End If
Call New Threading.Thread(Sub()
                                      While True
                                          Invoke(New ThreadStart(Sub()
RichTextBox1.Refresh()
End Sub))

        'Refresh txt filen fra FTP server til Knap nr 2

        Try

            Dim client As New Net.WebClient
            client.Credentials = New Net.NetworkCredential("XXXXXXXXX", "XXXXXXXX")
Dim downloadedstr As String = client.DownloadString("ftp://computer-teknologi.dk/test/chat.txt")
Invoke(New ThreadStart(Sub()
            RichTextBox1.Text = downloadedstr
            If RichTextBox1.Text = RichTextBox1.Text Then

            Else : RichTextBox1.Text = RichTextBox1.Text

            End If
End Sub))

        Catch ex As Exception

        End Try
                                      End While
                                  End Sub).Start()


Og fjerne timeren.
Avatar billede moddi100 Seniormester
18. september 2013 - 19:02 #21
Tror nu vi har mistet spørger :)
Avatar billede Slettet bruger
25. november 2013 - 17:26 #22
Lukket. Projektet fixet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester