Stopwatch

Bespreek het rekenblad
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Stopwatch

Bericht door Benny »

Hallo,

Ik wil graag een stopwatch maken in mijn sheet.

Ik ben bekend met macro's en design mode.

Heeft iemand hier een oplossing voor.

Ik ben al een tijdje aan het surfen maar kan niets bruikbaars vinden.

Groetjes Benny
open office 4.1.3
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Feitelijk heb ik geen idee wat bedoelt wordt met het gevraagde. Maar wanneer ik zoek op het Engelse forum zie ik toch al snel enkele treffers. Probeer op het Engelse forum te zoeken met het bedoelde trefwoord. Wanneer je in het zoekresultaat ook een antwoord treft waar Villeroy aan heeft meegewerkt kom je al snel verder

Wat ook goed zou zijn als je al wat van de resultaten van je werkzaamheden zou tonen. Het zou kunnen dat maar zo iemand dat kan aanvullen.

Ik heb de vraag wat wil je de tijd van opnemen. Werk die vraag eens uit.

Romke
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Re: Stopwatch

Bericht door Benny »

Ik ben met een sheet bezig waar ik wedstrijd resultaten bijhoud.
Ik vul nu handmatig de tijd in, maar wil dat automatisch doen.
Dus met een start knop tijd gaat lopen, finish knop tijd stopt en wordt in een cel geschreven.
Reset knop en tijd wordt weer op nul gezet.

Ik ben al bezig geweest met de tijd in een cel te zetten en even later in een andere cel de tijd te zetten en deze van elkaar afgetrokken.
In principe voldoet dit, maar ik wil een visuele meelopende klok.

Ik heb al op het Engelse forum, maar kan daar niets vinden.
Ik heb wel een voorbeeld gevonden van een countdown klok, maar deze is voor excel geschreven.
Lukt niet om deze code in openoffice te gebruiken.
open office 4.1.3
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Search • Apache OpenOffice Community Forum
Volgens mij staan daar ook iets bij waar je wel wat van kunt maken.

Search • Apache OpenOffice Community Forum

Romke
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Re: Stopwatch

Bericht door Benny »

Ik heb je link bekeken.

Ik kan er helaas geen lopende stopwatch ( klok ) vinden met display in een veld of iets dergelijks.

Soms zie ik een uitvoer naar een MsgBox mesagebox , is dit ook te veranderen naar een cel.
open office 4.1.3
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Search • Apache OpenOffice Community Forum

In dat kleine voorbeeld laat Villeroy veel zien. Het knippert iets maar wanneer je er meer tijd aan gaat besteden dan kan het ook wel beter worden. Met macro's kun je veel veranderen het is nog al moeilijk om het onder de knie te krijgen. Ik vind ook andere voorbeelden. Ik heb ook op dit moment geen idee hoe het te doen.

Nu wordt de berekening gedaan in het werkblad maar met enig moeite kun je ook dat in een macro doen. Je kan dan de zelfde manier gebruiken van adressering. Let wel Villeroy geeft eerst namen aan cellen in een werkblad en gebruikt die namen dan weer in een macro. Je kunt dat zelf ook doen.
PS Het had deze link moeten zijn.
[Calc] Coundown Timer (View topic) • Apache OpenOffice Community Forum
Romke
Bijlagen
countdown.ods
Gemaakt door Villeroy van het Engelse Forum
(15.56 KiB) 161 keer gedownload
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Re: Stopwatch

Bericht door Benny »

Hallo,
De code werkte niet helemaal.
Ik hem aangepast en werkt nu als countdown.
Ik moet countup hebben,maar dat is waarschijnlijk het een en ander aanpassen countup, start, stop en reset.
Dus nog even puzzelen.
Ik denk dat ik hiermee verder kan.
Hulp hierbij is erg welkom.

Aanpassing code

Moest spatie tussen n en time verwijderen naar nTime

De subroutine update werkt niet de waarde van nTime wordt niet doorgegeven. (Via monitor achter gekomen)

Heb de op de plaats van de aanroep gezet.
En ja hoor het werkt.

Aangepaste code.

Code: Selecteer alles

Sub Countdown()
   Doc = ThisComponent
   Sheet = Doc.Sheets(0)
   ' ** Get Limit
   strTime=Sheet.getCellRangeByName("m10").getString()  ' the 1st change point to use a different cell
   nTime=val(strTime)
   nStartTime=Timer
   nNewTime= nStartTime
   Do Until nTime=0
	       Do while nStartTime=nNewTime
	         nNewTime=timer
	       Loop
		      nTime=nTime-1
		      nStartTime=nNewTime
		      rem Update
			      Doc = ThisComponent
				  Sheet = Doc.Sheets(0)
				  Cell = Sheet.getCellByPosition( 12,9)   ' the second change point
				  Cell.string=str(nTime)
	   Loop
   done ' you can get rid of this sub and put something more exciting in.
End Sub

'				Sub Update ()
'				   Doc = ThisComponent
'				   Sheet = Doc.Sheets(0)
'				   Cell = Sheet.getCellByPosition( 12,9)   ' the second change point
'				   Cell.string=str(nTime)
'  				End Sub
Sub done()
   msgbox ("Out Of Time, Sorry",0,"Time UP")
End Sub
open office 4.1.3
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Re: Stopwatch

Bericht door Benny »

Nog een vraagje.

Hoe kan ik een voorgaande macro in loop stoppen met b.v. Button "Stop"(aanroep macro ?)
Starten is geen probleem gewoon de macro aanroepen.
open office 4.1.3
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Ik begrijp niet wat de vraag is. Het is best mogelijk dat je een macro moet maken met enkel het woord end. Kijk in het geplaatste voorbeeld van Villeroy.

PS
Ik heb het voorbeeld van Villeroy iets aangepast.

Romke
Bijlagen
countdownrpg01.ods
Iets aangepast.
(14.61 KiB) 167 keer gedownload
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
eremmel
Berichten: 670
Lid geworden op: di sep 01, 2009 10:11 am
Locatie: Barneveld, Nederland

Re: Stopwatch

Bericht door eremmel »

Benny schreef:Nog een vraagje.

Hoe kan ik een voorgaande macro in loop stoppen met b.v. Button "Stop"(aanroep macro ?)
Starten is geen probleem gewoon de macro aanroepen.
Ik weet niet of je twee macro's parallel kunt draaien (zou wel moeten kunnen als je naar Java gaat, omdat Java multi threading is).
Je kunt de start-macro dan gewoon laten draaien en dan via een stop-macro een 'global variable' omzetten zodat de start-macro stopt met tellen. Je zou dit kunnen testen door te proberen twee keer je start-macro te starten.
W11 21H2 (build 22000), LO 7.4.1.2(x64)
Het is Microsoft marketing die laat geloven dat computers geschikt zijn voor niet technici
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Re: Stopwatch

Bericht door Benny »

Hallo,

Ik denk inderdaad dat het aanroepen van een 2de macro om een ander te stoppen niet mogelijk is.

Er zal waarschijnlijk in de macro iets moeten komen die naar het indrukken van een button kijkt, of misschien naar een cel waar b.v. true of false in staat om de macro te stoppen.

RGP wil je de tekst van de macro op het forum zetten.
Ik kan namelijk het ods form niet openen, oppenoffice slaat dan vast.
open office 4.1.3
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Ik voeg hieronder de code toe. Er zitten nog wel enkele lijnen die ik er later ingevoegd heb. Ik ben aan het experimenteren geweest of ik een string kan toevoegen waar ik ook hondersten kan toe voegen. Het toevoegen van hondersten gaat nog niet.

Romke

Code: Selecteer alles

REM  *****  BASIC  *****
option explicit
' Namen gedefinieerd in het werkblad
const sNaarActieveSpeler="NaarActieveSpeler"
const sSpelers="Spelers" ' Dit is de naam van de lijst spelers


'Variables voor de macro's
dim nNaarActieveSpeler ' Wijst naar het getal wat komt als ik een speler selecteer
dim oSpelers
dim oNamedRanges
Dim Begintijd
dim oTimeSpeler





Sub startCountdown()
oNamedRanges=ThisComponent.NamedRanges
Begintijd=Now 
nNaarActieveSpeler=oNamedRanges.getByName(sNaarActieveSpeler).getReferredCells.getvalue

oSpelers=oNamedRanges.getByName(sSpelers).getReferredCells
oTimeSpeler=oSpelers.getCellByPosition(1,nNaarActieveSpeler-1)


while True
'oTimeSpeler.setvalue(format((now-Begintijd),"HH:MM"))
oTimeSpeler.setvalue(CreateUnoValue( "double", (now-Begintijd)))
'print format((now-Begintijd),"hh:mm:ss.00")
wait 1000

wend
End Sub


Sub stopCountdown()
'oTimeSpeler.setvalue((now-Begintijd))
'oTimeSpeler.setvalue(format((now-Begintijd),"HH:MM"))
	End
End Sub
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
eremmel
Berichten: 670
Lid geworden op: di sep 01, 2009 10:11 am
Locatie: Barneveld, Nederland

Re: Stopwatch

Bericht door eremmel »

Benny schreef: Ik denk inderdaad dat het aanroepen van een 2de macro om een ander te stoppen niet mogelijk is.

Er zal waarschijnlijk in de macro iets moeten komen die naar het indrukken van een button kijkt, of misschien naar een cel waar b.v. true of false in staat om de macro te stoppen.
Dus er kan maar 1 macro draaien. Ik vermoed dat een macro 'modaal' draait: dus of macro krijgt tijd of gebruiker krijgt tijd om iets via UI te doen. Ik zou niet weten of je kunt pollen (kijken op een bepaald event plaats vindt en direct weer terug naar de macro).
Wat je misschien wel zou kunnen gebruiken is een popup vanuit de macro die je moet aanklikken om je timing te stoppen, maar dan heb je geen teller die netjes oploopt.
Misschien dat een macro te stoppen is met Ctrl-C oid, dan moet je in de macro je cel waarde telkens ophogen totdat gebruiker op Ctrl-C drukt zodat de macro gestopt wordt. Ik weet ook niet of je zo'n keyboard event kunt afvangen in een macro.

Je moet voor deze complexiteit echt naar het Engels talige forum.
W11 21H2 (build 22000), LO 7.4.1.2(x64)
Het is Microsoft marketing die laat geloven dat computers geschikt zijn voor niet technici
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Wait in een macro legt gewoon het programma stil en dan kunnen andere macro's wel draaien. Villeroy demonstreert dat in zijn korte voorbeeld. Ik ben alleen zo vriendelijk om dat te kopieren voor Benny. Ik heb dat vroeger ook wel eens gebruikt voor een zoek actie in een macro die ook blijft kijken naar het toetsen bord.

Ik ben het Eremmel eens dat je voor echt diepgaande vragen aangaande macro's beter naar het Engelse forum kunt gaan.

Romke
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Ik ben toch nog een poosje door gegaan met het schrijven van een macro. Feitelijk had Villeroy al een mooi basis idee neergelegd. Ik heb dat wat meer uit gebreid. De verklaringen zitten meer in de macro code. Ik voeg de macro code ook los toe zodat ierdereen het ook gewoon kan lezen.

Romke

Code: Selecteer alles

REM  *****  BASIC  *****
option explicit

' Namen gedefinieerd in het werkblad
const sNaarActieveSpeler="NaarActieveSpeler"
const sSpelers="Spelers" ' Dit is de naam van de lijst spelers

const sLijstTussentijden="LijstTussentijden" ' Dit is de lijst van de ronde tijden
const sRondeTussentijden = "RondeTussentijden" ' Dit is de teller van de ronde tijden


'Taal gevoelige opdrachten
const sCurrenttime="now" ' Voor Engelse versie
'const sCurrenttime="Nu" ' Voor Nederlands



'Variables voor de macro's
'er is een lijst met deelnemers. In die lijst met komt ook de tijd te staan.
'In de macro kan dat gekoppeld wordt met een index.
dim oSpelers

'Uit die lijst wordt een kolom met namen gehaald. Die kolom wordt gebruikt in een
' een cel waar in een keuze is uit die namen.
' In de cel er naast wordt de index van die naam opgezocht.
dim nNaarActieveSpeler ' Wijst naar het getal wat komt als ik een speler selecteer

dim oNamedRanges ' Dit is een service in een spreadsheet.

' Voor klok tijden
Dim BeginTijd 'Dit is de begin waarde van de tijd. Het wordt gebruikt voor een enkele meting
' als ook voor de tussentijden. Het wordt dan aangepast.
dim Huidigetijd 'Wanneer de klok gestopt wordt dan wordt deze tijd in gesteld
'dim Huidigetijd2
dim Cumulatievetijden ' Dit wordt speciaal gebruikt voor tussentijden. Op deze manier kom ik aan de totaal tijd.


' Voor het programma
dim oTimeSpeler
dim oLijstTussentijden
dim oRondeTussentijden
dim oButtonTussentijd

dim fa ' function acces Ik kan nu de tijd met hondersten krijgen

sub main
loadlibraries
end sub


sub Tussentijden(oEvent)
' Maakt het mogelijk om de tijd op tehalen met hondersten
' Take the time as soon as possible
dim temp
temp = fa.CallFunction(sCurrenttime, Array()) ' DuurvanKlok
Huidigetijd=temp 

' we stop the time and search for the time what is cumulatieve
dim tijdje 
if   oEvent.source.model.state  then 
	'if state is true then we handle stop 
	tijdje=(Huidigetijd -begintijd)+ Cumulatievetijden
	oLijstTussentijden.getCellByPosition(0,oRondeTussentijden.getvalue).setvalue(tijdje)
	oRondeTussentijden.setvalue(oRondeTussentijden.getvalue+1)
	oTimeSpeler.setvalue(Huidigetijd-begintijd+ Cumulatievetijden)  ' Set here the time for the player


else 

	' We gaan weer opnieuw timen
	Cumulatievetijden =	oLijstTussentijden.getCellByPosition(0,(oRondeTussentijden.getvalue-1)).getvalue
end if
begintijd = temp
end sub


Sub startCountdown(oEvent)
' Maakt het mogelijk om de tijd op tehalen met hondersten
fa = CreateUnoService("com.sun.star.sheet.FunctionAccess") 
' When you see here an error look at the beginning of the code.
' sCurrenttime must be a good value for your language in spreadsheet
' Wanneer hier een fout is opgetreden kijk er naar dat de sCurrentime is 
' een opdracht voor de huidige tijd in jouw spreadsheet. Maak de verandering alleen boven in deze code
Begintijd = fa.CallFunction(sCurrenttime, Array())

'There we work with variables for the module we init here most variables for the module.
'BASIC is still running as long we pressed the stop button
' There we use the wait statement we can run other subs. while this sub is running.
' The timing does not depends on how much cycles we run. It is calculate from the system timer.
' We read the timer as soon as possible after pressing a button.

Cumulatievetijden=0
' Maakt het mogelijk om de tijd op tehalen met hondersten
' Take the time as soon as possible
'Huidigetijd = fa.CallFunction(sCurrenttime, Array()) ' DuurvanKlok
oNamedRanges=ThisComponent.NamedRanges 'for the service named ranges
oLijstTussentijden=oNamedRanges.getByName(sLijstTussentijden).getReferredCells
oRondeTussentijden=oNamedRanges.getByName(sRondeTussentijden).getReferredCells


if  isempty(oLijstTussentijden)=false then
	' we need to erase 
	oRondeTussentijden.setvalue(0) ' set value on zero
	oLijstTussentijden.clearContents(2) ' delete values
end if


' We start here with a timing so reset the button
oButtonTussentijd=oEvent.source.model.parent.getbyname("Tussentijden")
oButtonTussentijd.reset


nNaarActieveSpeler=oNamedRanges.getByName(sNaarActieveSpeler).getReferredCells.getvalue


oSpelers=oNamedRanges.getByName(sSpelers).getReferredCells ' Pak de lijst van active spelers
oTimeSpeler=oSpelers.getCellByPosition(1,nNaarActieveSpeler-1)

while True
	' We need this
	'beep
	if  oButtonTussentijd.state =false  then 	oTimeSpeler.setvalue(DuurvanKlok)
	wait 100 ' Iedere tiende seconde wordt het getoond. Maar er wordt gemeten in hondersten
wend
End Sub


Sub stopCountdown()
if  isempty(begintijd) = false then
' Timer is running but must be stopped
	if  oButtonTussentijd.state = 0   then
		oTimeSpeler.setvalue(DuurvanKlok) 
	end if
end if

	End ' Here we stop BASIC
End Sub

function DuurvanKlok
dim temp
temp = fa.CallFunction(sCurrenttime, Array())
temp = temp - Begintijd +  Cumulatievetijden
DuurvanKlok = temp 
end function
Bijlagen
countdownrpg06.ods
Iets meer uitgewerkt stopwatch
(20.05 KiB) 163 keer gedownload
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
Benny
Berichten: 14
Lid geworden op: do okt 05, 2017 3:04 pm

Re: Stopwatch

Bericht door Benny »

Hallo Romke,

Je maak er wel veel werk van. Bedankt daarvoor.

Klopt het dat ik op het werkblad geen lopende tijd heb? Dat is wat ik namelijk zoek.
Ik heb al wat werkend, maar loopt alleen met hele seconden.
Ik kan de klok nu stoppen met het vogende

Cel = Blad.getCellByPosition(1, 0) 'Als cel b1 een 1 heeft stopt de macro
if Cel.Value = 1 then end

De retour waarde is helaas ook hele sec en wil deze in honderdsten. In de macro wordt namelijk elke sec een teller opgehoogd. Door gebruik van de functie "timer"

Dat de display klok in hele seconden loopt is niet zo probleem, alleen na stoppen wil ik de tijd in honderdsten.

De echte tijden heb ik voor mekaar met het aftrekken van de Now tijden. Gewoon in de sheet met start en stop macro.

Waar ik nu mee bezig ben is de display klok na het stoppen te overschrijven met de berekende tijd.

Ik ga je programma goed bekijken of ik wat uit kan halen.

Groetjes Ben
open office 4.1.3
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Macro's programmeren in OOo is wat anders dan BASIC code schrijven. Je moet moet voor macro's in OOo een gedegen kennis hebben van de normale werking van OpenOffice. Ook een gedegen kennis van OOo-BASIC is noodzakelijk. maar dat is nog maar eenvoudig. Daarna komt ook nog een goede kennis van de API.

Ik vergeet nog dat kennis over programmeren natuurlijk ook noodzakelijk is. Ik denk dat een paar dagen zoeken op het Engelse forum je meer zal leren dan de code waar je nu mee bezig bent.

Probeer wat te leren van de mensen die kennis,Villeroy, MrProgrammer, hebben en pak niet de slechte voorbeelden van mensen die er zelf niet uitgekomen zijn.

Romke
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Stopwatch

Bericht door RPG »

Ik heb nog wat veranderd. Het laat naar mijn idee nog beter zien waar macro's voor bedoeld zijn. Namelijk het doen van iets kleins wat niet op een normale manier gedaan kan worden en het andere allemaal met standaard opdrachten. Het zou best kunnen dat het geheel wel allemaal op een enkel werkblad gedaan moet. Wel kun je sommige bereiken verplaatsen. Als het bereik van de naam wordt veranderd zal alles waarschijnlijk zonder problemen werken. Wat niet veranderd automatisch kan worden is de positie van de relatieve kolom.

Romke
Bijlagen
countdownrpg10.ods
Nog iets aangepast
(17.78 KiB) 152 keer gedownload
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
Plaats reactie