Avatar billede cyberspace Nybegynder
03. september 2003 - 14:14 Der er 25 kommentarer og
2 løsninger

Hvorfor virker dette program/denne kode ikke efter hensigten

Jeg sidder her og arbejder på et program som i sin oprindelse hedder liv (minder lidt om minestryger)

Jeg har oprettet en form hvor jeg har en knap ved navn start (command1)
samt en label (lblfelt) som udgør felterne.

meningen med programmet:
-De otte felter omkring et givet felt kaldes feltets naboer
-En brik, som har to eller tre nabobrikker overlever til næste generation.
-En brik, som har fire eller flere naboer, dør på grund af overbefolkning og bliver fjernet.
-En hver brik som kun har én nabo, dør af mangel på støtter.
-I et hvert tomt felt, som har tre – og kun tre- naboer, sker der en fødsel og der placeres en brik i næste generation.

koden
Dim hvid, sort As Long
Const bredde = 10
Private Sub Command1_Click()
  If Command1.Caption = "start" Then
    Command1.Caption = "Stop"
    Do While Command1.Caption = "Stop"
        'Generation
        DoEvents
      Loop
    Else
      Command1.Caption = "Start"
    End If
End Sub
Private Sub Form_Load()
Dim lodret, vandret, feltID As Integer
  hvid = RGB(255, 255, 128)
  sort = RGB(0, 128, 0)
  For lodret = 1 To bredde
    For vandret = 1 To bredde
    feltID = (lodret * bredde) + vandret
      Load lblFelt(feltID)
      lblFelt(feltID).Move lodret * _
      lblFelt(feltID).Width, _
      vandret * lblFelt(feltID).Height
      lblFelt(feltID).BackColor = sort
      lblFelt(feltID).Tag = False
      lblFelt(feltID).Visible = True
    Next
  Next
  End Sub

Private Sub lblFelt_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then  'Venstre Knap
    lblFelt(Index).BackColor = hvid
    lblFelt(Index).Tag = True
  End If
  If Button = 2 Then  'Højre knap
      lblFelt(Index).BackColor = sort
      lblFelt(Index).Tag = False
    End If
End Sub

Function FeltOverlever(lblID As Integer) 'Funktion header
Dim AntalLevendeNaboer As Integer
Dim ILiveNu            As Integer
  ILiveNu = lblFelt(lblID).Tag = True
  AntalLevendeNaboer = 0
' Test de felter ovenover
If lblFelt(lblID - (bredde + 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID - brede).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID - (bredde - 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
' Test de to felter på hver sin side af det aktuelle felt
If lblFelt(lblID - 1).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID + 1).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
' Test de tre felter nedenunder
If lblFelt(lblID + (bredde - 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID + bredde).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID + (bredde + 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
'Funktion Retunerer True eller False
FeltOverlever = (ILiveNu And _
  ((AntalLevendeNaboer = 2) _
  Or (AnmtaslLevendeNaboer = 3))) _
  Or ((Not ILiveNu) And (AntalLevendeNaboer = 3))
End Function
Private Sub Generarion()
Dim lodret, vandret, feltID As Integer
  'Tegn overlevende felter
  For lodret = 2 To (bredde - 1)
    For vandret = 2 To (bredde - 1)
    feltID = (lodret * bredde) + vandret
    lblFelt(feltID).BackColor = _
    IIf(FeltOverlever(feltID), hvid, sort)
    Next
  Next
  'opdater True-properties
  For lodret = 2 To (bredde - 1)
    For vandret = 2 To (bredde - 1)
      feltID = (lodret * brede) + vandret
      lblFelt(feltID).Tag = _
        IIf(FeltOverlever(feltID).BackColor = hvid, True, False)
          Next
        Next
      End Sub
     
     
       
det er så meningen at man starter programmet tegner (markerer) et mønster af firkanter og så trykker man på start knappen for at se hvad der sker.  MEN HVORFOR SKER DER IKKE NOGET?????
Avatar billede bennytordrup Nybegynder
03. september 2003 - 14:19 #1
Hvis dette

Private Sub Command1_Click()
  If Command1.Caption = "start" Then
    Command1.Caption = "Stop"
    Do While Command1.Caption = "Stop"
        'Generation
        DoEvents
      Loop
    Else
      Command1.Caption = "Start"
    End If
End Sub

er den komplette implementation af knappens klik-event, kan jeg godt forstå det. Du beder bare programmet om at lade andre programmer komme til. Dit program udfører ikke noget.
Avatar billede bennytordrup Nybegynder
03. september 2003 - 14:20 #2
Generation-kaldet er udkommenteret.
Avatar billede m_skau Nybegynder
03. september 2003 - 14:22 #3
I
  Private Sub Command1_Click()
har du udkommenteret kaldet til Generation

I deklarationen af Generation har du stavet det forkert
  Private Sub Generarion
Der skal stå
  Private Sub Generation
Avatar billede vbcoder Nybegynder
03. september 2003 - 14:30 #4
jeg kunne måske foreslå en option explicit i toppen af koden for at fange når man staver forkert ;-)

//vbcoder
Avatar billede cyberspace Nybegynder
03. september 2003 - 14:30 #5
End til videre tak for hjælpen, her kan man bare se hvor lidt der skal til før der opstår problemer. Så kom jeg et skridt videre
Avatar billede cyberspace Nybegynder
03. september 2003 - 14:44 #6
når jeg nu kører programmet ser det ud til at virke men jeg får en fejlmeddelelse med følgende: Run-time Error "340":
                            Control array element '2' dons't exist

I koden er det under følgende del af koden: Function FeltOverlever

Følgende linie er markeret
ILiveNu = lblFelt(lblID).Tag = True
Avatar billede martin_moth Mester
03. september 2003 - 14:47 #7
Kræv variabelerklæring (et sted under options). Så vil VB brokke sig når du bruger et variabelnavn, der ikke er erklæret (dvs. hvis du staver forkert...

Eller hav variabelnavne og procedurenavne indeholode et stort bogstav - og når du koder, skriver du med småt. Hvis VB ikke retter til stort, er det fordi den ikke kan genkende variablen/proceduren, og så ved du der er noget galt...
Avatar billede martin_moth Mester
03. september 2003 - 14:49 #8
det er fordi ldlID har værdien "2", men du har ikke et lblID med index 2. Det er jo faktisk det fejlmeddelsen siger :o)
Avatar billede vbcoder Nybegynder
03. september 2003 - 14:58 #9
åbn kode vindue for din form og trykker ctrl+home

indsæt

option explicit

tryk ctrl+f5 for at køre din form så vil den finde dine stavefejl for dig

det svarer til at sætte require variable declaration på et af fanebladene under options

//vbcoder
Avatar billede m_skau Nybegynder
03. september 2003 - 15:03 #10
Det er en stavefejl igen.

Brede står der to steder i stedet for bredde. Find dem selv :)
Avatar billede cyberspace Nybegynder
03. september 2003 - 15:05 #11
Martin moth>> det har jeg forstået men jeg kan ikke lige helt se hvordan jeg retter fejlen.

Skal jeg oprette et kodefelt magen til og så bare kalde de nævnte felter xxx2 osv. eller?
Avatar billede bennytordrup Nybegynder
03. september 2003 - 15:07 #12
cyberspace >> Prøv at gøre som vbcoder foreslår: Indsæt teksten

Option Explicit

øverst i din fil. Når du compiler med ctrl-F5, så vil den brokke sig over de stedder, der står f.eks. brede i stedet for bredde.


Dit problem er den klassiske med stavefejl i forbindelse med variabelnavne.
Avatar billede cyberspace Nybegynder
03. september 2003 - 15:09 #13
vbcoder>> godt forslag
Avatar billede m_skau Nybegynder
03. september 2003 - 15:09 #14
Prøv at skrive Option Explicit allerøverst i din kode, som foreslået 2 gange af vbcoder!
Se hvordan VB derefter brokker sig over de linier, hvor der står brede i stedet for bredde.
Avatar billede martin_moth Mester
03. september 2003 - 15:10 #15
Kontroller oprettet i kontrolarrays har index 0 til antal kontroller - 1...
Avatar billede cyberspace Nybegynder
03. september 2003 - 15:16 #16
Et sidste spørgsmål- for nu funker det, men er det meningen at man kun kan aktivere/køre programmet en gang før at det helt! skal stoppes og så skartes igen for at man kan køre det?
Avatar billede martin_moth Mester
03. september 2003 - 15:23 #17
Køre programmet en gang - hvordan bestemmes det når man er "færdig" med at køre det?

Men jo, du kan hårdt og brutalt afbryde programmet når du vil med "End"

Der er meget religion om hvordan man bedst afslutter et program - du kan jo søge her på eksperten hvis du vil vide en masse om det.

Men

  End

virker :o)
Avatar billede sjh Nybegynder
03. september 2003 - 15:26 #18
jeg har også lavet den i tidernes morgen, og er kommet til at den skal laves sådan:

http://home.get2net.dk/sjh/eksperten/396317/liv.zip
Avatar billede cyberspace Nybegynder
03. september 2003 - 15:26 #19
Kort sakt, det jeg mener er, at når jeg har markeret x felter og trykker på start knappen så kører den programmet og start knappen er blevet til en stop knap og for at marekere felter igen, trykker jeg på stopknappen, som bliver til startknap og jeg kan markere felter igen, men nu skulle jeg jo kunne få programmet til at køre igen ved at trykke på startknappen men NEJ.
Avatar billede martin_moth Mester
03. september 2003 - 15:40 #20
Tror jeg trækker mig...

cyberspace: Er det en kode noget du har kopieret fra et andet sted, som du så forsøger få til at virke som du ønsker..?
Avatar billede cyberspace Nybegynder
03. september 2003 - 15:41 #21
Sjh>> mit virker stort se også som dit jeg har bare det problem at jeg kun kan trykke 1 gang på (i dit program generate knappen) som hos mig er stat knappen

kan desværre ikke se din program kode så jeg lige kunne få rette den irriterende og sidste fejl
Avatar billede m_skau Nybegynder
03. september 2003 - 15:42 #22
Stavefejl igen:
  if Command1.Caption = "start"
skal være:
  if Command1.Caption = "Start"
Et godt råd: Gør sådan her:
  if lcase(Command1.Caption) = "start"
eller lignende i alle streng-sammenlignende if sætninger i dine programmer, det letter dete MEGET, når programmerne bliver mere komplicerede. lcase() og ucase() laver en streng om til hhv. små eller store bogstaver.
Avatar billede bennytordrup Nybegynder
03. september 2003 - 15:44 #23
Eller

if (strcomp(command1.caption, "Start", vbtextcompare) = 0) then
Avatar billede m_skau Nybegynder
03. september 2003 - 15:44 #24
Hov se nu der, jeg lavede jo en stavefejl. Der skulle stå "det letter dette MEGET"

;)
Avatar billede sjh Nybegynder
03. september 2003 - 15:49 #25
cyberspace > hvis du ikke kan åbne den i din vb kan du bare doble klik på frmMain.frm eller åbne den i notepad.
Avatar billede cyberspace Nybegynder
03. september 2003 - 15:52 #26
martin moth>> sur for dig du havde eller fået point
Avatar billede martin_moth Mester
03. september 2003 - 15:57 #27
Du kan da stadig give mig points, hvis du synes jeg har leveret en iddsats, der er points værd.

Jeg har bare på fornemmelsen, at du ikke har skrevet programmet selv, og derfor vil der (sikkert) være 1000 ting at spørge om. Derfor trækker jeg mig ud i tide :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester