RichTextBox - dodawanie znaczników "code" dla takich samych linków

0

Mam richtextbox w ktorym jest kilka-kilkanascie linkow....

cos na zasadzie

http://turbobit.net/link1
http://turbobit.net/link2
http://turbobit.net/link3
http://catshare.com/link1
http://catshare.com/link2
http://rapidshare.com/link1

i chciałbym uzyskać taki efekt aby po kliknieciu np na button, wszystkie linki (tego samego hostingu) pogrupowaly się w znaczniki [code]...jak to zrobić najlepiej?

efekt koncowy ma byc taki:

[code]http://turbobit.net/link1
http://turbobit.net/link2
http://turbobit.net/link3[/code]
[code]http://catshare.com/link1
http://catshare.com/link2[/code]
[code]http://rapidshare.com/link1[/code]

zamiana znaczników <quote> na <code> - furious programming

0

Trzeba sobie pętelką przejechać po liniach - zapamiętać indeks pierwszego innego linku, następnie w pętli sprawdzać kolejne linie i matchować ich zawartość ze wzorcem; Po znalezieniu innego od wzorca, zaktualizować pierwszą i ostatnią linię;

Wystarczą dwie liczbowe zmienne, które służyć będą zapamiętaniu pierwszego innego linku oraz indeksu ostatniego pasującego do wzorca, no i oczywiście funkcja porównująca, której działanie trzeba sobie wymyślić; Póki co nie napisałeś co masz na myśli pisząc "takie same", skoro w przykładzie linki wcale nie są "takie same", bo różni je końcówka;

Czemu korzystasz z RichTextBox? Używasz formatowania zawartości? Jeśli nie, to zwykły TextBox będzie lepszym rozwiązaniem.

0

linki będą się różnić końcówkami, a richtextbox musi juz niestety zostac bo zbyt wiele linijek kodu ma aplikacja =/

0

linki będą się różnić końcówkami [...]

Aha, no to precyzyjnie opisałeś problem... To teraz napisz funkcję, która porówna te "końcówki";

Jeżeli RichTextBox istnieje tylko dlatego, bo kiedyś położyłeś go na formę i tak zostało, to lepiej od razu zamień go na zwykły TextBox, jeżeli formatowanie treści jest zupełnie niepotrzebne; Ile ta aplikacja ma linii? 1k? 10k? Bo chyba do tego komponentu nie odwołujesz się w milionie miejsc, więc przeróbka kodu nie powinna zająć zbyt wiele czasu;


To co musisz zrobić podałem Ci w poprzednim poście, więc jeżeli nie wiesz czego użyć to zaglądnij do dokumentacji; No i napisz sobie funkcję porównującą linki, według własnych upodobań;

Jeżeli nie chcesz tego robić w kodzie programu, to napisz sobie małego konsolaka i wykonaj test na zwykłej macierzy łańcuchów, którą zaktualizojesz i wyświetlisz wyniki w oknie konsoli;

A kodu nie podaję, bo po pierwsze jego napisanie to Twoje zadanie, po drugie sam nie programuję w VB, po trzecie - gotowców tutaj się nie rozdaje; Napisz coś sam, a jak będziesz miał z czymś problem, to wklej wadliwy kod do posta i wtedy coś się podpowie.

1

Coś w ten deseń:

    Function GetHost(Link As String) As String
        Dim StartPos As Integer
        Dim EndPos As Integer

        StartPos = Link.IndexOf("://")
        If StartPos - 1 Then
            EndPos = Link.IndexOf("/", StartPos + 3)
            If EndPos > -1 Then
                GetHost = Link.Substring(0, EndPos)
            Else
                GetHost = Link
            End If

        Else
            GetHost = Link
        End If
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Const CODE_START As String = "[code]"
        Const CODE_END As String = "[/code]"

        Dim LinksList = New List(Of String)
        LinksList.AddRange(RichTextBox1.Lines)
        LinksList.Sort()

        Dim LinksGrop = CODE_START
        Dim LastHost = ""
        Dim NewLinePos As Integer
        For Each Link As String In LinksList
            If (LastHost.Length = 0) Or Link.Contains(LastHost) Then
                LinksGrop = LinksGrop + Link + Environment.NewLine
            Else
                NewLinePos = LinksGrop.LastIndexOf(Environment.NewLine)
                LinksGrop = LinksGrop.Substring(0, NewLinePos)
                LinksGrop = LinksGrop + CODE_END + Environment.NewLine + Environment.NewLine
                LinksGrop = LinksGrop + CODE_START + Link + Environment.NewLine
            End If
            LastHost = GetHost(Link)
        Next
        NewLinePos = LinksGrop.LastIndexOf(Environment.NewLine)
        LinksGrop = LinksGrop.Substring(0, NewLinePos)
        LinksGrop = LinksGrop + CODE_END

        RichTextBox1.Clear()
        RichTextBox1.AppendText(LinksGrop)
    End Sub
0

kod działa. Dziekuje.
Ale mam 1 uwage....Kod sortuje linki alfabetycznie, przez co robi "bałagan"...
mianowicie linki muszą być sortowane wg. part1, part2,part3,part4 itd....a gdy jest alfabetycznie to jest taki bałagan i wszystko nie po kolei....

asasasssssssssssssssssssssssss.png

ale mimo wszystko dziękuję ;) jest to prawie to o co mi chodziło :)

@kAzek

0

No to co za problem albo wywal sortowanie czyli linię:

LinksList.Sort()

albo zmień na własną funkcję sortującą np:

        LinksList.Sort(Function(X As String, Y As String)
                               Return X.CompareTo(Y) 'zamiast tego jakieś swoje sortowanie (chyba porównanie samych nazw plików powinno się sprawdzić)
                           End If
                       End Function)
0

@kAzek
no wlasnie nie mam pomyslu jak to zrobic :(
bo niby te sortowanie alfabetyczne jest dobre bo wtedy te same hostingi bedą obok siebie....ale z drugiej strony.... part1, part2,part3 itd które są na konću linku sie pieprzą....
jak usune sortowanie to wtedy z kolei całe hostingi się wymieszają ;/

mi sie zdaje że to powinno sortować na zasadzie

wszystkie pliki o takich samych ciągach ---> http:// + 7 kolejnych znaków - wędróją do String1
każde kolejne odmienne od tych w String1, których łączy ---> http:// + 7 kolejnych znaków - wędróją do String2
każde kolejne odmienne od tych w String2, których łączy ---> http:// + 7 kolejnych znaków - wędróją do String3

po zakonczeniu sortowania do tych stringow - w każdym stringu juz pogrupowane linki sortują sie wg. "part1", "part2", "part3" itd .....

następnie string1, string2, string3 itd ---- > (posortowane) wędrują do TextBox1......

wiem że jest to do opanowania, ale szczerze mowiąc nie mam pojęcia jak sie do tego zabrać i czy wgl dobrze to rozplanowałem =/

0

No to potrzebne jest własne sortowanie np. coś takiego:

        LinksList.Sort(Function(X As String, Y As String)
                           Dim sX, sY As String
                           sX = GetHost(X)
                           sY = GetHost(Y)
                           If sX.Equals(sY) Then
                               sX = System.IO.Path.GetFileName(X)
                               sY = System.IO.Path.GetFileName(Y)
                               Return sX.CompareTo(sY)
                           Else
                               Return X.CompareTo(Y)
                           End If
                       End Function)
0

@kAzek
prawde mowiac to nadal nie wiem jak tego użyć ;/

bo pewnie Ci chodzi o to że mam wskazać nazwę hosta by funkcja mogla porównać "wprowadzoną nazwę" z linkiem.....
a mi chodzi o to by nic nie wprowadzać ręcznie itd....

bym mógł nawet 1000 linkow wkleić i funkcja by mi posortowała wg. hostów oraz końcowych "part1" "part2" itp
bez mojej interwencji , podawania słów kluczowych typu "rapidu", "rapidshare", "catshare", turbobit" itp itd.....

    Function GetHost(Link As String) As String
        Dim StartPos As Integer
        Dim EndPos As Integer

        StartPos = Link.IndexOf("://")
        If StartPos - 1 Then
            EndPos = Link.IndexOf("/", StartPos + 3)
            If EndPos > -1 Then
                GetHost = Link.Substring(0, EndPos)
            Else
                GetHost = Link
            End If

        Else
            GetHost = Link
        End If
    End Function


    Private Function LinksListSort(X As String, Y As String)
        Dim sX, sY As String
        sX = GetHost(X)
        sY = GetHost(Y)
        If sX.Equals(sY) Then
            sX = System.IO.Path.GetFileName(X)
            sY = System.IO.Path.GetFileName(Y)
            Return sX.CompareTo(sY)
        Else
            Return X.CompareTo(Y)
        End If
        LinksListSort = LinksListSort(X, Y)
    End Function
2

Jak to jak zamaist:

LinksList.Sort()

wkleić tak jak jest napisane.

EDIT
@kosmita90xxx chyba że nasz jakaś starszą wersję VB "nie łyka" takiego kodu (ale chyba powinno łykać) to jest to równoznaczne z zapisem:

    Function MySort(X As String, Y As String) As Integer
        Dim sX, sY As String
        sX = GetHost(X)
        sY = GetHost(Y)
        If sX.Equals(sY) Then
            sX = System.IO.Path.GetFileName(X)
            sY = System.IO.Path.GetFileName(Y)
            Return sX.CompareTo(sY)
        Else
            Return X.CompareTo(Y)
        End If
    End Function

i wywołaniem:

LinksList.Sort(AddressOf MySort)

1 użytkowników online, w tym zalogowanych: 0, gości: 1