Moin Moin zusammen,
ich bin gerade dabei einen Timer zu basteln damit ich immer weiß wann
ich meine Arbeitsstunden voll habe.
Ich wollte als kleine Gadget eine progessbar einbauen.
Die Zeit die abgearbeitet wird soll später als Progessbar grafisch
dargestellt werden. Hierfür nehme ich einfach die Zeit die als Counter
runter läuft.
Leider haben ich extreme Probleme mit der Typenwandlung.
Ich hoffe ich habe jetzt nix vergessen.
Aber mit diesem Ausschnitt des Programms schmiert alles ab mit einem
Ausnahmefehler.
"Die Eingabenfolge hat das falsche Format.
Grüße
Ulrich schrieb:> Aber mit diesem Ausschnitt des Programms schmiert alles ab mit einem> Ausnahmefehler.> "Die Eingabenfolge hat das falsche Format.
man könnte ja auch mal eine Fehlerbehandlung einbauen! (Try Catch als
Stichwort)
Der Fehler wird wohl hier passieren:
int time_progress = (int)Convert.ToInt64(timeForProgess);
was steht in timeForProgess wenn das Fehler kommt? (Ich will nicht
wissen was du denkst was darin steht, sondern schau bitte mit dem
Debugger nach was wirklich drin steht)
Vermutlich wird der text einfach noch Leer sein.
Hopla soll natürlich #
int time_progress = (int)Convert.ToInt16(timeForProgess);
sein... danke habe ich übersehen...
Das Problem mit if (txBox_Arbeitszeit.Text != "")
umgangen und es funktioniert auch.
Das letzte Problem ist, dass er erst bei ca. 2/3 des Balkens ist aber
die Zeit schon abgelaufen.
Ulrich schrieb:> Das letzte Problem ist, dass er erst bei ca. 2/3 des Balkens ist aber> die Zeit schon abgelaufen.
Das wundert mich nicht.
Das macht man auch nicht so, dass man
1
progress_Countdown.Increment(1);
einen Inkrement macht, sondern man rechnet sich die Zahl aus, auf die
sich der Progressbar einstellen soll.
Im einfachsten Fall macht man einfach eine Prozentrechnung. D.h. man
definiert, dass die komplette aufzuwendende Arbeitszeit 100% sind und
rechnet sich dann beim Timertick mit der aktuellen Zeit aus, wieviele
Prozent davon schon erledigt sind. Auf diesen Wert wird dann auch der
Progressbar eingestellt, der mit
1
progress_Countdown.Minimum=0;
2
progress_Countdown.Maximum=100;
auf eine Prozentanzeige eingerichtet wurde.
Vorteil: du bist unabhängig davon geworden, wie oft und in welchen
Zeitabständen der Timer Tick tatsächlich kommt. Der Timertick ist dann
einfach nur noch die 'Benachrichtigung' doch bitte wieder mal den
Progressbar auf den aktuellen Wert einzustellen. Welcher das ist,
rechnet man anhand der aktuellen Zeit und der Startzeit bzw. der
vorhergesagten Zeitdauer aus.
Moin moin zusammen,
ich habe das Problem mit der Leiste gelöst und es funktioniert super
danke.
Aber ich stehe erneut auf dem Schlauch. Ich muss sagen, ich programmiere
C# auch erst seit ein paar Wochen, also Frischfleisch...
Es geht gerade darum dass ich eine Zeit in den Valvue Change Fenster
eintragen kann, wann ich auf Arbeit angekommen bin. z.B um 7:15Uhr somit
7:15.
Das funkioniert auch gut. Jetzt geht es weiter mit der aktuellen Zeit.
Diese muss ich ja davon abziehen und das Ergebnis ausgeben, dann weiß
ich ja wieviel Stunden ich gearbeitet habe und kann diese mit der Soll
Arbeitszeit abgelichen und ausgeben.
Ich habe jedoch das Problem, dass ich die Zeiten nicht voneinander
abgezogen bekommen, da ich die Zeiten im String direkt mit subtract
nicht voneinander abgezogen bekomme des weiteren kann ich auch die
strings nicht in einen int. convertieren da ich einen Ausnahmefehler
bekomme.
Könntet Ihr mir ein weiteres mal eine Gedankenstütze geben?
Grüße
Ulrich schrieb:> Könntet Ihr mir ein weiteres mal eine Gedankenstütze geben?
du musst den String erst mal Teilen. Dann Stunden und Minuten in eine
Zahl umwandeln und dann das ganze in ein TimeObjekt.
Dafür könnte man mit Regulären ausdrücken arbeiten oder mit Split.
Ulrich schrieb:> Ich habe jedoch das Problem, dass ich die Zeiten nicht voneinander> abgezogen bekommen
Warum rechnest Du nicht gleich mit den Ticks? Die Umwandlung in einen
String macht ja nur für die Darstellung einen Sinn.
Das hat super funktioniert danke!
Jetzt habe ich noch eine Frage.
Ich habe jetzt 3 Zeiten.
Einmal die Zeit wann ich komme, die Zeit die aktuell ist und die Zeit
wieviel Stunden ich arbeiten muss.
Gibt es da schon fertige funktionen bzw. Formeln?
Weil das auszurechnen ist ja nicht all zu einfach.
Vor allem ist mir aufgefallen, dass ich ja ab 60 Minuten um 1 hochzählen
muss und auch eine Auswertung brauche also %60 usw.
Grüße
Arc Net schrieb:> RegEx für xx:yy? Etwas viel Overkill
naja, der nächste gibt aber 12:a5, oder 12:12:10 ein und schon gibt es
wieder eine Fehlermeldung. Bei RegEx kann man gleich Prüfen ob der
String den richtigen Aufbau hat.
^(\d){1,2}:(\d){2,2}$
Ulrich schrieb:> Jetzt habe ich noch eine Frage.> Ich habe jetzt 3 Zeiten.>> Einmal die Zeit wann ich komme, die Zeit die aktuell ist und die Zeit> wieviel Stunden ich arbeiten muss.
TimeSpan arbeitszeit = new TimeSpan(8, 30, 0); // 8 Stunden und 30
Minuten
DateTime ankunft = new DateTime(2014, 6, 24, 15, 3, 0);
DateTime ende = ankunft + arbeitszeit;
Ulrich schrieb:> Gibt es da schon fertige funktionen bzw. Formeln?> Weil das auszurechnen ist ja nicht all zu einfach.> Vor allem ist mir aufgefallen, dass ich ja ab 60 Minuten um 1 hochzählen> muss und auch eine Auswertung brauche also %60 usw.
ArcNext hat den Rest ja schon addressiert.
Du gehst, der Himmel weiß warum, viel zu schnell auf Strings.
Strings sind nicht das, was du willst, wenn du mit Zeiten rummachen
musst.
Du hast einen Satz Klassen, die mit Zeiten und Zeiträumen umgehen
können. Du willst daher möglichst lange bei diesen Klassen bleiben um
damit alle Berechnungen zu machen.
Erst ganz zum Schluss, wenn es darum geht eine Ausgabe zu machen, dann
ist der Zeitpunkt gekommen, auf Strings zu wechseln.
Welchen Sinn soll es haben
1
stringdate1=DateTime.Now.ToShortTimeString();
2
// Zeit der ankunft abholen um damit zu rechnen
3
4
string[]split=date1.Split(newchar[]{':'});
5
stringstr_stunden=split[0];
6
stringstr_minuten=split[1];
sich von einem DateTime Objekt die Zeit als String zu holen, nur um dann
den String in Stunden und Minuten zu zerlegen. So ein DateTime Objekt
wird ja wohl in der Lage sein, die Stunden bereits in Zahlenform zu
liefern. Und tatsächlich gibt es eine Methode Hour() die genau das kann.
Aber abgesehen davon.
> Vor allem ist mir aufgefallen, dass ich ja ab 60 Minuten um 1> hochzählen muss und auch eine Auswertung brauche also %60 usw.
Falls du je in die Verlegenheit kommst, in einer Programmiersprache eben
keine entsprechenden vorgefertigten Klassen zur Verfügung zu haben:
Du kannst dir in solchen Fällen das Leben wesentlich einfacher machen,
in dem du Zeiten eben nicht in Form von Stunden und Minuten ausdrückst,
sondern zum Beispiel als 'Minuten seit Mitternacht'. Dann fallen dir
nämlich all die ganzen Sonderfälle, die du beim Weiterschalten von
Stunden hast (bis auf eine Ausnahme) alle weg. Du rechnest einfach immer
in Minuten seit Mitternacht und zu Anzeigezwecken wandelst du dir
wieder alles in die gewohnten Stunden und Minuten zurück. Die eine
Ausnahme, die etwas Sorgfalt erfordert ist, wenn Startzeit + Dauer eine
Endzeit ergibt, die 'nach Mitternacht' ergibt, bzw. wenn eine
Differenzzeit ebenfalls über Mitternacht geht. Da muss man ein wenig
aufpassen.
Dein Fehler ist, dass du immer von dem ausgehst, was du an der
Oberfläche siehst. Kein Mensch sagt aber, dass du nur deswegen, weil du
an der GUI Stunden und Minuten anzeigst, auch intern alles in Stunden
und Minuten handhaben musst. Du musst deine Anzeige von den Innereien
deines Programmes stärker trennen! Im Inneren deines Programmes benutzt
du das, was für die Programmlogik am einfachsten ist. An der GUI benutzt
du das, was für den Benutzer das Einfachste ist. Diese beiden Dinge sind
des öfteren schon mal identisch, müssen es aber nicht notwendigerweise
sein. Es genügt völlig, wenn man die eine Darstellung in die andere
verwandeln kann (und vice versa). Wenn du in einem Programm für den
amerikanischen Markt nicht mit Meilen, Füssen, Inch und weiß der Teufel
was es da noch für Einheiten gibt rummachen willst, dann rechnet man
programmintern lediglich mit einer einzigen Basiseinheit und wandelt das
nur zu Anzeigezwecke in Meilen und Füsse um.
Guten Morgen,
vielen Dank für die Hilfe!
Ziemlich viel Information am frühen Morgen.
Ich werde mal versuchen das in die Tat um zu setzten.
Ich lasse euch wissen, wenn ich es geschafft habe.
Die Zeilte bringt einen Fehler. Ich kann das nicht voneinander abziehen.
Wenn ich die es drehe --> also DateTime von TimeSpan abziehen geht,
andersrum nicht.
Wo habe ich den Fehler eingebaut?
Ulrich schrieb:> DateTime diff_Time = my_Resultat_Time.Subtract(myDateTime);> Wo habe ich den Fehler eingebaut?
Wie soll das denn gehen.
my_Resultat_Time ist eine Zeitspanne, davon kann man keine Zeit
abziehen!
5min - 12Uhr ergibt nun mal keinen sinn.
Wie rechne ich das dann aus? Aus einem Ergebnis bekomme ich immer ein
TimeSpan und dann habe ich ja immer die differenz. Aber ich brauch diese
ja um weiter zu rechnen.
Grüße
Ulrich schrieb:> Wie rechne ich das dann aus?
eventuell etwas selber denken?
wenn 5min - 12Uhr nicht geht, dann kann man doch wohl 12Uhr - 5min
rechnen oder sogar 12Uhr + 5min wenn man es andersrum braucht.
Ulrich schrieb:> Ja das habe ich schon probiert
Auch wenn Probieren über Studieren geht hilft in der Programmierung oft
nur LESEN (der API) und LERNEN das ist hier doch kein Quizduell...
Auch eine grobe Struktur über den Ablauf sich zu überlegen (auf toten
Bäumen...) hat schon manchem geholfen. Und mit "Konvertierung von Typen"
hat das wilde zusammenwerfen unterschiedlichster Datenstrukturen
eigentlich auch nix zu tun...
Das ist nicht logisch.
Ein DateTime Objekt bezeichnet einen Zeitpunkt (wann ist etwas passiert)
Ein TimeSpan Objekt bezeichnet eine Zeitdauer (wie lange hat etwas
gedauert)
Und jetzt überlegen wir mal, was was ist.
Ist eine Ankunftszeit ein bestimmter Zeitpunkt oder ist es eine
Zeitdauer?
Eine Ankunftszeit ist klarerweise ein Zeitpunkt. Vorher warst du noch
nicht da, dann bist du angekommen und danach bist du da. Ein genau
definierter Zeitpunkt. D.h. das sollte ein DateTime Objekt sein.
In der letzten Zeile rechnest du eine diff_Time aus. Gedacht ist das
offenbar als die Differenz zweier Zeitpunkte.
Ist so eine Differenz ein Zeitpunkt oder ist das eine Zeitdauer?
Na offenbar ist das ja eine Zeitdauer. Um 11 Uhr hast du angefangen und
um 12 Uhr 30 warst du fertig. Die Differenz davon sind 1 einhalb
Stunden. Etwas das eine Aussage darüber macht, wie lange etwas dauert
ist eine Zeitdauer und kein Zeitpunkt. Also muss das ein TimeSpan Objekt
sein.
Fazit: Benutze die Klassen so, wie sie gedacht sind und in der
Bedeutung, die sie haben. Dann wird alles andere, unter anderem auch was
du von wem abziehen oder dazuzählen kannst, logisch sinnvoll.
Nur weil es bei beiden Klassen um Stunden und Minuten geht, bedeutet das
nicht, dass du die wahllos durcheinander würfeln kannst, wie es dir
gerade in den Kram passt. Die Macher der Klassen haben sich schon etwas
dabei gedacht, damit man eben nicht Kraut und Rüben durcheinder würfelt
und hinterher unsinnige Ergebnisse erhält, selbst wenn man das alles
arithmetisch rechnen kann. Aber ein wenig mitdenken, welche Bedeutung
der Wert hat den du gerade ausrechnest und zu welcher Kategrie
(Zeitpunkt oder Zeitdauer) er gehört, musst du schon selber. Selbst wenn
die Klassendesigner versucht haben, möglichst viele Fehler dadurch
abzufangen, dass dir der Compiler die Operation verweigert. " Zeitpunkte
voneinander abzuziehen ist eine sinnvolle Operation. Das Ergebnis ist
die Zeitdauer zwischen diesen Zeitpunkten. Aber 2 Zeitpunkte zu addieren
ist keine sinnvolle Operation. Was soll das Ergebnis davon sein?
Wohl aber ist es eine sinnvolle Operation, zu einem Zeitpunkt eine
Zeitdauer zu addieren oder zu subtrahieren. Das Ergebnis ist dann der
Zeitpunkt, der um die angegebene Zeitdauer in der Zukunft oder in der
Vergangenheit liegt.
Wenn du im weiteren Code durcheinander kommst, dann benenne deine
Variablen so, dass du bereits in der Variablenbenennung eine klare
UNterscheidung zwischen Zeitpunkten und Zeitdauern hast. Zb, in dem du
das eine mit dem Postfx '_Zeit' versiehst und das andere mit dem Postfix
'_Dauer'.
Dann steht dann eben im Code
1
End_Zeit=Ankunfts_Zeit+Arbeits_Dauer;
(bzw. die entsprechenden Aufrufe der Member-Funktionen)
und das sieht jede Kind, dass das eine sinnvolle Operation ist.
Wohingegen
1
Pause_Zeit=Ankunfts_Zeit+KloGeh_Zeit
nicht sinnvoll sein kann, weil bei der Addition von 2 Zeitpunkten kein
physikalisch sinnvolles Ergebnis entsteht. Dann muss man eben
entscheiden, wo man den Schnitzer eingebaut hat. Hat man grundsätzlich
etwas falsch gerechnet oder hat man sich in der Bezeichnung (und damit
auch in der Wahl der Objekt-Klasse) vertan und sollte die KloGeh_Zeit in
Wirklichkeit nicht eigentlich die Zeit-Dauer sein, die vergeht, wie
lange man es im Büro aushält bis man das erste mal aufs Klo muss. Beides
sind mögliche Fehlerszenarien und als Programmierer musst du
entscheiden, welcher der beiden Fälle tatsächlich vorliegt und wie daher
die Änderung sein muss. Eine klare, konsistente Benennung von Variablen
kann dabei sehr hilfreich sein. Dies zu erkennen gehört genauso zum
Lern-Prozess dazu, der aus einem Nichtprogrammierer einen Programmierer
und in letzter Konsequenz einen Programmierprofi macht.
Wenn dir bis jetzt immer noch nicht klar geworden ist, was das Problem
ist, dann geh mal eine Stufe höher. Weg von Stunden und Minuten und hin
zu Tag/Monat/Jahr. Denn ein Teil des Problems besteht darin, dass wir
sowohl für Zeitpunkte als auch für Zeitdauern dieselben Einheiten
benutzen. Für beides benutzen wir Stunde(n), Minute(n) und Sekunde(n).
Bei Datümern ist das aber ein klein wenig anders. Das eine benennen wir
mit Tag/Monat/Jahr, während wir für das andere 'Tage' benutzen (auch
wenn der sprachliche Unterschied nur minimal ist)
Ein bestimtes Datum ist eine bestimmter Tag im Jahr. Der 25. Juni 2014
ist so ein Tag. Ein ganz betimmter aus vielen. Im Kontrast dazu steht
die ANzahl von Tagen zwischen 2 Daten. Bis zum 1. Juli sind es noch 6
Tage. Das ist eine Zeitdauer! "Tag/Monat/Jahr" ist ein Punkt, "Tage" ist
eine Dauer. Man kann die Differenz zwischen 2 Datümer berechnen und
kriegt die Dauer dazwischen. Aber man kann nicht 2 Datümer addieren. Was
soll das für ein Ergebnis sein? Was kriege ich, wenn ich zum 25. Juni
den 3. August dazuzähle? Welche reale Bedeutung könnte dieses Ergebnis
haben? Eben - keine. Wohl aber kann ich 2 Zeitdauern voneinander
abziehen und addieren. Wenn der Bau eines Rohbaus 8 Tage dauert und der
Installateur zum Verlegen der Rohre 2 Tage braucht, dann ist nach 8 + 2
gleich 10 Tagen der Rohbau samt Rohren fertig. Das ist also eine
Sinnvolle Operation. Genauso wie es eine sinnvolle Operation ist zum 25.
Juni diese 10 Tage zu addieren um so den Tag im Kalender zu kriegen, an
dem Rohbau+Rohre fertig sind.
Also: einfach mal ein wenig nachdenken, was die Bedeutung von Klassen
ist, was sie darstellen, und was sich daraus für die Verwendbarkeit
ergibt.
In der Programmierung muss man ein wenig genauer hinsehen als im
täglichen Leben, bei dem das Gehirn des Gesprächsparnters viele der
Unlogikkeiten, Zweideutigkeiten und Widersprüche wieder ausgleicht, die
wir tagtäglich so von uns geben.
Guten Morgen,
vielen Dank für die Hilfe.
Auch wenn manche vielleicht nicht so begeistert sind von Leuten die
dumme Fragen stellen, weil sie nicht mehr weiter wissen.
Aber es hat am Ende alles funktioniert... und verstanden habe ich durch
eure Hilfe
Thanks!
Karl Heinz schrieb:> Das eine benennen wir> mit Tag/Monat/Jahr, während wir für das andere 'Tage' benutzen
In der Praxis stimmt das so nicht, was man schon an der Aussage "ich bin
30 Jahre alt" sieht. Aber beim Programmieren ist es zweckmässig, das so
zu machen, eine von mir verwendete Datenbank stellte dazu die Funktion
"Julianday" zur Verfügung, die die Anzahl der Tage ab einem historischen
Datum liefert (welches ist eigentlich egal) als long integer, damit kann
man dann bequem rechnen und bei Bedarf das Ergebnis auch wieder in ein
Datum verwandeln. 30 Tage Zahlungsziel ist also kein Problem, aber 10
Jahre Mietdauer auch nicht. Die meisten Computersysteme arbeiten nach
dem gleichen Prinzip, siehe Unix.
Meiner Erinnerung nach gibt es irgendwo eine allumfassende Library zur
Datumsberechnung mit allen Verrücktheiten wie gregorianische
Kalenderreform, Jahr Null usw., damit kann man angeblich jedes Datum
berechnen, auch einen Wochentag 10000 v.C. oder Tage römisch ab urbe
condita oder im Mayakalender (besonders für Esoteriker). Aber sowas
sollte man nur auf sich nehmen wenn man es unbedingt braucht.
Georg