um eine bestimmte zeit msgbox

  • Allgemein

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    um eine bestimmte zeit msgbox

    hallo leute

    ich bin schon ne ganze weil am testen wie es geht aber leider habe ich kein möglichkeit rausbekommen ich möchte gerne das auf mein desktop eine infomation auf taucht aber nur um eine bestimmte zeit zb. 16 uhr wenn es geht ohne klicken sondern gleich die infomation und denn die meldung durch oki weg machen

    sorry wegen meine schreib fehler

    danke schon mal im vorweg
    Ist eig ganz easy :
    Du brauchst einen Timer !

    Code :

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Start()
    4. End Sub
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. If My.Computer.Clock.LocalTime.Hour = "16" And My.Computer.Clock.LocalTime.Minute = "00" Then
    7. MsgBox("Hier dein Text")
    8. Timer1.Stop()
    9. 'Me.Close()
    10. End If
    11. End Sub
    12. End Class
    @NicCc,
    is ja schön und gut, deine Easy Lösung. Is aber Humbug. Was ist um 16:01 :?:
    Und warum nicht die DateTime-Structur :?:

    VB.NET-Quellcode

    1. Dim Sollzeit as New DateTime 'Deine Weckzeit
    2. Function IssesSoweit() as Boolean
    3. Dim Jetze as new DateTime = Now 'Also Jetze quasi
    4. If Jetze >= Sollzeit Then 'Isses soweit?
    5. Return True
    6. End If
    7. Return False
    8. End Sub


    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Oh sry :S mach einfach Timer1.stop vor msgbox("") dann sollte es trotzdem gehen :)
    also so :

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Start()
    4. End Sub
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. If My.Computer.Clock.LocalTime.Hour = "16" And My.Computer.Clock.LocalTime.Minute = "00" Then
    7. Timer1.Stop()
    8. MsgBox("Hier dein Text")
    9. 'Me.Close()
    10. End If
    11. End Sub
    12. End Class


    Edit:@Vatter : Jetzt geht es aber trotzdem und der Code ist übersichtlicher !

    NicCc schrieb:

    If My.Computer.Clock.LocalTime.Hour = "16" And My.Computer.Clock.LocalTime.Minute = "00" Then
    Auch wenn da oben Allgemein steht:
    Hast Du schon mal was von Option Strict On gehört?
    Und:
    My.Computer.Clock.LocalTime.Hour sowie My.Computer.Clock.LocalTime.Minute sind Integer, auch wenn Du sie in einen String konvertierst, ist Deine Lösung falsch, denn ein in einen String konvertierter Integer kann niemals "00" sein, bestenfalls "0".
    Und und: Sieh Dir @Vatter:s Lösung an, arbeite mit DateTime-Objekten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Als blutiger Anfänger probiere ich das natürlich gleich aus - mit DateTime.

    Was mich aber absolut nicht überzeugt - das Ergebnis ist: "31.08.2012 20:54:00"
    Für einen Vergleich muss ich jetzt also wohl entweder das DateTime zurechtschnipseln, oder den Vorgabewert vollständig mit Datum angeben.

    Oder übersehe ich da etwas???

    Da ist die "einfache" Version mit "My.Computer..." (und Integer) wesentlich handlicher.
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jocutus“ () aus folgendem Grund: Ergänzung

    jocutus schrieb:

    Oder übersehe ich da etwas?
    Offensichtlich:

    VB.NET-Quellcode

    1. Dim txt As String
    2. Dim dt As DateTime = DateTime.Now
    3. txt = dt.ToString
    4. txt = dt.ToShortDateString
    5. txt = dt.ToLongDateString
    6. txt = dt.ToShortTimeString
    7. txt = dt.ToLongTimeString
    Dies zur Ausgabe.
    Vergleichen kannst Du DateTime-Objekte direkt:

    VB.NET-Quellcode

    1. Dim dt2 As DateTime = New DateTime(2012, 9, 1, 15, 34)
    2. If dt > dt2 Then
    3. ' bla
    4. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist alles sehr schön, allerdings ist 'txt' kein DateTime-Objekt mehr (Auch keine Zahl mit der man rechnen kann - aber das nur nebenbei).
    Und vergleichen kann ich nur ein einziges Object - nämlich DateTime selbst - mit seinen dazugehörigen Variablen versteht sich.

    In diesem Falle heisst es, ich müsste die aktuelle Zeit zu einem 'ShortTimeString' machen und mit der programmierten Konstanten (einem String) vergleichen.

    Lese ich ein DateTime-Format für 'Now' ein und vergleiche es mit einer im DateTime-Format programmierten Angabe, wird das Programm wahrscheinlich nie auslösen, da das Datum nicht stimmt.
    Zwar gibt es bei DateTime 'Today' um die Zeit auf 00:00:00 zu setzen, aber kein 'Time' um das Datum auf 00.00.0000 zu setzen.

    Also wird man letztlich das DateTime nur zum feststellen der aktuellen Uhrzeit verwenden können und der Rest wird auf Textbasis verarbeitet. Da ist mir die Integer-Lösung immer noch lieber....
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    @jocutus: Zunächst solltest Du lernen, einen Post zu verstehen, nicht nur zu lesen.
    Die DateTime.ToXxxString-Methoden dienen der Ausgabe und Anzeige, nicht aber dem Vergleich.
    Sieh Dir mal diesen einen (von mehreren) Konstruktor eines DateTime-Objektes an:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Dim dt2 As DateTime = New DateTime(2012, 9, 1, 15, 34)
    Selbst wenn Du ihn übermorgen anwendest, bleibt das Datum auf dem Wert vom 1. September 2012 stehen. Wenn Du 2 Uhrzeiten miteinander vergleichen willst, musst Du dafür sorgen, dass das Datum passt, in diesem Falle also gleich ist.
    Dafür gibt es eine eihe von Konstruktoren, die Du Dir einfach mal ansehen solltest.
    Und dann kannst Du mit diesen DateTime-Objekten hantieren so wie Du es brauchst. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    jocutus schrieb:

    Oder übersehe ich da etwas???

    Dassis die Kernfrage.

    Im VisualStudio "sieht" man am besten mittm ObjectBrowser/ObjektKatalog
    Damit richtig feste üben.

    ZB nach "Date" suchen - das führt einen auf den Typ "DateTime":


    Interessant dürfte hier die Property "TimeOfDay" sein, oder?

    Auch Profis verwenden den OB viel zu selten - grade bei den Datentypen, die man für "primitiv" hält.
    Beachte im Bild die Scrollbar: die deutet daraufhin, dass die Structur DateTime mehr als doppelt so viele Methoden, Funktionen, Operatoren, Konstruktoren und Properties bereithält, als hier zu sehen.
    Langsam wird ein Schuh draus...

    Das 'TimeOfDay' ist in diesem Fall wohl genau das Richtige. (Die Microsoft-Seite ist da ein bisschen verwirrend für Anfänger)

    Schön. Gefällt mir.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MachsNochEinmalSam
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Start()
    4. End Sub
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. Dim Warnzeit As DateTime = New DateTime(1, 1, 1, 12, 38, 0)
    7. ' Jahr (1-9999), Monat (1-12), Tag (1-Monatslänge) für ein Datum
    8. ' oder Jahr, Monat, Tag, Stunde (0-23), Minute (0-59), Sekunde (0-59) für Uhrzeit
    9. Dim Jetzt As DateTime = TimeOfDay
    10. If Jetzt = Warnzeit Then
    11. Timer1.Stop()
    12. MsgBox("Ausgelöst zum gewünschten Zeitpunkt" & " " & Jetzt)
    13. End If
    14. End Sub
    15. End Class
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    besseres Code-Layout im Forum erzielst du mit Bitte VB-Tag benutzen - aber richtig

    Die Sache scheint mir noch komplizierter, weil es soll ja jeden Tag gemeldet werden, ab einer bestimmten Uhrzeit, und jeweils nur einmal.
    Also braucht man eine Variable, die die nächste Meldungs-Zeit speichert, und die muß man in richtiger Weise stufenweise erhöhen.
    Dassis mir zu kompliziert mit Date zu berechnen - da wandle ich lieber alle Werte in Longs:
    Hiermal was, was alle 30s meldet, mit einem Offset von 15s.

    VB.NET-Quellcode

    1. Private _NextInfo As Long = 0
    2. Private _Offset As Long = #12:00:15 AM#.Ticks
    3. Private _Step As Long = #12:00:30 AM#.Ticks
    4. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    5. Dim dt = Date.Now.Ticks
    6. If dt > _NextInfo Then
    7. _NextInfo = dt + _Offset + _Step - (dt Mod _Step)
    8. MsgBox(Date.Now.TimeOfDay.ToString)
    9. End If
    10. End Sub


    Das Timer.Interval ist im Designer auf 100 (ms) eingestellt. Bei einer Tageweisen Meldung würdeman natürlich 60000 oder sowas festlegen.
    Falls das Prog zwischendurch auch mal ausgemacht wird, müssteman sogar eine Information auf Platte speichern.
    Das mit dem VB-Tag werde ich vielleicht eines Tages noch lernen.

    Warum schaltet man den Timer nicht einfach wieder ein, dann erfolgt die nächste Meldung von ganz alleine....
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    Also des mit den Longs und Ticks findich aber recht kompliziert, gibs doch dafür die DateTime.AddDays() oder .AddHours oder AddHirsche-Methoden usw.

    So ein Termin im eigentlichen Sinne sollte meiner Meinung nach sowieso in einer Klasse gekapselt werden um Zeitpunkt, Interval ggf. Snooze An/Aus Snooze Interval Betreff, NextErinnerung usw enthalten sollte. Solche Objekte werden in einer Liste oder schöner in nen Dataset gespeichert und denn im Timer abgearbeitet.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    du bist herzlich eingeladen, dieselbe funktionalität zu coden - die Parameter sind ja klar:

    alle halbe Minute eine Meldung, aber mit 15s Offset, also zB um 16:40:15, dann 16:40:45, dann 16:46:15, ...

    Ich bin gar nicht sicher, ob das mit ohne Longs nicht auch geht.

    Ich glaub, die crux ist, dassich bei Long den Mod - Operator verfügbar hab, mit dem ich aus jedem Wert eine diskrete Stufe machen kann.

    Bei Date leistet die Date.Date - Property vergleichbares (schneidet .TimeOfDay weg), aber das ist gewissermaßen nur ein Modulo auf den ganzen Tag. Also der Code könnte für Tagesrythmen einfacher aussehen, aber um das zu testen, müssteman das Teil tagelang laufen lassen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    du bist herzlich eingeladen, dieselbe funktionalität zu coden - die Parameter sind ja klar:

    Meinste sowas? Oder hab ich deine Absicht jetz nicht durchschaut?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _NextInfo As DateTime 'nächsetes Wecken
    3. Private _Offset As Integer = 5
    4. Private _Step As Integer = 20
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Dim Heute As DateTime = Now.Date 'heutiges Datum (auch z.B. aus DatePicker
    7. Dim _ts As TimeSpan
    8. If TimeSpan.TryParse(MaskedTextBox1.Text, _ts) Then 'Weckzeit aus Masked Textbox
    9. _NextInfo = Heute.Add(_ts) 'Datum und Uhrzeit zusammensetzen
    10. End If
    11. Timer1.Start()
    12. End Sub
    13. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    14. Dim dt As DateTime = Now
    15. If dt > _NextInfo Then
    16. _NextInfo = _NextInfo.AddSeconds(_Offset)
    17. _NextInfo = _NextInfo.AddSeconds(_Step)
    18. MessageBox.Show(Date.Now.ToLongTimeString)
    19. End If
    20. Me.Text = Date.Now.ToLongTimeString
    21. End Sub
    22. End Class
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    :D nicht nur bei dir.
    Weil da ja auch der Termin angegeben wird. Bei dir wird Halt der Startzeitpunkt des Programs als Terminstart vorgegeben. Das ginge bei mir natürlich auch:

    VB.NET-Quellcode

    1. _NextInfo = Now.AddSeconds(_Offset)

    Ich versteh auch nicht, warum (also zu welchem Zweck) du den möglichen Interval auf eine diskrete Stufe von Step begrenzen möchtest? Vielleicht will ja jemand einen Offset > Step. Dann kommt die Meldung nur noch alle par mal.
    Ich denke, wir könnten uns darauf einigen, dass der Termin eine DateTime und der Weckinterval eine TimeSpan sein sollte. Die Eingabe der Timespan könnte dann z.B. mit ner NumericDropDown limitiert werden.
    Will man weitere Rechnereien durchführen, bleiben die Bestandteile der jeweiligen Structur als Integer verfügbar.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: