none
Aufgabe: Speedometer! RRS feed

  • Frage

  • Hallo Leute,

    ich brauche bei folgender Übungs-Aufgabe unbedingt eure Hilfe. Für die Programmier-und C# Cracks unter euch is das bestimmt ein Kinderspiel. Demjenigen oder denjenigen die mir helfen können werde ich danach auch ein Sixpack über PayPal spendieren!!

    Hier die Aufgabenstellung: (Das ganze soll natürlich in Visual Studio gemacht werden)

    "Zu implementieren ist ein Dialog zur Geschwindigkeitsanzeige. "
    Hier ein Bild davon:  http://tinypic.com/view.php?pic=2na49z9&s=6

    1. Kernfunktionalität

    a.) Der Benutzer kann den Anzeigebereich (Minimum, Maximum, Anzahl eingezeichne-ter Positionen) festlegen. Dabei dürfen Minimum und Maximum im Bereich von 0 bis 250 liegen und der Wert des Maximums muss größer als der des Minimums sein.

    b.) Der Wertebereich wird durch Positionsstriche innerhalb einer Ellipse (s. 1a) angezeigt, wobei ca. 120 Grad ausgespart werden. Über einen Schieber kann der aktuelle ganz-zahlige Wert der Anzeige eingestellt werden. Die Anzeige erfolgt graphisch über eine „Anzeigenadel“ innerhalb der Ellipse.

    c.) Der Benutzer kann optional Werte bei den Positionsstrichen anzeigen lassen.

    d.) Die Anzeige des aktuellen Anzeigenwerts kann optional zusätzlich über die Darstel-lung des Zahlenwerts zentriert im unteren Drittel der Anzeigefläche erfolgen.

    e.) Optional kann die Anzeige über eine Balkendarstellung im oberen Drittel ergänzt wer-den.


    2. Erweiterte Funktionalität

    a.) Implementieren Sie ein Menü über das u.A. der Font der Anzeige eingestellt werden kann und der Dialog beendet werden kann.
    b.) Implementieren Sie weiterhin, dass die Schriftgröße der Anzeige eingestellt werden kann, und dass sie kursiv und fett dargestellt werden kann.


    Es wäre der Wahnsinn wenn ihr mir helfen könntet!! und anschließend als .zip per E-Mail schickt oder so...


    • Bearbeitet Robert BreitenhoferModerator Montag, 18. Juni 2012 06:47 Titel Korrektur: war Suche dringend Hilfe bei folgender Aufgabe: Speedometer!
    Freitag, 1. Juni 2012 21:05

Antworten

  • Hallo,

    eine Übungsaufgabe, also eine Aufgabe aus der Schule/Praktikum/Studium? Man lernt "mit der Hand am Arm", also indem man sich hinsetzt, sich selbst Gedanken über einen Lösungsweg macht und anfängt, die Aufgabe praktisch umsetzt.

    Wenn Du Fragen zu dedizierten Problemen hast, wirst Du mit Sicherheit hier Antworten bekommen, aber Du wirst hier keine vorgefertigte komplette Lösung der Aufgabe erhalten. Wo wäre da auch sonst der Lerneffekt? 


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Samstag, 2. Juni 2012 02:49

Alle Antworten

  • Hallo,

    eine Übungsaufgabe, also eine Aufgabe aus der Schule/Praktikum/Studium? Man lernt "mit der Hand am Arm", also indem man sich hinsetzt, sich selbst Gedanken über einen Lösungsweg macht und anfängt, die Aufgabe praktisch umsetzt.

    Wenn Du Fragen zu dedizierten Problemen hast, wirst Du mit Sicherheit hier Antworten bekommen, aber Du wirst hier keine vorgefertigte komplette Lösung der Aufgabe erhalten. Wo wäre da auch sonst der Lerneffekt? 


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Samstag, 2. Juni 2012 02:49
  • Das ist ein Troll. Das ist einfach zu dick aufgetragen um echt zu sein.
    Montag, 4. Juni 2012 05:56
  • Hi Freunde, gesagt getan! Habe jetzt soweit programmiert wie ich es verstanden habe, aber jetzt hab ich ein Problem oder gleich mehrere und komm nicht mehr weiter. Könnt ihr mir helfen?

    Folgende Probleme:

    1) Wenn ich die Tachonadel nach rechts schiebe, geht sie nur bis zum Wert 10.... erst wenn ich oben bei Maximum einen wert höher oder tiefer stelle (also von 150 auf 151 oder 149) geht sie auch tatsächlich bis zu diesem wert. Woran liegt das dass es beim Programmstart nur bis 10 geht? Ich finde den Fehler nicht...

    2) Leider fängt meine Tachonadel nicht bei 0 an und hört auch nicht beim Maximalwert auf, sondern ist leicht verschoben...

    3) Wie bekomme ich bei meiner Tachoanzeige auch die Zahlen unter meine Tachostriche? also nehmen wir an ich habe 10 Positionen (also 10 Tachostrichte) müsste ich folgende abstände haben 0, 15, 30, 45 usw... wie programmiert man das?

    Hab das Programm auch mal hochgeladen, dann ist es für euch vielleicht einfacher den Code zu durchschauen.

    http://www.file-upload.net/download-4417902/-bungsaufgabe_v1.rar.html     (Download-Button ist der kleine mit dem grünen Pfeil nach unten)

    Hier mein Quellcode:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;


    namespace Uebungsaufgabe_v1
    {
        public partial class frmSpeedometer : Form
        {
            public frmSpeedometer()
            {
                InitializeComponent();
            }

            private void frmSpeedometer_Load(object sender, EventArgs e)
            {

            }

            private void numMin_ValueChanged(object sender, EventArgs e)
            {
                trkBar.Minimum = (int)(numMin.Value);
                ticks();
                Refresh();
            }

            private void numMax_ValueChanged(object sender, EventArgs e)
            {
                trkBar.Maximum = (int)(numMax.Value);
                ticks();
                Refresh();
            }

            private void numPos_ValueChanged(object sender, EventArgs e)
            {
                ticks();
                Refresh();
            }

            private void chkboxBalkenanzeige_CheckedChanged(object sender, EventArgs e)
            {
                if (chkboxBalkenanzeige.CheckState == CheckState.Checked)
                {
                    prgBalken.Visible = true;
                }
                else
                {
                    prgBalken.Visible = false;
                }
            }

            private void chkboxZahlenangabe_CheckedChanged(object sender, EventArgs e)
            {
                if (chkboxZahlenangabe.CheckState == CheckState.Checked)
                {
                    txtboxAnzeige.Visible = true;
                }
                else
                {
                    txtboxAnzeige.Visible = false;
                }
            }

            private void chkboxPositionswerte_CheckedChanged(object sender, EventArgs e)
            {
                Refresh();
            }

            private void trkBar_Scroll(object sender, EventArgs e)
            {
                txtboxAnzeige.Text = "" + trkBar.Value;
                prgBalken.Minimum = trkBar.Minimum;
                prgBalken.Maximum = trkBar.Maximum;
                prgBalken.Value = trkBar.Value;
                Refresh();
            }

           



            //Tachoanzeige


            private void FrmSpeedometer_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                tachoDraw(e.Graphics, 0, 0, groupBoxAnzeige.Width - 20, groupBoxAnzeige.Height - 120);
            }

            private void tachoDraw(Graphics gr, int left, int top, int width, int height)
            {
                float dotRad = 0.01f;


                Brush brush = new SolidBrush(this.ForeColor);
                Pen pen = new Pen(brush);
                Font drawFont = new Font("Arial", 12);
               

                pen.Width = 2.5f;
                //große Ellipse
                gr.DrawEllipse(pen, left + 8, top + 15, width, height);


                //Mittelpunkt
                gr.FillEllipse(brush, (float)(left + 8 + width / 2 - 3), (float)(top + 15 + height / 2 - 3), 6, 6);


                gr.TranslateTransform((float)(left + 8 + width / 2), (float)(top + 15 + height / 2));
                gr.ScaleTransform(width, height);

                gr.RotateTransform(150);

                for (int ticks = 0; ticks < numPos.Value; ticks++)
                {

                    gr.FillRectangle(brush, 0.5f - 4 * dotRad, -dotRad, 4 * dotRad, 2 * dotRad);
                    gr.RotateTransform(240f / ((float)(numPos.Value - 1)));
                }


                gr.RotateTransform(330);

           
                pointerDraw(gr, brush, -10f, 1f);


                gr.ResetTransform();
            }

            private void pointerDraw(Graphics gr, Brush brush, float pos, float relLength)
            {
                GraphicsState grState = gr.Save();


                gr.RotateTransform(((int)(240 * (trkBar.Value / (numMax.Value - numMin.Value)) + 120)));


                gr.FillPolygon(brush, new PointF[]{
                                      new PointF(0,0),            new PointF(0.05f, 0.02f),
                                      new PointF(0.2f,  0.005f),  new PointF(0.5f,  0.005f),
                                      new PointF(0.5f, -0.005f),  new PointF(0.2f, -0.005f),
                                      new PointF(0.05f,-0.02f),   new PointF(0,0)});

                gr.Restore(grState);

            }
            private void ticks()
            {
                trkBar.TickFrequency = (int)(((float)(trkBar.Maximum - trkBar.Minimum) / (float)numPos.Value));
                if (trkBar.TickFrequency >= 20)
                    trkBar.TickFrequency = 20;
            }

            private void groupBoxAnzeige_Enter(object sender, EventArgs e)
            {

            }


            private void chkClock_CheckedChanged(object sender, EventArgs e)
            {
                if (chkClock.CheckState == CheckState.Checked)
                {
                    txtboxClock.Visible = true;
                }
                else
                {
                    txtboxClock.Visible = false;
                }
            }

           

            private void txtboxClock_TextChanged(object sender, EventArgs e)
            {

            }

            private void timer1_Tick_1(object sender, EventArgs e)
            {
                txtboxClock.Text = DateTime.Now.ToString();
                Invalidate();
                Update();
            }

            private void butExit_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }
          

          
        }
    }

    Wäre echt super wenn ich jetzt eine Hilfe bekäme!! Danke schonmal für alle die sich Mühe machen sich einzulesen!

    Dienstag, 5. Juni 2012 11:12
  • Hi Freunde, gesagt getan! Habe jetzt soweit programmiert wie ich es verstanden habe, aber jetzt hab ich ein Problem oder gleich mehrere und komm nicht mehr weiter. Könnt ihr mir helfen?

    Folgende Probleme:

    1) Wenn ich die Tachonadel nach rechts schiebe, geht sie nur bis zum Wert 10.... erst wenn ich oben bei Maximum einen wert höher oder tiefer stelle (also von 150 auf 151 oder 149) geht sie auch tatsächlich bis zu diesem wert. Woran liegt das dass es beim Programmstart nur bis 10 geht? Ich finde den Fehler nicht...

    Hallo kamikazemohr,

    Bitte folge was Olaf Dir in seinem Beitrag geschrieben hat. Gib Dir ein wenig mehr Mühe die Sachen zu verstehen, zu lesen und experimentieren.

    Also zu Frage 1) kannst Du sehen das trkBar (System.Windows.Forms.TrackBar) die Eigenschaft Maximum auf 10 hat und so startet auch dein Programm aber numMax (System.Windows.Forms.NumericUpDown) hat den Wert von 150 beim Start…einfach diese Werte abgleichen und der Punkt 1) ist gelöst:

            private void frmSpeedometer_Load(object sender, EventArgs e)

            {

                trkBar.Maximum = (int)numMax.Value;

            }

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 14. Juni 2012 14:26
    Moderator
  • Wenn man "minimum" auf 20 setzt, dann ist auch "2)" gelöst...

    Verschieb die Tachonadel doch einfach immer um diese 20 vor!

    Sonntag, 17. Juni 2012 10:19