Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Numeroiden listausta textboxissa

Sivun loppuun

timo80 [15.09.2008 09:56:36]

#

Terve,

eli tarkoituksena olisi saada textboxiin monta työnumeroa. Työnumerot ovat muotoa x21367, x21368 jne. Miten voisin toteuttaa seuraavan: Ensimmäinen buttonin painallus lisää textboxiin ensimmäisen työnumeron x21367. Toinen painallus ei korvaa numeroa vaan lisää sen sarjaan muotoon x21367-68 (tai x21367-368) ja kolmannen työnumero x21369 jälkeen textboxissa lukisi x21367-69.
Lisäksi haluasin toteutuksen, jossa numerot eivät välttämättä olisi perä jälkeen vaan eriteltäisiin pilkulla tyyliin. x21367-69, x21380. Tai x21367-69, 380. Pohjana VB.NET.

Antti Laaksonen [15.09.2008 10:15:32]

#

Voisitko vielä tarkentaa kysymystä?

Onko siis annettu joukko töiden numeroita ja ne pitää näyttää tekstikentässä niin, että peräkkäiset töiden numerot esitetään viivamerkinnällä?

Miten katkaisukohta valitaan? Jos numerot ovat x12345, x12346 ja x12347, onko merkintä x12345-7, x12345-47, x12345-347 vai mitä? Entä jos yhteinen alkuosa on lyhyempi?

Lisäksi miten määritetään, mikä työnumero pitää lisätä joukkoon milloinkin?

Grez [15.09.2008 11:02:54]

#

Kuulostaa yleisesti ottaen harvinaisen paksalta systeemiltä toi osittaisen numeron ottaminen numeroväliin.

Antti tuossa jo kysyikin tarkennusta, että millä logiikalla pitäisi arpoa montako numeroa kulloinkin otetaan näkyville.

timo80 [15.09.2008 12:52:24]

#

Sori, eli tarkennuksena ja tarkemmin ajateltuna eiköhän se ole sittenkin parempi sarjattaa koko nimellä. Mietin vain lyhennyksiä tilan säästämisen kannalta, mutta se unohtukoot. Eli miten saisi toteutettua tällaisen textboxiin: x12345-x12348, x12360

Antti Laaksonen [15.09.2008 17:01:23]

#

Tuossa on vähän esimerkkiä:

' töiden numerot välillä 10000 - 99999
Dim tyot(100000) As Boolean

Sub LisaaTyo(ByVal numero As Integer)
    tyot(numero) = True
End Sub

Sub PoistaTyo(ByVal numero As Integer)
    tyot(numero) = False
End Sub

Function HaeTyot() As String
    Dim lista As String
    Dim sarja As Boolean
    Dim alku As Integer, loppu As Integer
    Dim uusi As String
    Dim i As Integer
    sarja = False
    ' käydään läpi kaikki työt
    For i = 10000 To 100000
        ' työ on merkitty
        If tyot(i) Then
            ' aloitetaan uusi sarja
            If Not sarja Then
                sarja = True
                alku = i
            End If
            loppu = i
        ' työtä ei ole merkitty
        Else
            ' päätetään vanha sarja
            If sarja Then
                ' sarjassa on vain yksi työ
                If alku = loppu Then
                    uusi = "x" & loppu
                ' sarjassa on useampia töitä
                Else
                    uusi = "x" & alku & "-" & "x" & loppu
                End If
                ' tämä on ensimmäinen merkintä
                If lista = "" Then
                    lista = uusi
                ' jotain muuta on jo merkitty
                Else
                    lista = lista & ", " & uusi
                End If
                sarja = False
            End If
        End If
    Next
    HaeTyot = lista
End Function

Yllä olevaa koodia voi käyttää näin:

LisaaTyo(12354)
LisaaTyo(12350)
LisaaTyo(12345)
LisaaTyo(12346)
LisaaTyo(12353)
LisaaTyo(12347)

MsgBox(HaeTyot)

Viesti-ikkunassa näkyy: x12345-x12347, x12350, x12353-x12354

Grez [15.09.2008 17:07:55]

#

Ilmankos nykyiset softat on hirveitä muistisyöppöjä, onneksi ei sentään ole 8-numeroiset työnumerot käytössä :D

Mutta ei sillä, ihan hyvä KISS-esimerkki, jota timo voi itse kehittää paremmaksi.

Antti Laaksonen [15.09.2008 17:31:51]

#

Joo, kohdistin optimoinnin tällä kertaa työn lisäykseen ja poistoon.

Jos numerot voivat olla tätä suurempia, taulukkoon kannattaa mieluummin tallentaa vain merkityt työt. Tällöin taulukko pitää indeksoida toisin ja järjestää ennen tulostusta. Jos lisäksi merkittyjä töitä voi olla suuri määrä, jokin puurakenne voisi olla hyvä.

Onkohan muuten VB.NETissä jotain valmiita tietorakenteita, vai pitääkö kaikki tehdä alusta asti taulukoilla vanhan hyvän ajan malliin?

Grez [15.09.2008 17:39:41]

#

Ehkäpä tällaisen kirjan kuin "Data Structures and Algorithms Using Visual Basic.NET" sisällysluettelo antaa asiasta osviittaa:

1. Collections; 2. Arrays and the array class; 3. The arraylist and sortedlist classes; 4. Basic sorting algorithms; 5. Basic searching algorithms; 6. Stacks and queues; 7. BitArrays and the BitVector structure; 8. Strings, the string class and the StringBuilder class; 9. Special string classes - StringCollection, StringDictionary and StringEnumerator; 10. Pattern matching and text processing - using the RegEx and supporting classes; 11. Hash tables; 12. Dictionaries - the DictionaryBase class and specialized dictionary classes; 13. Linked lists; 14. Binary trees and binary search trees; 15. Sets; 16. Advanced sorting algorithms; 17. Advanced searching algorithms; 18. Graphs and graph algorithms; 19. Greedy algorithms; 20. Probabilistic algorithms; 21. Dynamic programming.

Päivitin tuossa juuri erään VB6 -softan VB.Netiin niin pääsin samantien heittämään puolenkymmentä omaa apumoduulia mäkeen, kun .Net framework sisälsi samat toiminnallisuudet.

timo80 [17.09.2008 07:25:07]

#

Kiitoksia kaikille.

timo80 [18.09.2008 14:06:28]

#

Vielä pikku kysymys aiheesta. Mitenkäs Laaksosen koodipätkällä onnistuisi koko työmuistin tyhjennys. Eli Sub Poistatyo toimii hyvin yksittäisissä tapauksissa, mutta kuinka poista kaikki työt muistista samanaikaisesti?

Antti Laaksonen [18.09.2008 15:06:00]

#

Näin voi poistaa kaikki työt muistista:

Dim i As Integer
For i = 10000 To 99999
    PoistaTyo(i)
Next

Merri [18.09.2008 22:31:13]

#

Eikö .NETissä ole VB6:n Erasea vastaavaa toimintoa?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta