AutoHotkey Community

It is currently May 27th, 2012, 5:50 am

All times are UTC [ DST ]




Post new topic Reply to topic  [ 19 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Counter looses time
PostPosted: September 2nd, 2010, 2:44 am 
This is a strange situation. I am running this counter next to a stop watch.

It looses time. I mean, it's slower..... Stopwatch registers 1 minute and the counter say 55 seconds. I tried again.

After two minutes the stopwatch said two and counter said 1min 52 seconds. They are started at the same time. The counter program seems to be wrong, it's "loosing time"

Does anybody see why?

It gets exponentially worse as time goes on ....

Code:
Settimer, Stopwatch, 100


Code:
Stopwatch:
IfWinExist, ahk_Group GroupName
  {
  forgiveCount = 0
  timers++
  GuiControl,, MyText, % FormatSeconds(Floor(Timers/10))
  If (WasActive=0)
    {
    WasActive=1
    VarSetCapacity(Text, 100) ;Expand buffer to allow for full Wintext
    WinGetText, Text  ; The window found above will be used.
    RegExMatch( Text, "All\((.*)\)", Res )
    Goto JobType
    }
  }
Else
  {
  forgiveCount++
  if (forgiveCount <10000 )
     {
    If (WasActive=1)
    {
    WasActive=0
    If (kworas = "kw")
    Goto KeywordWrite
    else if (kworas = "as")
    Goto AssetWrite
    else if (kworas = "error")
    return
    }
    timers++
    GuiControl,, MyText, % FormatSeconds(Floor(Timers/10))
    return
    }
  If (WasActive=1)
    {
    Msgbox Why here?
    WasActive=0
    If (kworas = "kw")
    Goto KeywordWrite
    else if (kworas = "as")
    Goto AssetWrite
    else if (kworas = "error")
    return
    }
  }
return


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 4:20 am 
Offline

Joined: March 10th, 2008, 12:55 am
Posts: 1907
Location: Minnesota, USA
settimer documentation:
Quote:
Timer precision: Due to the granularity of the OS's time-keeping system, Period is typically rounded up to the nearest multiple of 10 or 15.6 milliseconds (depending on the type of hardware and drivers installed). For example, a Period between 1 and 10 (inclusive) is usually equivalent to 10 or 15.6 on Windows NT/2000/XP (Windows 9x uses ~55ms). A shorter delay may be achieved via Loop+Sleep as demonstrated at DllCall+timeBeginPeriod+Sleep.

_________________
rawr. be very afraid
*poke*
Note: My name is all lowercase for a reason.
"I think Bigfoot is blurry, that's the problem. It's not the photographer's fault, Bigfoot is blurry. So there's a large, out-of-focus monster roaming the countryside."


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 4:24 am 
tidbit thank you. I read that.

Does that mean there is no way to fix it? :-\


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 5:17 am 
Offline

Joined: March 10th, 2008, 12:55 am
Posts: 1907
Location: Minnesota, USA
Buy a computer that has an atomic clock inside. that would help to the 0.0000000000000001'th of a second.

or try the method linked in the quote. AFAIK, there is not much other ways. try searching the forum.

_________________
rawr. be very afraid
*poke*
Note: My name is all lowercase for a reason.
"I think Bigfoot is blurry, that's the problem. It's not the photographer's fault, Bigfoot is blurry. So there's a large, out-of-focus monster roaming the countryside."


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 5:17 am 
You can get a better elapesed time (likely more accurate than your stopwatch) by using the computer's interal clock.

Simple example:
Code:
F2:: ;         hotkey to start stopwatch
Settimer, Stopwatch, 250
time1 := A_TickCount

StopWatch:
  elapsed := A_TickCount - time1
  elapsed //= 1000
  ToolTip, % elapsed " Seconds"
  return

;            hotkey to stop the stopwatch
F3:: SetTimer, Stopwatch, off


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 5:35 am 
The elapsed time example is good but won't that function poorly for me? My timer starts and stops when a window title changes and it keeps a running count.

Because of the way the new example functions, it would malfunction wouldn't it ?


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 6:26 am 
Ghostie wrote:
The elapsed time example is good but won't that function poorly for me? My timer starts and stops when a window title changes and it keeps a running count.

Because of the way the new example functions, it would malfunction wouldn't it ?
That code is an example of the technique to get the elapesed time between events. The events can be anything you like (i.e. when window titles change).

It is up to you to adapt the technique to your needs.


Report this post
Top
  
Reply with quote  
 Post subject: MM:HH:SS Formatting
PostPosted: September 2nd, 2010, 4:03 pm 
Hello all,

I was recently given new code to change my timer to be more accurate. I have successfully implemented it into the program but now the formatting is off.

My old code would display this is HH:MM:SS with no issue.

Here is what I used before to convert the timer into that format:

Code:
GuiControl,, MyText, % FormatSeconds(Floor(Timers/10))

Code:
FormatSeconds(x)
{
Loop 2 ;make it base 60 with : divider
Out:=SubStr("0" . Mod(x, 60),-1) ":" Out,x:=Floor(x/60)
Out:=x ":" Out ;put remanining hours in the front
Return SubStr(Out,1,-1) ;remove extra
}


That no longer works.

Here is the new timer code, this is the section implemented into the loop:

Code:
  timers := A_TickCount - time1
  timers //= 1000   ;this turns it into seconds, not what i need though



Right now it will only display it in seconds. If i try to pass it through FormatSeconds the result is not good.

Could anyone help?


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 4:17 pm 
from the helpfile on formattime (see example at the boTtom of the page)



Code:
FormatSeconds(NumberOfSeconds)  ; Convert the specified number of seconds to hh:mm:ss format.
{
    time = 19990101  ; *Midnight* of an arbitrary date.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss  ; This method is used to support more than 24 hours worth of sections.
}


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 4:40 pm 
I took a second look at your code and found that the formatseconds you usec is working well so your problem must be in the rest..........

Code:
time1:=A_Tickcount
sleep 10000
timers:=A_tickcount - time1
timers //=1000

gui,add,edit,vmyedit h30 w200
gui,show

guicontrol,,myedit,% formatseconds(timers)

return


FormatSeconds(x)
{
Loop 2 ;make it base 60 with : divider
Out:=SubStr("0" . Mod(x, 60),-1) ":" Out,x:=Floor(x/60)
Out:=x ":" Out ;put remanining hours in the front
Return SubStr(Out,1,-1) ;remove extra
}


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 4:42 pm 
Thank you guest, I implemented the code as follows but it still just displays seconds.

I don't understand.

Code:
GuiControl,, MyText,% FormatSeconds(timers)


Code:
FormatSeconds(NumberOfSeconds)  ; Convert the specified number of seconds to hh:mm:ss format.
{
    time = 19990101  ; *Midnight* of an arbitrary date.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss  ; This method is used to support more than 24 hours worth of sections.
}


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 5:08 pm 
I tested with this:

Code:
timers:=3600+60*5+20

gui,add,edit,vmyedit h30 w200
gui,show

guicontrol,,myedit,% formatseconds(timers)

return

FormatSeconds(NumberOfSeconds)  ; Convert the specified number of seconds to hh:mm:ss format.
{
    time = 19990101  ; *Midnight* of an arbitrary date.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss  ; This method is used to support more than 24 hours worth of sections.
}


That seems to be ok.Maybe you can put a msgbox to see the content of the variable timers when you run your code.

Or if you can post all the programcode to take a look at it?


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 5:31 pm 
Thanks for the reply again.

Here is the code...... (i am still having no luck)

Code:
Settimer, Stopwatch, 250

Stopwatch:
IfWinExist, ahk_Group GroupName
  {
  forgiveCount = 0
  timers := A_TickCount - time1
  GuiControl,, MyText, %timers%
  If (WasActive=0)
    {
    WasActive=1
    VarSetCapacity(Text, 100) ;Expand buffer to allow for full Wintext
    WinGetText, Text  ; The window found above will be used.
    RegExMatch( Text, "All\((.*)\)", Res )
    Goto JobType
    }
  }
Else
  {
  forgiveCount++
  if (forgiveCount <10000 )
     {
    If (WasActive=1)
    {
    WasActive=0
    If (kworas = "kw")
    Goto KeywordWrite
    else if (kworas = "as")
    Goto AssetWrite
    else if (kworas = "error")
    return
    }
    timers := A_TickCount - time1
    GuiControl,, MyText,% FormatSeconds(timers)
    return
    }
  If (WasActive=1)
    {
    Msgbox Why here?
    WasActive=0
    If (kworas = "kw")
    Goto KeywordWrite
    else if (kworas = "as")
    Goto AssetWrite
    else if (kworas = "error")
    return
    }
  }
return

FormatSeconds(NumberOfSeconds)  ; Convert the specified number of seconds to hh:mm:ss format.
{
    time = 19990101  ; *Midnight* of an arbitrary date.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss  ; This method is used to support more than 24 hours worth of sections.
}


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 5:55 pm 
I cannot test it because this code is just a part.


But i see there is still in line8:

GuiControl,, MyText, %timers%

so that will give just seconds

Is the position of the label stopwatch correct?there seems to be no return before it .


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: September 2nd, 2010, 6:10 pm 
Alright, sorry about that, I was trying to simplify. Here is the entire code..........

Code:
#SingleInstance force

CoordMode, Mouse, Screen

;Shutdown Detection
OnMessage(0x16,"ExitFunc")

ExitFunc(wParam,lParam)
{
 Msgbox we are shutting down
}
;Save everything here and clear crash state for clean down.


;Startup Recovery Function

IniRead,CloseState,settings.ini,General,CloseState

IfNotInString, CloseState, Normal

CrashRecovery := "1"
IniWrite,0,settings.ini,General,CloseState
;Startup Recovery Function

;Last Log Clear Check
IniRead,LastLogReset,settings.ini,General,LastLogReset
IniRead,FirstRun,settings.ini,General,FirstRun
If FirstRun = 1
{
IniWrite,%A_YDay%,settings.ini,General,LastLogReset
IniWrite,0,settings.ini,General,FirstRun
MsgBox, 4, , This is your first time running  Timer.`nIt is highly recommended that you watch the tutorial presentation.`n`nWould you like to learn how to use  Timer now?
IfMsgBox Yes
    {
    Run, Help.html
}
}

Else
{
IniRead,LastLogReset,settings.ini,General,LastLogReset
LastCheck := LastLogReset+30
If (LastCheck < A_YDay)
{
MsgBox, 4, , Your Work Log hasn't been cleared in 30 days or more!`nThis file may take up extra space on your computer.`nIt is not necessary to clear it if you do not want to.`nIf you do not need prior work history anymore it is recommended you clear it.`nWould you like to clear the work history now?
IfMsgBox Yes
    {
     FileDelete,log.html
     FileAppend,`n<html>,log.html
     FileAppend,`n<head>,log.html
     FileAppend,`n<Title> Timer Work History</title>,log.html
     FileAppend,`n</head>,log.html
     FileAppend,`n<body>,log.html
     FileAppend,`n<center><h2> Timer History</h2></center>,log.html
     FileAppend,`n<br><br>,log.html
     IniWrite,%A_YDay%,settings.ini,General,LastLogReset
     Msgbox Work history has been cleared!
}
Ifmsgbox No
    Msgbox History will not be deleted.`nYou will not be prompted again in the next 30 days.
}
}

;Last Log Clear Check

;Last Clear Check
IniRead,LastReset,settings.ini,General,LastReset
LastTime := LastReset-A_WDay
If LastTime > 0
{
IniWrite,0,settings.ini,StatsKW,1
IniWrite,0,settings.ini,StatsKW,2
IniWrite,0,settings.ini,StatsKW,3
IniWrite,0,settings.ini,StatsKW,4
IniWrite,0,settings.ini,StatsKW,5
IniWrite,0,settings.ini,StatsKW,6
IniWrite,0,settings.ini,StatsKW,7
IniWrite,0,settings.ini,StatsAS,1
IniWrite,0,settings.ini,StatsAS,2
IniWrite,0,settings.ini,StatsAS,3
IniWrite,0,settings.ini,StatsAS,4
IniWrite,0,settings.ini,StatsAS,5
IniWrite,0,settings.ini,StatsAS,6
IniWrite,0,settings.ini,StatsAS,7
IniWrite,0,settings.ini,StatsTime,1
IniWrite,0,settings.ini,StatsTime,2
IniWrite,0,settings.ini,StatsTime,3
IniWrite,0,settings.ini,StatsTime,4
IniWrite,0,settings.ini,StatsTime,5
IniWrite,0,settings.ini,StatsTime,6
IniWrite,0,settings.ini,StatsTime,7
IniWrite,%A_WDay%,settings.ini,General,LastReset
}
;Last Clear Check

;BEGIN FUNCTION DEFINE
/*
WinGet_Click_Through - Checks if a window is unclickable.

I - ID of the window to set as unclickable.

If the window ID doesn't exist, it returns -1.
*/

WinGet_Click_Through(I="") {
   If(I == "" || I == "A")
      I := WinExist("A")
   IfWinNotExist, % "ahk_id " I
      Return -1
   WinGet, S, ExStyle, % "ahk_id " I
   If (S & 0x80000 && S & 0x8 && S & 0x00000020)
      Return True
   Else
      Return False
}

/*
WinSet_Click_Through - Makes a window unclickable.

I - ID of the window to set as unclickable.

T - The transparency to set the window. Leaving it blank will set it to 254. It can also be set On or Off. Any numbers lower then 0 or greater then 254 will simply be changed to 254.

If the window ID doesn't exist, it returns -1.
*/

WinSet_Click_Through(I="", T="255") {
   If(I == "" || I == "A")
      I := WinExist("A")
   IfWinExist, % "ahk_id " I
   {
      If (T == "Off")
      {
         WinSet, AlwaysOnTop, Off, % "ahk_id " I
         WinSet, Transparent, Off, % "ahk_id " I
         WinSet, ExStyle, -0x20, % "ahk_id " I
      }
      Else
      {
         WinSet, AlwaysOnTop, On, % "ahk_id " I
         If(T < 0 || T > 255 || T == "On")
            T := 255
         WinSet, Transparent, % T, % "ahk_id " I
         WinSet, ExStyle, +0x20, % "ahk_id " I
      }
   }
   Else
      Return 0
}
;END FUNCTION DEFINE

;STARTUP ROUTINE
IniRead,DisplayColor,settings.ini,General,Displaycolor
IniRead,SetColor,settings.ini,General,Setcolor
IniWrite,v2.1,settings.ini,General,Version ;write version number

Menu, tray, add, Settings, MSettings
Menu, tray, add, History, MHistory
Menu, tray, add, About, MAbout
Menu, tray, add, Stats, MStats
Menu, tray, add, Help, MHelp 
Menu, tray, add, Exit, ExitSub
Menu, Tray, NoStandard
Menu, Tray, Tip,  Timer


SysGet, ScreenWidth, 61
SysGet, ScreenHeight, 62
posx := ScreenWidth/2-78

WasActive=0
hrfix=1
;END STARTUP ROUTINE

GroupAdd, GroupName , Editorial Verification Desktop - [Entity review - Keyword]
GroupAdd, GroupName , Editorial Verification Desktop - [Entity review - Text asset]
;GroupAdd, GroupName, Untitled - Notepad

CustomColor = %Setcolor% 
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, Color, %CustomColor%
Gui, Font, s18 
Gui, Add, Text, vMyText %DisplayColor%,0:00:00
Gui, Show,  x%posx% y-17 NoActivate, Timer
ID := WinExist()
WinSet_Click_Through(ID, "On")
WinSet, TransColor, %CustomColor% 150

;Recovery Mode
If (CrashRecovery = "1")
{
IniRead,RecoveryTime,settings.ini,General,AutoSave
IniRead,RecoveryKW,settings.ini,General,AutoSaveKW
IniRead,RecoveryAS,settings.ini,General,AutoSaveAS
timers := RecoveryTime
Msgbox  Timer was not shutdown properly on last usage.`nThis could be caused by a computer crash or forced shutdown`nTo avoid this in the future shutdown  timer by closing it properly.`nTimer automatically saves data every 3 minutes.`nTimer will now automatically restore.
}
;Revodery Mode

Settimer, Stopwatch, 250
time1 := A_TickCount
Settimer, AutoSave, 180000
Settimer, HourFix, 30000
Return

;Correct Stats so this saves to previous day and doesn't merge at midnight


HourFix:
If (hrfix = 1)
{
If (A_Hour = 05)
{
   If (A_Min = 42)
   {
   IniRead,kwcountfinal,settings.ini,StatsKW,%A_WDay%
   IniRead,ascountfinal,settings.ini,StatsAS,%A_WDay%
   IniRead,timersfinal,settings.ini,StatsTime,%A_WDay%
   kwcountfinal +=kwcount
   ascountfinal +=ascount
   timersfinal +=timers
   IniWrite,%kwcountfinal%,settings.ini,StatsKW,%A_WDay%
   IniWrite,%ascountfinal%,settings.ini,StatsAS,%A_WDay%
   IniWrite,%timersfinal%,settings.ini,StatsTime,%A_WDay%
   timers := 0
   hrfix := 0
   }
}
WinSet, Top,, Timer
Return
}


AutoSave:
IniWrite,%timers%,settings.ini,General,AutoSave
IniWrite,%kwcount%,settings.ini,General,AutoSaveKW
IniWrite,%ascount%,settings.ini,General,AutoSaveAS
return

Stopwatch:
IfWinExist, ahk_Group GroupName
  {
  forgiveCount = 0
  timers := A_TickCount - time1
  GuiControl,, MyText,% FormatSeconds(timers)
  If (WasActive=0)
    {
    WasActive=1
    VarSetCapacity(Text, 100) ;Expand buffer to allow for full Wintext
    WinGetText, Text  ; The window found above will be used.
    RegExMatch( Text, "All\((.*)\)", Res )
    Goto JobType
    }
  }
Else
  {
  forgiveCount++
  if (forgiveCount <10000 )
     {
    If (WasActive=1)
    {
    WasActive=0
    If (kworas = "kw")
    Goto KeywordWrite
    else if (kworas = "as")
    Goto AssetWrite
    else if (kworas = "error")
    return
    }
    timers := A_TickCount - time1
    GuiControl,, MyText,% FormatSeconds(timers)
    return
    }
  If (WasActive=1)
    {
    Msgbox Why here?
    WasActive=0
    If (kworas = "kw")
    Goto KeywordWrite
    else if (kworas = "as")
    Goto AssetWrite
    else if (kworas = "error")
    return
    }
  }
return

FormatSeconds(NumberOfSeconds)  ; Convert the specified number of seconds to hh:mm:ss format.
{
    time = 19990101  ; *Midnight* of an arbitrary date.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss  ; This method is used to support more than 24 hours worth of sections.
}

KeywordWrite:
currcount= % Res1
kwcount +=currcount
totalkwjobs++
;Msgbox Added %Res1% KW JOBS`nTotal KW:%kwcount%`nTotal KW JOBS %totalkwjobs%
Return

AssetWrite:
currcount= % Res1
ascount +=currcount
totalasjobs++
;Msgbox Added %Res1% AS JOBS`nTotal Assets:%ascount%`nTotal AS JOBS %totalasjobs%
Return

JobType:
IfWinExist, ahk_Group GroupName
WinActivate
WinGetTitle, Title, A
IfInString,Title,Keyword
kworas := "kw"
Else IfinString,Title,Asset
kworas := "as"
Else
kworas := "error"
Text := 0
Return

MHelp:
Run,Help.html
Return

MHistory:
Run,Log.html
Return

MAbout:
Run,About.exe
Return

MStats:
IniWrite,%kwcount%,settings.ini,StatsKW,T
IniWrite,%ascount%,settings.ini,StatsAS,T
IniWrite,%timers%,settings.ini,StatsTime,T
IniWrite,1,settings.ini,General,TempStats ;So that stats knows to use Temps
Run,Stats.exe
Return

MSettings:
Run,Settings.exe
Return


`::
While GetKeyState("``","p")
{
MouseGetPos, XPos, YPos
WinMove,  Timer,, XPos-30, YPos-25
}
Return

ExitSub:
If timers < 599
{
Msgbox Time worked was less than one minute.`n Timer will not save this to the work history.
IniWrite,Normal,settings.ini,General,CloseState ;crash prevention
IniWrite,0,settings.ini,General,AutoSave ;crash prevention
IniWrite,0,settings.ini,General,AutoSaveKW ;crash prevention
IniWrite,0,settings.ini,General,AutoSaveAS ;crash prevention
ExitApp
}

IniRead,RatePerHour,settings.ini,General,RatePerHour
TotalTime = % FormatSeconds(Floor(Timers/10))
Hours:=Floor(timers/600)/60 ;divide by 600 to get min floor that to disregard seconds then divide by 60 to get hours
Money:=RatePerHour*Hours
SetFormat, FloatFast, 0.2 ;Limit to two decimal places

FileAppend,`n<br><br><b>Date:</b>&nbsp;%A_MMM%&nbsp;%A_DD%&nbsp;%A_YYYY%&nbsp;&nbsp;(%A_hour%:%A_Min%),log.html
FileAppend,`n<br><b>Keywords Worked:</b>&nbsp;&nbsp;&nbsp;%kwcount%,log.html
FileAppend,`n<br><b>Assets Worked:</b>&nbsp;%ascount%,log.html
FileAppend,`n<br><FONT COLOR="33CC00">Money Earned:&nbsp;$&nbsp;%money%</font>,log.html
FileAppend,`n<br><FONT COLOR="#FF0000">Invoice Time:</font>&nbsp;<FONT COLOR="#FF0000">%TotalTime%</font>,log.html

IniWrite,Normal,settings.ini,General,CloseState ;crash prevention
IniWrite,0,settings.ini,General,AutoSave ;crash prevention
IniWrite,0,settings.ini,General,AutoSaveKW ;crash prevention
IniWrite,0,settings.ini,General,AutoSaveAS ;crash prevention

IniRead,kwcountfinal,settings.ini,StatsKW,%A_WDay%
IniRead,ascountfinal,settings.ini,StatsAS,%A_WDay%
IniRead,timersfinal,settings.ini,StatsTime,%A_WDay%
kwcountfinal +=kwcount
ascountfinal +=ascount
timersfinal +=timers
IniWrite,%kwcountfinal%,settings.ini,StatsKW,%A_WDay%
IniWrite,%ascountfinal%,settings.ini,StatsAS,%A_WDay%
IniWrite,%timersfinal%,settings.ini,StatsTime,%A_WDay%
ExitApp


Report this post
Top
  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 19 posts ]  Go to page 1, 2  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: batto, HotkeyStick, migz99, mrhobbeys, rbrtryn, sjc1000 and 64 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group