HDSoftware Skrevet 9. oktober 2006 Del Skrevet 9. oktober 2006 Heisan Må henvise til tidligere liv igjen ;-) I Clarion kan jeg gjøre slik: MinQ QUEUE ' Definerer en kø i minnet Navn STRING(64) Adresse STRING(64) END!Queue MinQ.Navn = 'Testulf Prøvesen' MinQ.Adresse = 'Gata 1' Add(MinQ) etc. etc. etc Så kan jeg gjøre slik: MinQ.Navn = "Erik Nilsen" Get(MinQ,MinQ.Navn) if errorcode() ' Posten eksisterer ikke i køen Message('Beklager, men posten finnes ikke') else Message(clip(MinQ.Navn) & ' bor i ' & clip(MinQ.Adresse)) End!If Er noe tilsvarende mulig i VB2005 ? Kan nevne at jeg også kan hente poster i en kø slik: Loop i = 1 to records(MinQ) Get(MinQ, i) Message(clip(MinQueue.Navn) & ' bor i ' & clip(MinQueue.Adresse)) End!Loop I tillegg kan jeg gjøre slik: ?List{PROP:From} = MinQ Dette gjør at en liste på en Form vil inneholde alle dataene i den aktuelle køen. Håper jo at tilsvarende er mulig i VB2005 Ole Lenke til kommentar
j000rn Skrevet 9. oktober 2006 Del Skrevet 9. oktober 2006 (endret) Virker som du heller vil ha en "liste" enn en kø. .Net 2.0 har begge deler (og flere andre) som generic klasser. Her er eksempel på noen av dem. I tillegg støtter alle også FOR EACH. public class MinKlasse public class Person public Navn as String public Alder as String public sub new(navn as String, alder as String) me.Navn = navn me.Alder = alder end sub end class private sub EnFunksjon() Dim lst as New List(of Person) lst.Add( new Person("Kåre", 10) ) dim EnPerson as Person = lst(0) dim lst2 as New Dictionary(of String, Person) lst2.Add("Kåre", New Person("Kåre", 10) ) Dim EnPerson2 as Person = lst2("Kåre") Dim lst3 as New Que(of Person) lst3.Enque( new Person("Kåre", 10) ) dim EnPerson3 as Person = lst3.Deque() For Each p as Person In lst ' eller lst2, lst3 Console.WriteLine( p.Navn & " er " & p.Alder & " år gammel.") End For end sub Endret 9. oktober 2006 av jorn79 Lenke til kommentar
HDSoftware Skrevet 9. oktober 2006 Forfatter Del Skrevet 9. oktober 2006 Virker som du heller vil ha en "liste" enn en kø. .Net 2.0 har begge deler (og flere andre) som generic klasser. Her er eksempel på noen av dem. I tillegg støtter alle også FOR EACH. Glimrende ;-) Noen tillegs spørsmål så klart: 1. Ser du i hvert eksempel gjør en dim EnPerson as Person = lst(0). Hvorfor? 2. Kan jeg akksessere denne køen tilfeldig? F.eks. hente post nr. 5? (uten å gjøre en For Each 5 ganger så klart.) 3. Du har deklarert en metode NEW(). Er dette en standard funksjon som må være med for å legge inn verdier? I så fall, hva med sletting, endring etc. 4. Kan køen sorteres ? 5. Og til slutt. Hvordan kan jeg binne denne køen til en visuell liste kontrol? mvh Ole Lenke til kommentar
GeirGrusom Skrevet 9. oktober 2006 Del Skrevet 9. oktober 2006 Du henter verdier fra en array ved å bruke [Array]([index]) Sub New er konstruktoren til klassen Person, det kan lages mange slike, og er der kun for at det skal bli enklere å programmere, ved at du kan gi parameter og verdier når objektet lages. Sortering: Lag først en funksjon som forteller hvordan ting skal sorteres, det er kjempeenkelt: Private Function SortByName(Person1 As Person, Person2 As Person) As Integer Return Person1.Navn.CompareTo(Person2.Navn) ' Returnerer forskjellen på de to End Function Public Sub SortListByName(lst As List(Of Person)) Dim comp As Comparer(Of Person) comp = AddressOf SortByName lst.Sort(comp) End Sub For å bruke Person i f.eks. ListBox er den enkleste måten å override Person.ToString() og bruke [ListBox].Items.Add([instance]) For da vil teksten som Person.ToString() gir tilbake være verdien som står i listboxen. Public Class Person Public Navn as String Public Alder as String Public Sub New(navn as String, alder as String) Me.Navn = navn Me.Alder = alder End sub Public Overrides Function ToString() As String Return Me.Navn End Function End Class Du kan endre hvordan ListBox tegner, ved å legge til en funksjon i eventet ListBox.DrawItem og sette DrawMode til OwnerDrawFixed eller OwnerDrawVariable Obs! Hvis du bruker OwnerDrawVariable MÅ du også lage en funksjon til eventet ListBox.MeasureItem. Lenke til kommentar
HDSoftware Skrevet 10. oktober 2006 Forfatter Del Skrevet 10. oktober 2006 (endret) Kult!! Dette liker jeg!! Men jeg prøvde meg litt videre og brukte et DataGridView i stedet. Det jeg da fant ut var at alle PROPERTY som ble definert i klassen kom som kolonner. Helt genialt rett og slett. Liker dette. Kunne dermed sette properties på disse kolonnene mved å bruke COLUMNS("Kolonnenavn") og det var jo tilogmed enda bedre. Men du. Den sorteringa fikk jeg ikek til. Fikk feilmelding på AddressOf av en eller annen grunn, men samme det egentlig. Jeg skal finne ut av det. Men det med å hente en spesifikk post i køen fikk jeg ikke noe dreisen på. Du snakket om index i array. Er dette er array da? Og i så fall, bruker jeg helt ordinær array syntax mot denne? Kan du gi et lite eksempel på hvordan jeg henter post 4 i objektet lst (definert over). La os si at jeg skal vise en message box som viser nav og alder på post nr. 4. Misstenker tilogmed at jeg kan automatisere dette på en eller annen måte i DataGridView. Takker for svar Ole Endret 10. oktober 2006 av HDSoftware Lenke til kommentar
GeirGrusom Skrevet 10. oktober 2006 Del Skrevet 10. oktober 2006 List, Collection, Queue etc. har en funksjon som heter Property Item(index) som du kan bruke som indexer (akkurat som i et array) Så syntaksen er helt lik. Så: Dim post4 As Person = lst(4) Husk at klasser alltid er by referance, altså at det du får er en peker, og ikke en kopi av objektet, skal du ha det, må du enten implementere IClonable, eller lage Person om til en Structure istedet. Det med sortering kan det godt hende jeg har skrevet feil, jeg jobber stort sett i C#. Der er syntaks, og hvordan ting gjøres, litt annerledes. Lenke til kommentar
HDSoftware Skrevet 10. oktober 2006 Forfatter Del Skrevet 10. oktober 2006 Ok. Trodde kansje jeg kunne gjøre noe slik: MessageBox.Show("Navn = " & lst(4).Navn) Men jeg må altså gjøre slik: Dim Post4 as Person = lst(4) MessageBox("Navn = " & Post4.Navn) Men det er egentlig helt greit det siden det er en referanse. Dermed tar dette ikke minneplass. Det geniale er jo at jeg da kan gjøre slik: Post4.Alder = 40 Og dermed er posten i listen automatisk endret. Jeg synes dette høres helt perfekt ut. Dermed er det jo super enkelt og lage et nyt cindu som er en slags REDIGER_POST og bare bruke referansen direkte i vinduet. Dette må jeg virkelig prøve ut skikkelig for dette har jeg grådig bruk for. Takker for hjelpen Ole Lenke til kommentar
GeirGrusom Skrevet 10. oktober 2006 Del Skrevet 10. oktober 2006 Du kan skrive MessageBox.Show("Navn = " & lst(4).Navn) det går fint det, akkurat som en array Beklager hvis jeg ikke forstod spørsmålet ditt. Jeg synes det kan være litt irriterende i Visual Basic at den ikke har samme cast syntaks som i C#, hvor en kunne skrevet: object obj; obj = new Person("Per"); // Det er det neste som er litt genialt: ((Person)obj).Name = "Pål"; // Siden obj ikke inneholder egenskapen "Name" ville det vanligvis ikke kompilert. men men.. Lenke til kommentar
HDSoftware Skrevet 10. oktober 2006 Forfatter Del Skrevet 10. oktober 2006 Du kan skrive MessageBox.Show("Navn = " & lst(4).Navn) det går fint det, akkurat som en array Beklager hvis jeg ikke forstod spørsmålet ditt. Jeg synes det kan være litt irriterende i Visual Basic at den ikke har samme cast syntaks som i C#, hvor en kunne skrevet: object obj; obj = new Person("Per"); // Det er det neste som er litt genialt: ((Person)obj).Name = "Pål"; // Siden obj ikke inneholder egenskapen "Name" ville det vanligvis ikke kompilert. men men.. 7041564[/snapback] Tror ikke jeg er enig med deg der. Ser jo innkapslingen, men jeg er vant til DOT syntaxen fra før så jeg holder en knapp på den jeg ;-) Men for all del. Kul måte å anngi objekter på Ole Lenke til kommentar
j000rn Skrevet 10. oktober 2006 Del Skrevet 10. oktober 2006 Jeg synes det kan være litt irriterende i Visual Basic at den ikke har samme cast syntaks som i C#, hvor en kunne skrevet: object obj; obj = new Person("Per"); // Det er det neste som er litt genialt: ((Person)obj).Name = "Pål"; // Siden obj ikke inneholder egenskapen "Name" ville det vanligvis ikke kompilert. men men.. 7041564[/snapback] Jeg forstod kanskje ikke helt problemet...? (Og jeg er HELT enig, C# syntax er myyye bedre enn VB.Net ) Men.. du kan jo gjøre akuratt det samme med CType eller DirectCast: dim obj as Object = new Person("Per") CType(obj, Person).Name = "Pål" eller egentlig bedre: dim obj as Object = new Person("Per") DirectCast(obj, Person).Name = "Pål" Lenke til kommentar
HDSoftware Skrevet 10. oktober 2006 Forfatter Del Skrevet 10. oktober 2006 Uansett karer! Jeg setter enorm pris på kunnskapen deres. Ser at jeg kommer til å ha god nytte av dette forum. Heldigvis er jeg kjent med OOP. Derfor blir ikke overgangen fra hybriden Clarion så enorm. Det som overrasker meg mest er OOP i Visual Basic 2005. Jeg finner dette veldig vel utviklet. I Clarion var en klasse ganske begrenset når det gjelder properties. Liker spesielt den PROPERY name AS TYPE saken som popper opp med GET og PUT. Dette lar meg virkelig lage regler på selve property nivå og det har jeg aldri vert borti før. Kan jo til og med lage ReadOnly properties. Utrolig bra!! Takker for all hjelp Ole Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå