04. september 2003 - 15:24Der er
48 kommentarer og 1 løsning
automatisk tidtagning/stopur
Jeg sidder her med et program hvor jeg gerne vil tage tid ved hjælp at et stop ur, uret skal starte når der bliver klikket på start/når programmet starter og uret skal stoppe når programmet automatisk stopper.
Saa skal du have lagt en timer paa din form til at starte med. Timer eventen holder str paa optaellingen paa dit ur mens din start og stop knap sjovt nok starter og stopper timer-eventen :-)
Overchord>> jeg har lavet det hele i forvejen jeg mangler bare lige koden - har lave denne funktion før det er bare ved at være LÆNGE! siden så jeg kan ikke lige helt huske koden (og hvor koden indsættes)
Sub Button1_Click Tid=0 Timer1.Enabled=True End Sub
Sub Timer1_Timer Tid=Tid+1 End Sub
Og så skal du blot sætte en værdi i Timer controllen til at være 1000 millisekunder=1 sekund...har ikke Visual Basic på denne maskine, så kan ikke huske hvad den hedder, og er heller ikke sikker på at det hedder Button1_Click, men hvis du dobbeltklikker på de forskellige dele, får du jo automatisk de rigtige Subs :-)
Den timerfunktion (stopur) som jeg skal bruge skal starte når jeg trykker start, stoppe når programmet stopper og køre videre hår jeg aktiverer så programmet kører videre. funktionen skulle gerne kunne stoppe automatisk når programmet stopper men også gerne blive manuelt stoppet (ved at trykke stop)
Jeg tror så småt brikkerne er ved at falde på plads. Du vil slet ikke have et stopur som et selvstændigt program/form, men derimod som en del af et andet program du er ved at lave eller hva?
Og når du siger, når programmet stopper, mener du så når programmet afsluttes med f.eks. Alt+F4, eller blot når det mister fokus?
storbytossen>> du har stortset forstået havd det er jeg gerne vil have lavet.
Ja det skal være en del af et eksisterende program. Med programmet stopper mener jeg at, når jeg klikker start så køres en form for løkke og programmet stopper først når det er gået i nul.
Kort sakt - jeg har markeret x felter og klikker derefter start, så genererer programmet ud fra specificerede regler at der skal markeres flere felter ellser slettes. programmet stopper når der er 0 felter markeret og her stal stopuret automatisk stoppe
Lige et hurtigt indspark i denne tråd - hvis du skal bruge stopuret som et stopur (og nøjagtighed derfor er vigtig) så skal du IKKE bruge de indbyggede timere i VB - de er nemlig upræcise.... Du kan i stedet med fordel bruge computerens tick-count i stedet.
har du smidt "dim Tid as long" ud af Form_loaden, hvis det står derinde er "Tid" kun eksitererne i form load, den skal øverst oppe i dit modul, det er der for du for en fejl melding i "Timer1_Timer"
og her er tick-count 'In general section Private Declare Function GetTickCount& Lib "kernel32" () Private Sub Form_Load() 'KPD-Team 1998 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net 'Get the tickcount ret& = GetTickCount& MsgBox Str$(ret& / 60000) + " minutes." End Sub
Okay...jeg tager det her fra mit hoved, så jeg er ikke 100% sikker på om det vil virke, men here goes nothing:
Du har jo en event, når du trykker på Start knappen, noget i stil med Command1_Click, Start_Click eller hvad du har valgt at kalde din Start knap. Under den event skal de følgende 2 linjer være de første.
Timer1.Enabled=True StartTid=Timer1.Timer
Så må du jo også have et sted, hvor du tjekker på om der er 0 felter markeret, og der hvor du tjekker det, skal du, såfremt der er 0 felter markeret, indføre de følgende 2 linjer.
Timer1.Enabled=False Tid=Timer1.Timer-StartTid
Og så skal du naturligvis huske at deklarere variablerne aller øverst i dit kode vindue. Dvs.
Dim StartTid as Long Dim Tid as Long
Jeg ved så ikke, om Long ville være det bedste, og jeg er sandt at sige en smule usikker på hvorvidt det i det hele taget har noget at gøre med en timer, når man skal lave dette...men jeg puslede selv med dette, da jeg i sin tid studerede Datalogi på HF, og det er den viden, jeg prøver at ihukomme nu ;-)
For øvrigt aner jeg slet slet ikke om Timerne er så upræcise, og om Tickcounts er bedre...så den del blander jeg mig slet ikke i ;)
Stadigvæk - det derjer ig om at få startet og stoppet et stopur. Det er blevet forklaret helt korrekt. Hvor i hans kode han så vil starte og stoppe må han vel selv bedst kunne finde ud af..?
Nok om det, jeg skal ikek tilføje flere indlæg til en de mange der er i forvejen :-D
Såfremt din timer control faktisk HEDDER Timer1 (hvis den ikke gør det, kan det meget nemt være problemet ;-), ja, så formoder jeg lidt, det er fordi Timer slet ikke er en event eller hvad det korrekte ord nu er, for en Timer control, og i så fald, så rækker min hukommelse ikke længere :(
Hmm...jeg hader når der faktisk findes oversigter over den slags, men jeg ikke kan finde dem :-p
Og jeg er lige kommet i tanke om at Timer jo skal bruges som Timer1_Timer, altså som event...derfor er der ikke noget, der hedder Timer1.Timer...så det må være en anden metode, jeg har tænkt på :(
Måske kan i bedre fatte det hele, når i ser program koden, som den er på nuværende tidspunk.
storbytossen>> koden er indeholdende dine forslag (09:45:09)
Option Explicit Dim StartTid As Long Dim Tid As Long Dim hvid, sort, blå As Long Const bredde = 24 Private Sub Command1_Click() Timer1.Enabled = True StartTid = Timer1.Timer 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 Command2_Click() MsgBox "LIV – Spil Forklaring: De otte felter omkring et givet felt kaldes feltets naboer - En brik, som har to eller tre nabobrikker overlever til næste generation - 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"
End Sub
Private Sub Form_Load() Dim lodret, vandret, feltID As Integer hvid = RGB(255, 255, 128) sort = RGB(0, 128, 0) blå = RGB(0, 0, 128) 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 - bredde).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 (AntalLevendeNaboer = 3))) _ Or ((Not ILiveNu) And (AntalLevendeNaboer = 3)) End Function Private Sub Generation() 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 * bredde) + vandret lblFelt(feltID).Tag = _ IIf(lblFelt(feltID).BackColor = hvid, True, False) Next Next End Sub
Private Sub Timer1_Timer() Timer1.Enabled = False Tid = Timer1.Timer - StartTid End Sub
cyberspace: Ikke for at træde nogen over tæerne, men en god ide ville nok være at sætte sig godt ind i VB før man begynder at programmere. Der er masser af tutorials og bøger om emnet. Og nej, det er IKKE for at være belærende og spille smart, det er et oprigtigt velment råd - den tid der går med at sætte sig godt ind i VB kommer 10 gange igen når man programmerer, og ikke skal bruge en formiddag på at få fx. en timer til at virke...
storbytossen>> nej ikke fra en gul bog jeg har kigget i start med visualBasic 6.0 og er ved at lave nogle tilføjelser
martin moth>> jeg vil selvfølgelig give dig ret, har før arbejdet en del med VB men det er ved at være ret længe siden, så der er lige nogle elementer/ting jeg lige skal have genopfrisket
cyberspace, såvidt jeg lige kan se, beder du den fortsætte imens Command1.Caption="Stop", men du tjekker ikke noget sted på hvorvidt Tag for alle dine labels er False, altså om du, som du nævnte, har opnået at der er 0 felter markeret...det vil resultere i en uendelig løkke...en lidt skidt ting ;)
Det, at du har sat
Timer1.Enabled = False Tid = Timer1.Timer - StartTid
ind i Timer1_Timer, gør jo at hver gang Timer controllen udføres (dvs hvert sekund), så får du en Tid...og det er jo ikke meningen :)
Et eller andet sted skal du tjekke hvorvidt 0 af dine Tags er markeret, og hvis det er tilfældet skal du så angive denne linje
Tid = Timer - StartTid
Så vidt jeg har kunnet se, behøves Timer controllen slet ikke...den er jo sådan set også mere til at udføre en eller anden funktion eller lignende med et bestemt interval :)
Timer-kontrollen har ikke en property der hedder ".Timer"
Læs nu de links om Timer-kontrollen og prøv at lær hvordan den virker...
Du kan ALTID se hvilke methods, properties, ... et objekt eller en kontrol har ved at skrive kontrollen/objektets navn efterfulgt af et punktum. VB foreslår selv alle tilgængelige methods/properties... osv. Således kan du se, at der ikke findes en .Timer property på din kontrol...
martin_moth, jeg ved ikke om det er henvendt til mig eller til cyberspace, men uanset hvad.
Windows lader til at have en funktion, der kan bruges i VB, og som bare hedder Timer...og hvis det er tilfældet, behøver han som jeg også skrev 05/09-2003 10:51:38 slet ikke at bruge Timer controllen :)
Jeg har i øvrigt lavet alle mine VB-programmer så der er en lille tæller, der hele tiden fortæller hvor lang tid programmet har været tændt - koden fylder 3 linier og bruger en timer, og min poiente er, at det kan betale sig lige at lære lidt om Timer-objektet før man forsøger at bruge det (henvendt til cyberspace, og stadig i den allermest venlige tone :o)
martin moth>> syntes lige at jeg vil nævne at jeg saktens kan lave og bruge en selvstændig timer funktion, ur/stopur ogl. Men denne timer her er lidt mere kompliceret at få til at funke
storbytossen>> da du er den der har kommet med det mest brugbare, så vil jeg tildele dig point, selv om jeg ikke har fået den ønskede funktion til helt at funke som jeg havde ønsket.
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.