Variabeln Replacen
lima-city → Forum → Programmiersprachen → Basic
anfang
berechnen
code
dauer
ende
feld
funktion
gesamtdauer
http
minute
problem
string
stunden
system
tag
text
uhr
url
wichtig minuten
wichtig stunden
-
Hallo Zusammen,
Ich bastel mir derzeit ein kleines Programm um meine Arbeitstag/stunden">stunden auszurechnen.
Der aufbau ist relativ einfach gehalten.
31 Textboxen - 31 Variabeln.
Nun stoße ich auf ein Problem , auf der Stempelkarte ist die Uhrzeit in Dezimalzahlen geschrieben und das soll natürlich voher umgewandelt werden.
Es kommen nur folgende Dezimalzahlen vor:
:00
:05
:10
:15
:20
:25
:30
:35
:40
:45
:50
:55
:60
:65
:70
:75
:80
:85
:90
:95
Vor dem Doppelpunkt steht jeweils die Stunde Beispielsweise jetzt 12:35.
nun muss alles nach dem Doppelpunkt ausgetauscht werden.
05 ->3
10 ->6 usw.
Doch wie mache ich das? :)
Variabel Typ ist String
LG
Beitrag zuletzt geändert: 12.1.2014 22:11:28 von marvinkleinmusic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
1. Warum nicht einfach ausrechnen? Dafür musst du natürlich den String los werden. ;) Schau doch mal, ob es da ein Konstrukt deiner Sprache gibt oder du die Zahlen auch als Integer bekommen kannst.
2. Regex wäre zwar aufwändig, könnte aber auch helfen. -
Wie ist denn das genau Format? Werden die Stunden auch immer durch zwei Zeichen repräsentiert, also 6:00 Uhr, oder 06:00 Uhr? Das wäre nämlich interessant für die Verwendung in Left$ zur Ermittlung der Anzahl in Stunden. DIe Minuten jedenfalls würdest du über Right$ herausbekommen als String:
http://www.vbarchiv.net/workshop/workshop_27-left-right-und-mid-funktion-ganz-neu-und-mit-klasse.html
Anschließend könntest du den String in eine Zahl umwandeln:
http://stackoverflow.com/questions/7708838/how-do-i-convert-from-a-string-to-an-integer-in-visual-basic
und damit in Stunden umrechnen, indem du durch 100 dividierst und mit 60 mutliplizierst.
Hättest du also den Text "6:50" aus der Stempelkarte (was für 6:30 Uhr steht) würdest du die 50 bekommen, durch 100 x 60 = 30. -
Hallo ihr zwei! :)
Ersteinmal danke für eure Hilfe !:)
Ersteinmal so sieht derzeit der Umrechner aus und die Zahlen müssen in diesem Format so eingegeben werden.
http://s7.directupload.net/images/140113/aqjl2uqk.png
Wie man sehen kann habe ich den Rechner ein wenig Verändert sodass wir jetzt Insgesammt auf 31 x 4 Textboxen kommen. (Kommt - Geht Zur Pause - Wieder da - Feierabend.
Nun stoße ich auf 2 Probleme.
Das erste betrifft ja das Replacen sprich (@burgi dieser Artikel ist eine Große Hilfe , ebenso wie das /100x60 (Y) ).
Doch wie kann ich jetzt genau Auf den ersten Wert zugreifen und wie auf den zweiten Muss ich die jeweils in einer Variabel abspeichern oder geht das irgendwie einfacher?
Das zweite Problem besteht dadraus , das er der Umrechner auch ein Ergebnis ausgeben soll , doch ich weis nicht genau wie ich an dieses kommen kann.
Beispielsweise jetzt die ersten zwei Werte von Tag 1 sind jetzt:
Gekommen 06:45 ---> Umgerechnet 06:27 Uhr
Gegangen 14:05 ---> Umgerechnet 14:03 Uhr -->Macht 07:36 Stunden
Wie komme ich jetzt auf die Stunden und Minuten Zeitspanne , von der Zeit wie lange ich da war?
Es sind jeweils immer 4 Textboxen für einen Tag da.
LG
Beitrag zuletzt geändert: 13.1.2014 15:02:36 von marvinkleinmusic -
Also ich würde das so lösen:
Ich habe kurz einen Teil deines Programms nachgebastelt:
http://burgi.lima-city.de/forum/formular.png
Der Code für den Klick auf Button1 wäre in dem Beispiel dann dieser hier:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Dauer1 As Integer Dim Dauer2 As Integer Dim Anfang, Ende Dim Dauer As Integer Dim Dauer_Stunden As Integer Dim Dauer_Stunden_Str As String Dim Dauer_Minuten As Integer Dim Dauer_Minuten_Str As String 'ANFANG 'Stunden Anfang, WICHTIG: Stunden zweistellig!! Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(TextBox1.Text, 2)) 'Minuten Anfang, WICHTIG: Minuten zweistellig!! Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(TextBox1.Text, 2)) 'Anfang in Minuten umgerechnet 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen: Anfang = Dauer1 * 60 + Dauer2 / 100 * 60 'ENDE 'Stunden Anfang, WICHTIG: Stunden zweistellig!! Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(TextBox2.Text, 2)) 'Minuten Anfang, WICHTIG: Minuten zweistellig!! Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(TextBox2.Text, 2)) 'Ende in Minuten umgerechnet 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen: Ende = Dauer1 * 60 + Dauer2 / 100 * 60 'Dauer vormittag in Minuten Dauer = Ende - Anfang Dauer_Stunden = Dauer \ 60 'ganzzahlige Division If Dauer_Stunden < 10 Then Dauer_Stunden_Str = "0" & Convert.ToString(Dauer_Stunden) Else Dauer_Stunden_Str = Convert.ToString(Dauer_Stunden) End If Dauer_Minuten = Dauer - Dauer_Stunden * 60 If Dauer_Minuten < 10 Then Dauer_Minuten_Str = "0" & Convert.ToString(Dauer_Minuten) Else Dauer_Minuten_Str = Convert.ToString(Dauer_Minuten) End If TextBox5.Text = Convert.ToString(Dauer_Stunden_Str) & ":" & Convert.ToString(Dauer_Minuten_Str) End Sub
Der Code ist absichtlich mit vielen Zwischenschritten, um es für dich verständlich zu halten. Du kannst ja dann Schritte zusammenfassen!
Du musst natürlich auch die Ergebnisse (Dauer) nicht anzeigen, du kannst das auch in Variablen speichern. Aber so ist es einfacher nachzuvollziehen, und man sieht sofort, ob das Ergebnis stimmt. -
Hallo nochmal!
Das ist ja Spitze!
Besonders die Gründliche Kommentierung hat mir sehr weitergeholfen!
Jetzt kommt nur die Frage Wie ich das am Einfachsten für jeden Tag hinbekomme Da ja jeder Tag 4 Kästchen hat bräuchte ich dann ja 4 * 2 Variabeln Pro Tag das ganze mal 31 --->248 Variabeln.
Kann man dies noch einfacher Regeln?
LG -
marvinkleinmusic schrieb:
Kann man dies noch einfacher Regeln?
LG
Logisch: Schreib dir eine Funktion BerechneDauer, welcher du die Inhalte der beiden Textboxen Anfang und Ende übergibst, und der Rückgabewert ist die Dauer. Das wäre die einfachste Lösung meiner Meinung nach, weil dann hast du nur die Variablen in der Funktion, und auch nur einmal, und die wird immer wieder aufgerufen -
Hallo nochmal,
Ich bin ein absoluter Noob bezüglich Visual Basic.
Wie soll soeine Funktion denn aussehen?
und gibt es auch eine möglichkeit nur mit dieser Einen Funktion , auch die Werte für Tag 2-31 Ebenfalls zuberechnen?
(Da kommt dann wieder das problem das Leere Felder als 00:00 gezählt werden müssen)
Wenn du mir vielleicht noch zeigen könntest wie man 2 Tage sehr Simple mit Hilfe einer Funktion Berechnen kann und diese dann am Ende zusammen zählt , wäre ich einen riesen Schritt weiter! :)
(Ich nehme mal an eine Variabel endergebnis = tag1 + tag2 +tag3 usw)
LG -
Ne, das Summieren wäre auf jeden Fall mit einem Feld einfacher, da man da eine Schleife durchlaufen lassen kann. Würde dann so aussehen:
Private Function BerechneDauer(ByRef BeginnStr As String, ByRef EndeStr As String) As Integer ' gibt die Dauer aus zwei Textfeldern als Ineger in Minuten zurück Dim Dauer1 As Integer Dim Dauer2 As Integer Dim Anfang, Ende 'ANFANG 'Stunden Anfang, WICHTIG: Stunden zweistellig!! Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(BeginnStr, 2)) 'Minuten Anfang, WICHTIG: Minuten zweistellig!! Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(BeginnStr, 2)) 'Anfang in Minuten umgerechnet 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen: Anfang = Dauer1 * 60 + Dauer2 / 100 * 60 'ENDE 'Stunden Anfang, WICHTIG: Stunden zweistellig!! Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(EndeStr, 2)) 'Minuten Anfang, WICHTIG: Minuten zweistellig!! Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(EndeStr, 2)) 'Ende in Minuten umgerechnet 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen: Ende = Dauer1 * 60 + Dauer2 / 100 * 60 'Dauer vormittag in Minuten BerechneDauer = Ende - Anfang End Function Private Function MinutenInStunden(ByRef Dauer As Integer) As String ' gibt das Ergebnis als String für die Anzeige und/oder das Abspeichern zurück Dim Dauer_Stunden As Integer Dim Dauer_Stunden_Str As String Dim Dauer_Minuten As Integer Dim Dauer_Minuten_Str As String Dauer_Stunden = Dauer \ 60 'ganzzahlige Division If Dauer_Stunden < 10 Then Dauer_Stunden_Str = "0" & Convert.ToString(Dauer_Stunden) Else Dauer_Stunden_Str = Convert.ToString(Dauer_Stunden) End If Dauer_Minuten = Dauer - Dauer_Stunden * 60 If Dauer_Minuten < 10 Then Dauer_Minuten_Str = "0" & Convert.ToString(Dauer_Minuten) Else Dauer_Minuten_Str = Convert.ToString(Dauer_Minuten) End If MinutenInStunden = Convert.ToString(Dauer_Stunden_Str) & ":" & Convert.ToString(Dauer_Minuten_Str) End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DauerFeld_vormittag(0 To 30) As Integer Dim DauerFeld_nachmittag(0 To 30) As Integer Dim i As Integer Dim Gesamtdauer As Integer Dim GesamtdauerStr As String 'Dauer für vormittag in Minuten im Feld ablegen DauerFeld_vormittag(0) = BerechneDauer(TextBox1.Text, TextBox2.Text) TextBox5.Text = MinutenInStunden(DauerFeld_vormittag(0)) 'Dauer für nachmittag in Minuten im Feld ablegen DauerFeld_nachmittag(0) = BerechneDauer(TextBox3.Text, TextBox4.Text) TextBox6.Text = MinutenInStunden(DauerFeld_nachmittag(0)) 'hier den Code für die restlichen Tage berechnen ' ' 'Gesamtsumme berechnen: Gesamtdauer = 0 For i = 0 To 30 Gesamtdauer = Gesamtdauer + DauerFeld_vormittag(i) Gesamtdauer = Gesamtdauer + DauerFeld_nachmittag(i) Next GesamtdauerStr = MinutenInStunden(Gesamtdauer) Label5.Text = "Summe: " & GesamtdauerStr End Sub
Ich würde für meinen Code natürlich keine derartigen Funktions-Namen verwenden, allerdings denke ich, dass das den Code ganz gut für dich erklärt -
Huhu!
Ich danke dir ich habe es Erfolgreich geschafft Tag 2 mithilfe des Codes mit zu Berechnen!
Doch es gibt noch ein entscheidendes Problem.
Angenommen ich komme an Tag 1 nur 1 mal und gehe einmal , dann bleiben 2 Kästechen Leer.
Dann stürzt wieder das Programm ab weil die value von 2 Boxen leer ist.
Es muss noch eingebaut werden das leere Kästchen immer den wert 00:00 haben sonst bringt das nichts! :)
Einmal Fehlermeldung in VB: Die Eingabezeichenfolge hat das falsche Format.
LG
-
marvinkleinmusic schrieb:
Es muss noch eingebaut werden das leere Kästchen immer den wert 00:00 haben sonst bringt das nichts! :)
Dann mach das doch!?
Was ist denn dabei, den Standard-Text der Textboxen auf "00:00" zu setzen?
Andere Lösung: eine If-Abfrage in die Funktion zum Berechnen der Dauer in Minuten einbauen, die prüft, ober der Text = "" (also leer ist) ist, und wenn das Feld leer ist, mit 0 rechnen, oder die Berechnung komplett auslassen.
Das wirst du wohl selber hinbringen -
Hmm auch das bekomme ich nicht hin , ich habe mal ein wenig gegoogelt aber ich weis nicht wo ich die if Bedingung einbauen muss und auch nicht wie ich die Leeren TextBoxen nur Ansprechen kann , ich habe es mal so versucht allerdings ohne erfolg:
If TextBox(i).Text = "" Then TextBox(i).Text = "00:00" End If
-
Ich weiß ja nicht, welchen BASIC-Dialekt Du nutzt. (von mir überlesen, oder von dir nicht erwähnt.), aber es sollte doch eine Funkition wie split() geben.
Für dich nutzbar als
Dim Zeitwert = split(Datenerfassungswert, ":")
Zeitwert ist dann ein Array aus Stunden und 100stel, Die 100stel kannst Du dann, wie von Burgi empfohlen, in Sekunden wandeln
Daraus sollte sich ein gültiges Zeitformat deines verwendeten Basic-Dialektes erstellen lassen, das, mit sicher voirhandenen Date-/Time-Funktionen, weiter zu verarbeiten ist. Eine Auswertung wie Dauer = Endzeit - Startzeit und anschließende SummierungAuswertung derselben, sollte dann kein Problem mehr darstellen
Beitrag zuletzt geändert: 14.1.2014 3:30:51 von fatfreddy -
Hmm das hilft mir so alles nicht weiter.
Ich suche einen weg ganzeinfach alle leeren Textboxen die übermittelt werden , den wert 00:00 zuzuweisen.
LG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage