Gå til innhold

Visual Basic Roundup!


Anbefalte innlegg

Jeg har locked text-boksen, og slått av tab-stop på alle knappene + text-boksen. På den måten unngår jeg ulovlig/uheldig data å bli skrevet inn, samtidig som alle de lovlige knappene fungerer perfekt.

Ingen dum idè. Det falt meg faktisk ikke inn i det hele tatt. Bør nok merke meg den til ettertiden.

 

Når det gjelder kodesnutten jeg postet i siste post, må jeg innrømme at jeg har rent oversett en nokså skadelig skrivefeil i følgede linje:

 

' Sjekk om tasten er nedtrykket

If GetAsyncKeyState(VK_NUMPAD0 + Right(Control.Name, 1) - 1) = -32767 Then

 

Teksten jeg har merket av er synderen; koden i posten ovenfor nå er også fikset.

 

Dog synes jeg din metode var langt enklere og bedre i så måte, idet min løsning ble mer smør på flesk. En mulighet er å kombinere disse løsningene, og gjøre således:

 

Private Sub Form_KeyPress(KeyAscii As Integer)

   Dim Control As Object
   
   For Each Control In Me.Controls
   
       ' Fortsett kun dersom dette er en kommandoknapp
       If TypeOf Control Is CommandButton Then
           
           ' Sjekk om knappens tag-egenskap korresponderer med ID'en til tasten som nettopp ble trykket
           If Val(Control.Tag) = KeyAscii Then
   
               ' Sett denne tasten til fokus
               Control.SetFocus
               
               ' Trykk inn ENTER
               SendKeys "{ENTER}"

               ' Sett fokus til tekstboksen
               txtInput.SetFocus
           
           End If
       
       End If
   
   Next

End Sub

 

Etter du har lagt denne koden inn i prosjektet, setter du TAG-egenskapen til alle kommandoknappene som skal aktiveres via tastaturet til deres respektive tastekode. Da setter du eksempelvis cmd0.Tag til 48 og cmdMinus.Tag til 45.

Lenke til kommentar
Videoannonse
Annonse
Laget et bittebittelite program som viser hvordan forskjellige funksjoner tolker utdata fra tastaturet. Brukes i forbindelse med mitt lille tastatur-problem/-stunt tidligere i tråden.

 

Fikk bare så lyst til å dele det med dere. :blush:

Dette var faktisk en nyttig liten util. Legger den i Quick Launch :thumbup:

 

Hvorfor har jeg ikke kommet på å lage et slikt selv?? :hmm:

Lenke til kommentar
Private Sub Form_KeyPress(KeyAscii As Integer)

   Dim Control As Object
   
   For Each Control In Me.Controls
   
       ' Fortsett kun dersom dette er en kommandoknapp
       If TypeOf Control Is CommandButton Then
           
           ' Sjekk om knappens tag-egenskap korresponderer med ID'en til tasten som nettopp ble trykket
           If Val(Control.Tag) = KeyAscii Then
   
               ' Sett denne tasten til fokus
               Control.SetFocus
               
               ' Trykk inn ENTER
               SendKeys "{ENTER}"

               ' Sett fokus til tekstboksen
               txtInput.SetFocus
           
           End If
       
       End If
   
   Next

End Sub

En meget genial idé. Jeg har faktisk aldri visst at Tag-egenskapen kan brukes til slikt.

 

Men det er et lite problem. Hvis jeg har med txtInput.SetFocus kommer det bare opp et nulltall uansett hvilken knapp jeg trykker på. Og om jeg tar linjen vekk, reagerer alt riktig bortsett fra at den fokuserte knappen vil bli trykket på enda en gang når jeg trykker <Enter> (som skal blir er lik), mens cmdErLik-funskjonen ikke reagerer i det hele tatt.

 

Det siste tilfellet har jeg prøvd å løse ved å sette litt forskjellige objekter til .SetFocus, men det funker ikke optimalt da heller. Det første tilfelle har jeg ikke peiling på hvorfor oppfører seg på den måten, jeg ser absolutt ingen grunner til at den ikke skal funke perfekt.

Lenke til kommentar

Hmm, hva hender dersom du benytter følgende kode istedenfor:

 

Private Sub Form_KeyPress(KeyAscii As Integer)

   Dim Control As Object
   
   For Each Control In Me.Controls
   
       ' Fortsett kun dersom dette er en kommandoknapp
       If TypeOf Control Is CommandButton Then
           
           ' Sjekk om knappens tag-egenskap korresponderer med ID'en til tasten som nettopp ble trykket
           If Val(Control.Tag) = KeyAscii Then
   
               ' Klikk på tasten
               SendMessage Control.hwnd, BM_CLICK, 0, ByVal 0&
           
               ' Set fokus til gjeldende vindu
               Me.SetFocus
           
           End If
       
       End If
   
   Next

End Sub

 

Bemerk at følgende må være deklarert øverst i hovedformen:

 

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

' For å klikke kommandoknapper via hWnd
Const BM_CLICK = &HF5

Lenke til kommentar

mekker da litt med vb jeg også, har det nå på skolen atm

 

oppgaven var å lage et program bare, utifra det vi har lært hittil. 2 timer hver uke. (valgfag på VK1 IKT)

 

Private Sub Command1_Click()


'-----nullstill-----
Label1 = "-"
Label2 = "-"
Label3 = "-"
Label4 = "-"
Label5 = "-"
Label6 = "-"
Label7 = ""


'-----gjett et tall-----
Label7 = InputBox("Hvilket tall gjetter du på? Husk, det må være sekssifret", "Gjett et sekssifret tall")


'-----randomize-----
Randomize


'-----label1-----
For teller = 1 To 50
For teller2 = 1 To 1000000
Next teller2
tall = Int(Rnd * 10)
Label1 = tall
Refresh
Next
For teller3 = 1 To 10000000
Next teller3


'-----label2-----
For teller = 1 To 50
For teller2 = 1 To 1000000
Next teller2
tall = Int(Rnd * 10)
Label2 = tall
Refresh
Next
For teller3 = 1 To 10000000
Next teller3


'-----label3-----
For teller = 1 To 50
For teller2 = 1 To 1000000
Next teller2
tall = Int(Rnd * 10)
Label3 = tall
Refresh
Next
For teller3 = 1 To 10000000
Next teller3


'-----label4-----
For teller = 1 To 50
For teller2 = 1 To 1000000
Next teller2
tall = Int(Rnd * 10)
Label4 = tall
Refresh
Next
For teller3 = 1 To 10000000
Next teller3


'-----label5-----
For teller = 1 To 50
For teller2 = 1 To 1000000
Next teller2
tall = Int(Rnd * 10)
Label5 = tall
Refresh
Next
For teller3 = 1 To 10000000
Next teller3


'-----label6-----
For teller = 1 To 50
For teller2 = 1 To 1000000
Next teller2
tall = Int(Rnd * 10)
Label6 = tall
Refresh
Next


'-----riktig or not-----
resultat = Label1 & Label2 & Label3 & Label4 & Label5 & Label6
If resultat = Label7 Then
   MsgBox "YEAH du gjettet riktig!", vbOKOnly, "GRATTIS FFS!"
   Else: MsgBox "Beklager, du gjetta feil.", vbOKOnly, "Beklager..."
End If
End Sub
Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Command3_Click()
Label1 = "-"
Label2 = "-"
Label3 = "-"
Label4 = "-"
Label5 = "-"
Label6 = "-"
Label7 = ""
End Sub

Ny_WinZip_File.zip

Lenke til kommentar

Dere har sikkert ikke vært innom API-programmering enda, men jeg vil sterkt anbefale å heller benytte Sleep funksjonen i tilfeller der en midlertidig skal utsette eksekveringen. Denne metoden forbruker minimalt med CPU, som konstrast til løkkemetoden hvilket opptar hele 100% av CPU-forbruket. Denne metoden er heller ikke spesielt vanskelig å forstå. Alt du behøver å gjøre, er å legge til følgende linje øverst i koden (nedenfor Option Explict, dog, dersom dette er første linje):

 

Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

 

For å vente i eksempelvis 1000 milllisekunder - ett sekund - kan du inkludere følgende kode:

 

Sleep 1000

 

Ellers har jeg ikke noe særlig å utsette på koden. Det er bra laget, tatt i betrakning at du kun har hatt opplæring i VB i kun 2 uker, og at dette utelukkende skulle være utgangspunktet for programmeringen.

 

Det var dog kanskje en tanke for vanskelig å gjette tallet? Med et sekssifret tall (inkludert "000000"), gir jo dette sannsynligheten 1/1000000 for å gjette riktig.

 

 

For øvrig har jeg i den siste tiden også laget noe som jeg ønsker å dele med dere. Et Yazty-spill med det mål å implementere så meget funksjonalitet så mulig uten å ødelegge oversikten. Det har støtte for dynamiske spillvarianter, hvilket du kan lage nye uten å rekompilere prosjektet, samt støtte for nettverksspilling. Spillet kan hentes her.

 

EDIT: Link reparert.

Endret av aadnk
Lenke til kommentar

har funnet noen bugs der

 

for eksempel: når man har f.eks. 5 femmere, og velger 3 like, får man summen av alle femmer'ne.

 

også, har man f.eks. 2 toere og 2 femmere, og velger 1 par, tar den ikke nødvendigvis de 2 femmer'ne, som man selvfølgelig hadde valgt.

 

dessuten hadde vi trøbbel med nettverksspill. det fungerte ikke.

Lenke til kommentar

Takk for at du tok deg tid til å beta-teste spillet. Det hjelper svært mye.

 

Flesteparten av de nevnte problemene er nå reparert, men jeg er usikker på hva som forårsaket problematikken vedr. nettverksspillingen. Kan hende anførte dere ikke noe navn i "Name"-tekstboksen på verken server eller klient. Jeg har nå i hvert fall umulggjort dette ved å sjekke for om hvorvidt tekstboksen er tom eller ikke, og ikke akseptere tilkoblingen dersom den er tom.

Lenke til kommentar

vi teste litt på skolen, det programmet du har lagd kommer til å bli flittig brukt i de timer vi kjeder oss (går IKT som sagt, har dermed PC hele tiden)

 

vi fikk laget server, og de andre fikk connectet. vi lagde alle en bruker hver, og jeg(server) trykket på start.

det som skjedde da var at jeg fikk opp en hel fin rute, og kunne spille. men de andre fikk bare en mini-versjon av ruta, bare de 2-3 første cm'ene på toppen. ellers kommuniserte dem da, fordi jeg kunne bli ferdig med mitt, så lyste det gult på dem når det var dems tur.

 

mulig vi ikke har forstått helt?

 

edit

 

har du oppdatert linken med den nye versjonen?

Endret av Dimensionx
Lenke til kommentar
har du oppdatert linken med den nye versjonen?

Det har jeg.

 

Jeg har faktisk opplevd dette problemet selv, men jeg løste det ved å implementere en filoversender som sendte spillfilen over til alle klientene. Det kan være problemet ligger er - at dette rett og slett ikke fungerer skikkelig. I så fall vil det hjelpe å manuelt kopiere GTP-filene i spillmappen. Disse MÅ ligge i samme mappe som EXE-filen for både server og klient.

 

Jeg skal i hvert fall gå dette problemet nærmere i sømmene for å avgjøre om det er filoversendingen som feiler.

 

Edit: Det ser ikke ut som om filoverføringen svikter. Kanskje hjelper det at dere prøver den nye versjonen istedenfor?

Endret av aadnk
Lenke til kommentar
vi kjører den eneste exe filen som er der, den som ligger i binary mappa. har også prøv å flytte denne over til root mappa, men da får alle problemet med et lite vindu når man skal teste nettverksspill.

Poenget mitt er at EXE-filen må kjøres ifra en mappe med skriverettigheter, samt alle filene som originalt er inkludert med programmet. ZIP-filen skal ekstrakteres og evt. EXE-filer kjøres derifra.

Lenke til kommentar
  • 4 uker senere...

Jeg ser aktiviteten i denne tråden, så vel som resten av forumkategorien, har vært nokså svak den siste tiden. I et forsøk på å friske opp til tider med fordums diskusjoner, reponsgivning og spørsmålsstilling, legger jeg ut ett av mine nyeste prosjekter til vurdering.

 

Jeg har i den siste tiden snekret sammen en HTML/XML-analysator (parser på engelsk) lik MSXML, hvilket etter intensjonen skulle optimaliseres og effektiviseres etter alle kunstens regler - med måtehold naturligvis. Jeg har blant annet verget meg fra å benytte eksterne komponenter, annet enn hva som er inkludert sedvanligvis samt et fåtall deklarasjoner til kjernemodulene i Windows. Helt fra førstningen innså jeg at noe slikt umulig kunne blitt gjennomført med akseptabelt resultat ved hjelp av de innebyggende streng-funksjonene i Visual Basic - de er rett og slett bemerkelsesverdig trege og ineffektive sett i lys av andre metoder (sammenlikninger i ytelse her). Selvsagt har programmererene bak disse funksjonene tatt hensyn til all verdens mulige oppsett på alskens datamaskiner, men dersom en behøver konkurransedyktig hastighet, er så avgjort ikke dette å velge.

 

Jeg har etter beste evne arbeidet i henhold til DOM-spesifikasjonene til Verdensvevkonsortiumet (World Wide Web Consortium), men på enkelte området kommer koden for kort. Eksempelvis har jeg ennå ikke implementert støtte for namespace, hvilket er hovedårsaken til at jeg ikke kan kalle dette som en fullverdig XML-analysator. Ei heller har jeg navngitt funksjonene og egenskapene til de forskjellige klassemodulene fullstendig etter standarden, idet de begynner med stor bokstav (av gammel vane). Forhåpentligvis vil ikke dette spille altfor stor rolle ved anvendelse av komponentene i andre programmeringsspråk; Visual Basic er på en annen side ikke versalsensitiv, og påvirkes således ikke av dette faktum.

 

For å forenkle uttestingen av komponentene, har jeg òg lagt ved en testapplikasjon; bemerk at dette programmet kun tester avlesningsfunksjonaliteten - dersom du skal teste hvorledes analysatoren håndterer endring og lagring av XML-/HTML-filer, må dette gjøres utenom. Som tidligere nevt, skulle den følge DOM-spesifikasjonene, noe som fører til at komponenten i så måte er veldokumentert. Da burde det heller ikke være særlig problematisk å teste ut andre aspekter av analysatoren.

 

Bemerk at tidtageren returerer et feilaktig nummer for første gang etter applikasjonen har startet. Det er ikke før man har klikket igjen, at den reelle tiden vises.

 

Dere kan finne analysatoren samt test-applikasjonen vedlagt i dette innlegget. Jeg vil sette stor pris på kritikk. Takk på forhånd. :thumbup:

 

Edit: Nok en gang måtte jeg oppdatere prosjektet grunnet feilaktige referanser. Akk!

HTML.zip

Endret av aadnk
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...