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 FunctionYllä 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)
NextEikö .NETissä ole VB6:n Erasea vastaavaa toimintoa?
Aihe on jo aika vanha, joten et voi enää vastata siihen.