Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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 av jorn79
Lenke til kommentar
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

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

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 av HDSoftware
Lenke til kommentar

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

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

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
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
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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...