Autor Beitrag
Guennesack
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 16.05.08 17:57 
hallo zusammen ich weiß das jetzt viele von euch die hände vor dem kopf zusammen schlagen aber für mich als anfänger ist es ein großes problem.

und zwar habe ich in einem programm eine rechnung die eine zeit in minuten ausgibt, diese wird auch angezeigt z.b. "125 minuten"

jetzt möchte ich aber das dor nicht mehr minuten stehen sondern in diesem fall "2 Stunden und 5 Minuten".

ich bin total am verzweifen, wie kann ich das lösen??

bin für jeden hilfe dankbar.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 16.05.08 18:17 
Die schreibst überhaupt nichts davon, welche Klassen und Methoden Du verwendest. Also müssen wir raten...

Meine Vermutung ist: Wenn diese Zeitangabe Ergebnis einer Rechnung ist, dann handelt es sich um einen TimeSpan-Wert. Mit TimeSpan.Hours usw. bekommst Du die Einzelwerte; bei TimeSpan.ToString() kannst Du als Argument genau festlegen, wie die Ausgabe formatiert werden soll.

Einzelheiten sind immer in der SDK-Doku nachzulesen; diese sollte sowieso das wichtigste Hilfsmittel sein - vor allem Foren. Jürgen
arj
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: Fr 16.05.08 19:40 
Andererseits gibt es auch die "mathematische" Lösung:
Wieviele Minuten sind in einer Stunde? :-)
(Division und Modulo sollten helfen)
Guennesack Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 16.05.08 22:55 
wie schon gesagt bin halt ein ziehlicher neuling,
es geht um die berechnung von übertragungs zeiten bei up bzw downloads.
man gibt halt die groesse der datei und seine internetgeschwindigkeit an und es wird die übertragungszeit in minuten berechnet.


so sieht mein rechen teil aus:

ausblenden C#-Quelltext
1:
2:
3:
            x = groesse * 1024 / speed;             
            round = x / 60;
            time = Math.Round(round, 2);


es sind alles double variablen.

und als ausgabe habe ich ein ganz normales label

ausblenden C#-Quelltext
1:
labTIME.Text = Convert.ToString(time);					


wie kann ich das nun in so eine TimeSpan geschichte eingringen?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 17.05.08 10:36 
Siehste, mehr Informationen helfen den Helfern. Wenn Du alles als double verwendest, dann bin ich mit meinem TimeSpan-Hinweis fehl am Platze. Aber arj's Hinweis passt.

Nach Deiner Eingangsfrage vermute ich, dass die double-Variable time auf die Einheit "Minuten" ausgerichtet ist. Daraus solltest Du eine int-Variable machen, damit die Vorteile der int-Division zum Tragen kommen. Dann benutzt Du die normale String.Format()-Methode mit genauer Angabe des gewünschten Formats:
ausblenden C#-Quelltext
1:
2:
int minutes = (int)time;
labTIME.Text = String.Format("{0} Stunde/n {1} Minuten", minutes / 60, minutes % 60);

Zur Erläuterung: Bei Integers liefert die normale Division einen int-Wert (ggf. abgerundet); was modulo macht, ist hoffentlich bekannt. Zu String.Format() bietet die SDK-Doku viele zusätzliche Hinweise.

Zitat:
wie kann ich das nun in so eine TimeSpan geschichte eingringen?

Das geht schon, man muss nur in der SDK-Doku nachlesen, welche Varianten es für den Konstruktor gibt, darunter:
ausblenden C#-Quelltext
1:
TimeSpan timeDiff = new TimeSpan(0, (int)time, 0);					

Aber dieser Weg lohnt sich bei Deinem Vorgehen über double nicht.

Allgemeine Hinweise: Die Convert-Methoden sollten möglichst nicht benutzt werden. Wenn aus einem Wert ein String werden soll, ist ToString() die Standardmethode; dabei gibt es oft auch Möglichkeiten der Formatierung (z.B. bei DateTime), die es bei Convert.ToString() nicht gibt. Wenn aus einem String ein "anderer" Wert werden soll, sind Methoden wie Parse, ParseExact, TryParse, TryParseExact (sofern vorhanden) entschieden besser.

Und wie ich schon zur SDK-Doku schrieb:
Zitat:
diese sollte sowieso das wichtigste Hilfsmittel sein - vor allen Foren.

Gruß Jürgen
Guennesack Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 17.05.08 15:38 
vielen dank hat funktioniert.

und da es mir nicht gefallen hat das dort bei einigen fällen 0 Stunden 30 Minuten stand. habe ich vorher noch eine klene if else bedingung gemacht.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            if (time > 60)
            {
                int minutes = (int)time;
                labTIME.Text = String.Format("{0} Stunde/n {1} Minuten", minutes / 60, minutes % 60);
            }
            else
            {
                labTIME.Text = time + " Minuten";
            }




jetzt habe ich noch einene kleine frage.

ich lesen die groesse der datei deren zeit berechnet werden soll über eine MaskedTextBox ein, wenn ein inhalt drinn steht klappt es wunderbar, wird das feld aber leer gelassen stürzt das programm ab. wie kann ich das verhindern??
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 17.05.08 16:23 
user profile iconGuennesack hat folgendes geschrieben:
ich lesen die groesse der datei deren zeit berechnet werden soll über eine MaskedTextBox ein, wenn ein inhalt drinn steht klappt es wunderbar, wird das feld aber leer gelassen stürzt das programm ab. wie kann ich das verhindern??

Zu dieser Art der Fragestellung hatte ich mich schon geäußert:
user profile iconJüTho hat folgendes geschrieben:
Du schreibst überhaupt nichts davon, welche Klassen und Methoden Du verwendest. Also müssen wir raten...

Wie soll eine MaskedTextBox die Größe einer Datei erfahren? Wie kommt der Wert dort 'rein? Wie kommt der Wert von dort in eine andere Variable, und in welche?

"stürzt das Programm ab" ist immer ein Zeichen dafür, dass eine try-catch-Prüfung fehlt.

Jürgen
Guennesack Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 17.05.08 16:50 
user profile iconJüTho hat folgendes geschrieben:

Zu dieser Art der Fragestellung hatte ich mich schon geäußert:
user profile iconJüTho hat folgendes geschrieben:
Du schreibst überhaupt nichts davon, welche Klassen und Methoden Du verwendest. Also müssen wir raten...

Jürgen


entschudigung ich vergas.

hier mal wieder der code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
            int groesse=0;
            int speed=0;
            int x=0;
            int time=0;

//Einlesen--------------------------------------------------
            groesse = Convert.ToInt32(mtxtMB.Text);
            speed = Convert.ToInt32(mtxtSPEED.Text);




//Berechnen-------------------------------------------------
            x = groesse * 1024 / speed;             
            time = x / 60;
           

//Ausgabe----------------------------------------------------
            if (time > 60)
            {
                int minutes = (int)time;
                labTIME.Text = String.Format("{0} Stunde/n {1} Minuten", minutes / 60, minutes % 60);
            }
            else
            {
                labTIME.Text = time + " Minuten";
            }
        }


jetzt habe ich halt das problem das bei einer leeren textbox, visual eine meldung rausgibt wenn ich den rechnen button klicke.
"FormatException wurde nicht behandelt"

wie gekomme ich das hin das erkannt wird das die box leer ist, und ich dann z.b. ein auf einem label eine meldung ausgebe?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 17.05.08 17:49 
In diesem Fall ging es mir nicht darum, den gesamten Code erneut zu lesen. Du hast aber erstmals von einer MaskedTextBox geschrieben; also will ich natürlich all das lesen, was dazu gehört.
Zitat:
wie gekomme ich das hin das erkannt wird das die box leer ist,

Das ist eine wichtige Prüfung für Strings, die zum Standardrepertoire gehört:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (String.IsNullOrEmpty(mtxtMB.Text)) {
    MessageBox.Show("Stop! Wo bleibt die Dateigröße?!");
else {
    groesse = Int32.Parse(mtxtMB.Text);
}

Oder eine andere Variante:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (!Int32.TryParse(mtxtMB.Text), out groesse)) {
    MessageBox.Show("Stop! Die Dateigröße konnte nicht umgewandelt werden.");
else {
    //  korrekt, also weiter mit der Arbeit
}

Oder als schlechteste Lösung mit try-catch:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
try {
    groesse = Convert.ToInt32(mtxtMB.Text);
catch(Exception ex) {
    MessageBox.Show(ex.ToString());
}

Jetzt hast Du soviel Material, dass Du mit den verwendeten Klassen und Methoden in der SDK-Doku und z.B. in OpenBook C# sowie OpenBook Visual C# viele Erläuterungen finden solltest.

Wenn ich solche Hinweise gebe, erwarte ich, dass man sie nachliest und zu verstehen versucht. Wenn ich empfehle, nicht Convert.ToXxx zu verwenden, sondern Parse usw. vorschlage, hat das auch seinen Sinn. Wenn ich merke, dass meine Ratschläge nicht genutzt werden, verliere ich die Lust zu helfen (wie unter Buchstaben löschen von Text gerade zu sehen ist.

Jürgen
Guennesack Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 17.05.08 18:18 
danke danke danke, hat mir sehr weitergeholfen.

das programm läuft jetzt so wie ich es mir gewünscht habe.

ein großes lob an deine ausdauer JüTho.

mit besten gruß guennesack