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.
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?
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.
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
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
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.
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?
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.
Kiitoksia kaikille.
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?
Näin voi poistaa kaikki työt muistista:
Dim i As Integer For i = 10000 To 99999 PoistaTyo(i) Next
Eikö .NETissä ole VB6:n Erasea vastaavaa toimintoa?
Aihe on jo aika vanha, joten et voi enää vastata siihen.