# Counter in Basic: auf Tag X runterzählen?



## Xenolith (14. Dezember 2006)

Hallo,
ich möchte einen Counter programmieren der mir minutengenau von tag x (soll im programm festgelegt werden also nicht variable) runterzählt und mir bei jedem programmstart die Zeit ausgibt die ich noch habe bis Tag X erreicht ist.

wäre nett wenn ich mir helfen könntet danke auf jedenfalls schonmal im vorraus


XenoLith


----------



## WaGutSo (14. Dezember 2006)

Hallo XenoLith,

dazu gibt es die DateDiff-Funktion. Schaue da mal in die Online-Hilfe (VB6).
Du kommst dann in etwa zu diesem Ergebnis:


```
Dim sBisDatum As String
Dim lRestzeit As Long
:
sBisDatum = "31/12/2006"  ' bis dahin wird gerechnet, z. B.: 31.12.2006
:
' und das beim Programmstart:
lRestzeit = DateDiff("n", Now, sBisDatum)
```

Viel Erfolg
Walter Gutermann


----------



## Xenolith (14. Dezember 2006)

danke hört sich gut an! werd heute noch versuchen...

fertigen quellcode stell ich hier rein...


----------



## Xenolith (14. Dezember 2006)

so hab jetzt dank deiner hilfe einen quelltext auf die beine stellen können der funtz...


```
MsgBox(DateDiff("d", Now, "7.12.2007"))
```

1. mich würde interressiren wie ich die ausgabe in einer textbox ausgeben lassen kann!
2. und ich möchte gerne das nicht nur die tage sondern auch die jahre, monaten, tage, stunden, und minuten wie stell cih das auf die beine?


----------



## wincnc (15. Dezember 2006)

Hallo, versuch´s mal so:

```
Private Sub Form_Load()
  Label1.Move 60, 100, 5230, 2000
  Label1.FontSize = 8
  Label1.FontBold = True
  Label1.Caption = ""
  Timer1.Interval = 1000
  Timer1_Timer
End Sub

Private Function CountDown(datStart As Date, datEnd As Date) As String

Dim intYear As Integer, intMonth As Integer
Dim intYD As Integer, intMD As Integer, intWD As Integer, intTD As Integer
Dim intHD As Integer, intND As Integer, intSD As Integer

If DateDiff("s", datStart, datEnd) >= 0 Then

  intYear = Year(datStart)
  intMonth = Month(datStart)

  intYD = Year(datEnd) - intYear
  intMD = Month(datEnd) - intMonth
  intTD = Day(datEnd) - Day(datStart)
  intHD = Hour(datEnd) - Hour(datStart)
  intND = Minute(datEnd) - Minute(datStart)
  intSD = Second(datEnd) - Second(datStart)

  If intSD < 0 Then
    intND = intND - 1
    intSD = intSD + 60
  End If

  If intND < 0 Then
    intHD = intHD - 1
    intND = intND + 60
  End If

  If intHD < 0 Then
    intTD = intTD - 1
    intHD = intHD + 24
  End If

  If intTD < 0 Then
    intMD = intMD - 1
    intTD = intTD + Day(DateSerial(intYear, intMonth + 1, 0))
  End If

  intWD = Int(intTD / 7)
  intTD = intTD - (intWD * 7)

  If intMD < 0 Then
    intYD = intYD - 1
    intMD = intMD + 12
  End If

Else
  Timer1.Enabled = False
  Label1.FontSize = 26
  Label1.FontBold = False
  CountDown = "Es ist soweit, Countdown beendet !"
  Exit Function
End If

CountDown = "Es sind noch: " & vbCrLf & vbCrLf _
& intYD & " Jahr(e) und " & intMD & " Monat(e) und " & intWD & " Woche(n) und " & intTD & " Tag(e)" & vbCrLf & vbCrLf _
& intHD & " Stunde(n) und " & intND & " Minute(n) und " & intSD & " Sekunde(n)"

End Function

Private Sub Timer1_Timer()
  Label1.Caption = CountDown(Now, "31.12.2006 00:00:00")
End Sub
```


----------



## Xenolith (15. Dezember 2006)

hm bei mir funtz das nicht...
ich hab einen timer (name=timer1) und eine label (name= label1) erstellt... kannst du mir mal deinen ganzen projektordner schicken?

d a t a m i n e r @ g m x . d e (ohne leerzeichen, ist nur wegen den emailaddy such progs der spamversender)
oder per icq: 317009075

danke aber für deine hilfe!

XenoLith


----------



## Xenolith (15. Dezember 2006)

Fehler	1	"Public Event Move(sender As Object, e As System.EventArgs)" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen.	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	4	9	die stunde null
Fehler	2	"FontSize" ist kein Member von "System.Windows.Forms.Label".	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	5	9	die stunde null
Fehler	3	"FontBold" ist kein Member von "System.Windows.Forms.Label".	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	6	9	die stunde null
Fehler	4	"Caption" ist kein Member von "System.Windows.Forms.Label".	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	7	9	die stunde null
Fehler	5	"Day" ist ein Typ und kann nicht als Ausdruck verwendet werden.	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	25	21	die stunde null
Fehler	6	"Day" ist ein Typ und kann nicht als Ausdruck verwendet werden.	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	25	35	die stunde null
Fehler	7	"Day" ist ein Typ und kann nicht als Ausdruck verwendet werden.	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	47	33	die stunde null
Fehler	8	"FontSize" ist kein Member von "System.Windows.Forms.Label".	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	60	13	die stunde null
Fehler	9	"FontBold" ist kein Member von "System.Windows.Forms.Label".	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	61	13	die stunde null
Fehler	10	"Caption" ist kein Member von "System.Windows.Forms.Label".	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	73	9	die stunde null
Fehler	11	"End Sub" muss ein entsprechendes "Sub" voranstehen.	C:\Dokumente und Einstellungen\Joel\Eigene Dateien\Visual Studio 2005\Projects\die stunde null\die stunde null\Form1.vb	77	5	die stunde null

hab mal die fehlermeldung gepostest...
ich programmier mit visual basic express


----------



## wincnc (15. Dezember 2006)

Hallo
Der von mir gepostete Code ist für VB6.
Da bist Du wohl im falschen Forum gelandet.
Versuch es doch mal Hier


----------



## wincnc (16. Dezember 2006)

Hallo, ich habe das Ganze mal auf VB 2005 umgestellt.

```
Public Class Form1
    Private Function CountDown(ByVal datStart As Date, ByVal datEnd As Date) As String

        Dim intYear As Integer, intMonth As Integer
        Dim intYD As Integer, intMD As Integer, intWD As Integer, intTD As Integer
        Dim intHD As Integer, intND As Integer, intSD As Integer

        If DateDiff("s", datStart, datEnd) >= 0 Then

            intYear = Year(datStart)
            intMonth = Month(datStart)

            intYD = Year(datEnd) - intYear
            intMD = Month(datEnd) - intMonth
            intTD = Microsoft.VisualBasic.DateAndTime.Day(datEnd) - Microsoft.VisualBasic.DateAndTime.Day(datStart)
            intHD = Hour(datEnd) - Hour(datStart)
            intND = Minute(datEnd) - Minute(datStart)
            intSD = Second(datEnd) - Second(datStart)

            If intSD < 0 Then
                intND = intND - 1
                intSD = intSD + 60
            End If

            If intND < 0 Then
                intHD = intHD - 1
                intND = intND + 60
            End If

            If intHD < 0 Then
                intTD = intTD - 1
                intHD = intHD + 24
            End If

            If intTD < 0 Then
                intMD = intMD - 1
                intTD = intTD + Microsoft.VisualBasic.DateAndTime.Day(DateSerial(intYear, intMonth + 1, 0))
            End If

            intWD = Int(intTD / 7)
            intTD = intTD - (intWD * 7)

            If intMD < 0 Then
                intYD = intYD - 1
                intMD = intMD + 12
            End If

        Else
            Timer1.Enabled = False
            Label1.Font = New Font("Arial", 20, FontStyle.Bold)
            CountDown = "Es ist soweit, Countdown beendet !"
            Exit Function
        End If

        CountDown = "Es sind noch: " & vbCrLf & vbCrLf _
                                     & intYD & " Jahr(e) und " & intMD & " Monat(e) und " & intWD & " Woche(n) und " & intTD & " Tag(e)" & vbCrLf & vbCrLf _
                                     & intHD & " Stunde(n) und " & intND & " Minute(n) und " & intSD & " Sekunde(n)"

    End Function

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = CountDown(Now, "16.12.2007 09:56:00")
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Size = New Size(350, 150)
        Label1.Location = New Point(10, 10)
        Label1.Size = New Size(320, 120)
        Label1.Font = New Font("Arial", 8, FontStyle.Bold)
        Label1.Text = ""
        Timer1.Interval = 1000
        Timer1.Start()
        Timer1_Tick(sender, e)
    End Sub

End Class
```


----------



## Xenolith (16. Dezember 2006)

Danke erstmal funktioniert soweit!

allerdings ha ich eine frage:

```
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = CountDown(Now, "7.12.2007 21:50:00")
    End Sub
```

hab jetzt die zeit geändert im timer... allerding zeigt mir der timer ein ergebnis an was um genau 2 tage von dem abweicht was ich von hand ausgerechnet habe... liegt das eventuell daran das er mit genau 30 tagen pro monat rechnet?


----------



## wincnc (16. Dezember 2006)

Hallo

Ich glaube dass Du Dich verrechnet hast.
Hast Du den Februar mit 28 Tagen gerechnet?
Das Programm rechnet nicht nur mit 30 Tagen.


----------



## Xenolith (17. Dezember 2006)

Sry hab mich einmal verzählt :-( 
ich würde gerne noch so ein fortschrittsbalken unten haben wie geht das genau?

danke nochmal für deine hilfe

XenoLith


----------



## wincnc (18. Dezember 2006)

Hallo, hier ein Beispiel.

```
Public Class Form1

    Private EndZeit As DateTime

    Private Function CountDown(ByVal datEnd As DateTime) As String

        Dim intYear As Integer, intMonth As Integer
        Dim intYD As Integer, intMD As Integer, intWD As Integer, intTD As Integer
        Dim intHD As Integer, intND As Integer, intSD As Integer
        Dim datStart As DateTime

        datStart = Now

        If DateDiff("s", datStart, datEnd) >= 0 Then

            intYear = Year(datStart)
            intMonth = Month(datStart)

            intYD = Year(datEnd) - intYear
            intMD = Month(datEnd) - intMonth
            intTD = Microsoft.VisualBasic.DateAndTime.Day(datEnd) - Microsoft.VisualBasic.DateAndTime.Day(datStart)
            intHD = Hour(datEnd) - Hour(datStart)
            intND = Minute(datEnd) - Minute(datStart)
            intSD = Second(datEnd) - Second(datStart)

            If intSD < 0 Then
                intND = intND - 1
                intSD = intSD + 60
            End If

            If intND < 0 Then
                intHD = intHD - 1
                intND = intND + 60
            End If

            If intHD < 0 Then
                intTD = intTD - 1
                intHD = intHD + 24
            End If

            If intTD < 0 Then
                intMD = intMD - 1
                intTD = intTD + Microsoft.VisualBasic.DateAndTime.Day(DateSerial(intYear, intMonth + 1, 0))
            End If

            intWD = Int(intTD / 7)
            intTD = intTD - (intWD * 7)

            If intMD < 0 Then
                intYD = intYD - 1
                intMD = intMD + 12
            End If

            ProgressBar1.PerformStep()

        Else
            Timer1.Stop()
            Label1.Font = New Font("Arial", 20, FontStyle.Bold)
            CountDown = "Es ist soweit, Countdown beendet !"
            Exit Function
        End If

        CountDown = "Es sind noch: " & vbCrLf & vbCrLf _
                                     & intYD & " Jahr(e) und " & intMD & " Monat(e) und " & intWD & " Woche(n) und " & intTD & " Tag(e)" & vbCrLf & vbCrLf _
                                     & intHD & " Stunde(n) und " & intND & " Minute(n) und " & intSD & " Sekunde(n)"

    End Function

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = CountDown(EndZeit)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        EndZeit = "18.12.2006 09:50:00"

        Me.Size = New Size(350, 200)
        Label1.Location = New Point(10, 10)
        Label1.Size = New Size(320, 120)
        Label1.Font = New Font("Arial", 8, FontStyle.Bold)
        Label1.Text = ""
        ProgressBar1.Location = New Point(10, 110)
        ProgressBar1.Size = New Size(315, 20)
        ProgressBar1.Style = ProgressBarStyle.Continuous
        ProgressBar1.Step = 1
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = DateDiff("s", Now, EndZeit)
        ProgressBar1.Value = 0
        Timer1.Interval = 1000
        Timer1.Start()
        Timer1_Tick(sender, e)
    End Sub

End Class
```


----------



## Xenolith (18. Dezember 2006)

```
ProgressBar1.Maximum = DateDiff("s", Now, EndZeit)
```

so der sagt mir:
System.ArgumentOutOfRangeException

Der Wert -44236 ist für Maximum ungültig. Maximum muss größer als oder gleich 0 sein.
Parametername: Maximum

kann ich ehrlich nicht viel mit anfangen


----------



## wincnc (19. Dezember 2006)

Hallo, gib die Endzeit > Now an dann sollte das Problem erledigt sein.
Natürlich kann das Maximum kein minus Wert sein.


----------



## Xenolith (19. Dezember 2006)

ne geht nicht! allerdings startet er das programm ohne fehlermeldung oder warnung der countdown läuft zwar korrekt allerdings fungtioniert die progressbar nicht...
:-(


----------

