JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=3b86b928591635f4098b6fa1f66901a6Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

C# Graphic
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 26.02.2012, 14:06    Titel: C# Graphic Antworten mit Zitat

Hallo,

kann man irgend wie eine try-catch Methode für ein Taschenrechner bauen
der zwei eingabe felder abfängt für alle rechenoperationen?

Baue mir gerade ein kleinen Forms Taschenrechner zusammen und will da was mit try catch machen.

Will nicht in jeder Rechenoperation nen neuen try-catch hineinschreiben.

So weit bin ich erst und henge gedanklich fest.

CPP:
 private void buttonBrechnen_Click(object sender, EventArgs e)
        {
            float zahl1, zahl2, ergebnis = 0;
            bool divDurchNull = false;
            // die beiden Zahlen einlesen und konvertieren
            zahl1 = Convert.ToSingle(textBoxZahl1.Text);
            zahl2 = Convert.ToSingle(textBoxZahl2.Text);

            // Die Rechenoperation ermitteln und ausführen
            if (radioButtonAddition.Checked == true)
            {
                ergebnis = zahl1 + zahl2;
            }
            if (radioButtonSubtraktion.Checked == true)
            {
                ergebnis = zahl1 - zahl2;
            }
            if (radioButtonMultiplikation.Checked == true)
            {
                ergebnis = zahl1 * zahl2;
            }
            if (radioButtonDivision.Checked == true)
            {
                if (zahl2 == 0)
                {
                    divDurchNull = true;
                }
                else
                {
                    ergebnis = zahl1 / zahl2;
                }
            }
            // wurde durch Null dividiert?
            if (divDurchNull == true)
            {
                labelAnzeigen.Text = "Nicht definiert!";
            }
            else
            {
                labelAnzeigen.Text = Convert.ToString(ergebnis);
            }
        }


mfg Patrick


Zuletzt bearbeitet von City Hunter am 07.03.2012, 17:50, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 26.02.2012, 14:59    Titel: Antworten mit Zitat

Was willst du denn alles abfangen? Und was kann der Taschenrechner?

Also Division durch 0 kannst du so wie du gemacht hast abfangen.

Eine echte Möglichkeit mit Try-Catch wäre aber z.B.
CPP:
private void buttonBrechnen_Click(object sender, EventArgs e)
{
  try {
[...]
    if(radioButtonAddition.Checked) {
      ergebnis = zahl1 + zahl2;
    }
[...]
    labelAnzeigen.Text = ergebnis.ToString();
  } catch(Exception e) {
    labelAnzeigen.Text = "Error: " + e.Message;
  }
}

Damit fängst du alle Fehler ab, welche auftreten können und gibst ggf. den Fehlertext aus.

Alternative Vorgehensweisen:
- Eingabevalidierung
- Ausgrauen der Option "Dividieren", wenn die 2. Zahl eine 0 ist

HTH
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 26.02.2012, 15:06    Titel: Antworten mit Zitat

ich dachte für null nehme ich dafür extra die Exception die gibs.

Mal schauen ob ich das hinbekomme.

wenn nicht melde ich mich denn wieder. Danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 26.02.2012, 15:43    Titel: Antworten mit Zitat

Hm der catch wird nicht ausgefürt
wenn ich Dividiere

CPP:
catch (DivideByZeroException)
            {
                MessageBox.Show("Eine Division durch Null ist nicht definiert.", "Error");
            }


Habe ich da irgend wo ein fehler drin?
Kode komplett.
CPP:
 private void buttonBrechnen_Click(object sender, EventArgs e)
        {
            float zahl1, zahl2, ergebnis = 0;
            // die beiden Zahlen einlesen und konvertieren     

            try
            {
                zahl1 = Convert.ToSingle(textBoxZahl1.Text);
                zahl2 = Convert.ToSingle(textBoxZahl2.Text);
                // Die Rechenoperation ermitteln und ausführen
                if (radioButtonAddition.Checked == true)
                {
                    ergebnis = zahl1 + zahl2;
                }

                if (radioButtonSubtraktion.Checked == true)
                {
                    ergebnis = zahl1 - zahl2;
                }

                if (radioButtonMultiplikation.Checked == true)
                {
                    ergebnis = zahl1 * zahl2;
                }

                if (radioButtonDivision.Checked == true)
                {
                    ergebnis = zahl1 / zahl2;
                }
                labelAnzeigen.Text = ergebnis.ToString();
            }
            catch (DivideByZeroException)
            {
                MessageBox.Show("Eine Division durch Null ist nicht definiert.", "Error");
            }
            catch (FormatException)
            {
                MessageBox.Show("Error", "Error");
            }
           
        }
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 26.02.2012, 17:56    Titel: Antworten mit Zitat

So habe das Programm jetzt erweitert.
CPP:
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;

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

        float check(float zahl1, float zahl2)
        {
            float ergebnis = 0;
            bool divDurchNull = false;
            try
            {
                zahl1 = Convert.ToSingle(textBoxZahl1.Text);
            }
            catch (FormatException)
            {
                MessageBox.Show("Es ist ein Fehler aufgetreten bei der Konvertirung in der Eingabe 1: " + textBoxZahl1.Text, "Fehler");
                textBoxZahl1.Select();
            }
            try
            {
                zahl2 = Convert.ToSingle(textBoxZahl2.Text);
            }
            catch (FormatException)
            {
                MessageBox.Show("Es ist ein Fehler aufgetreten bei der Konvertirung in der Eingabe 2: " + textBoxZahl2.Text, "Fehler");
                textBoxZahl2.Select();
            }

            // Die Rechenoperation ermitteln und ausführen
            if (radioButtonAddition.Checked == true)
            {
                ergebnis = zahl1 + zahl2;
            }

            if (radioButtonSubtraktion.Checked == true)
            {
                ergebnis = zahl1 - zahl2;
            }

            if (radioButtonMultiplikation.Checked == true)
            {
                ergebnis = zahl1 * zahl2;
            }

            if (radioButtonDivision.Checked == true)
            {
                //wird eine Division durch Null versucht?
                if (zahl2 == 0)
                    divDurchNull = true;
                else
                    ergebnis = zahl1 / zahl2;
            }
            //wurde durch Null dividiert?
            if (divDurchNull == true)
            {
                labelAnzeigen.Text = "Nicht definiert!";
            }
            else
            {
                labelAnzeigen.Text = Convert.ToString(ergebnis);
            }
            return ergebnis;
        }
        private void buttonBeenden_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void buttonBrechnen_Click(object sender, EventArgs e)
        {
            float zahl1 = 0;
            float zahl2 = 0;
            check(zahl1, zahl2);
        }
    }
}




Wenn ich jetzt nen Buchstabe eingeben egal in welcher rechenart wird leider die Zahl ausgegeben die noch in der TextBox drin ist. Kann man da irgend was machen das es da null bleibt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 04.03.2012, 21:55    Titel: Antworten mit Zitat

Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber du solltest in den catches für die FormatException direkt ein return einbauen und ggf. vorher das Label fürs Ergebnis zurücksetzen.
Du möchtest ja eigentlich nicht, dass überhaupt angefangen wird, herumzurechnen, wenn schon das Konvertieren nicht klappt.

PS: Ist es beabsichtigt, dass du für die beiden Parameter einfach immer 0 reingibst? Oder wolltest du die eigentlich als out-Parameter definieren?

Noch eine Anmerkung: Die divDurchNull-Variable könntest du auch weglassen und den Code wesentlich schlanker gestalten:
CPP:
if( radioButtonDivision.Checked == true )
{
    //wird eine Division durch Null versucht?
    if( zahl2 == 0 )
    {
        labelAnzeigen.Text = "Nicht definiert!";
        return 0;
    }

    ergebnis = zahl1 / zahl2;
}

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 07.03.2012, 17:54    Titel: Antworten mit Zitat

So habe das Thema mal umgestellt.

Bastell gerade mit der Graphic von C# rum. irgend wie bekomme ich das nur hin das rechtecke und kreise von Aussen nach innen gezeichnet werden aber nicht umgekehrt. hat einer da eine Internet seite für mich wie ich von innen nach aussen das so animieren lassen kann?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 19.03.2012, 13:33    Titel: Antworten mit Zitat

Sagt mal,

Rechteck im Panel zeichne lasse und das animiert von innen nach ausen. wie bekomme ich das hin das er nicht über das Panel zeichnet.

Habe mir das überlegt mit einer do while schleife aber irgend wie kriege ich die größe des panels nicht in die schleife rein.

wie würdet ihr das machen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 20.03.2012, 10:50    Titel: Antworten mit Zitat

Ich weis zwar nicht, was du genau machen möchtest, aber Animationen per GDI Befehle zu machen finde ich schon ziemlich aufwändig.

Du kannst für deine Begrenzungen die Clip-Funktion nutzen. Müsste eine Funktion oder Eigenschaft von Graphics sein.

Für komplexere Animationen würde ich aber empfehlen, dir mal WPF anzuschauen, samt Tigger, Datenbindung und eben Animationen. Diese Techniken kannst du dann auch später in Windows8 innerhalb der Metrooberfläche nutzen, dort ist GDI nämlich tabu.

MfG AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 21.03.2012, 17:47    Titel: Antworten mit Zitat

Na ich mache gerade so bissel Übungen. hab nen Panel und da wollte ich ein Rechteck mittig von innen nachausen laufen lassen und denn wieder umgekehrt.

Gut zu wissen mit WPF und Windows8 Dank dir für die Info. Muss ich mir noch ein WPF buch besorgen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 25.03.2012, 13:04    Titel: Antworten mit Zitat

Code:
Fehler   1   Eine implizite Konvertierung vom Typ "System.Drawing.Drawing2D.HatchStyle" in "System.Drawing.Drawing2D.HatchBrush" ist nicht möglich.   E:\Patrick\Eigene Dokumente\Visual Studio 2010\Projects\C#\Zeichen Programm\Zeichen Programm\FarbInfo.cs   39


Ich bekomme diesen Fehler, kann man das irgend wie Konventieren in irgend einer art?

hier der Code dazu
Code:

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;

namespace Zeichen_Programm
{
    public partial class FarbInfo : Form
    {
        // für die Zeichenfläche
        Graphics infoflaeche;
        // für den Stift
        Pen stiftInfo;
        // für den Pinsel
        SolidBrush pinselInfo;
        // Denn für ein MusterPinsel
        System.Drawing.Drawing2D.HatchBrush musterPinselInfo;
        // Muster oder Farbe?
        bool FarbMuster;

        public FarbInfo(Color stiftFarbe, float stiftdicke, System.Drawing.Drawing2D.DashStyle stiftStil, bool fuell, Color pinselFarbe, System.Drawing.Drawing2D.HatchStyle pinselMuster)
        {
            InitializeComponent();
            // Instanzen für die Stifte und die Pinsel erzeugen
            stiftInfo = new Pen(Color.Black);
            pinselInfo = new SolidBrush(Color.Black);
            musterPinselInfo = new System.Drawing.Drawing2D.HatchBrush(System.Drawing.Drawing2D.HatchStyle.Cross, Color.Black);
            infoflaeche = this.CreateGraphics();
            // Speichern in stiftInfo, pinselInfo und musterPinselInfo
            stiftInfo.Color = stiftFarbe;
            stiftInfo.Width = stiftdicke;
            stiftInfo.DashStyle = stiftStil;
            FarbMuster = fuell;
            pinselInfo.Color = pinselFarbe;
            musterPinselInfo = pinselMuster;
        }

        private void FarbInfo_Paint(object sender, PaintEventArgs e)
        {
            Pen stift = new Pen(Color.Black);
            infoflaeche.DrawRectangle(stift, 19, 19, 101, 101);
            if (FarbMuster == false)
            {
                infoflaeche.FillRectangle(pinselInfo, 20, 20, 100, 100);
            }
            infoflaeche.DrawLine(stiftInfo,10,200,265,200);
        }
    }
}


Würde dankbar sein wenn man mir helfen kann.

Ich will Sachen ausem Hauptformular in das Formular holen. alles macht erm it nur das brush und style nicht
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 25.03.2012, 20:53    Titel: Antworten mit Zitat

Ich rate mal einfach so in den Raum hinein.
CPP:
new HatchBrush(myHatchStyle, color1, color2)


http://msdn.microsoft.com/en-us/library/68k5a94e.aspx
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 28.03.2012, 20:12    Titel: Antworten mit Zitat

AFE-GmdG hat Folgendes geschrieben:
Ich rate mal einfach so in den Raum hinein.
CPP:
new HatchBrush(myHatchStyle, color1, color2)


http://msdn.microsoft.com/en-us/library/68k5a94e.aspx


Danke AFE. Habe das Problem gelöst und ich hatte den code schon so 3 mal geschrieben und beim vierten mal ging das.

Sag mal AFE. Ich arbeite ja gerade an ein kleines Zeichenprogramm zum testen. nutze gerade die GetPixel; MSN
Für Pixel Kopieren. Aber das macht er ja nur wenn er ein Dateiname hat.
Wenn ich das Programm starte und bissel rummalse und denn GetPixel() nutze bekomme ich eine Exception weil er ja keine Dateinamen.endung drin hat. Wie kann ich das umgehen? Mit ein TempDatei?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 29.03.2012, 08:02    Titel: Antworten mit Zitat

Die Funktion GetPixel ist doch nur eine Instanzfunktion auf ein Bitmap-Objekt.
Dabei ist es unerheblich, ob das ein jpg, bmp oder png ist, auch ist es unerheblich, ob die Datei überhaupt gespeichert wurde.
Du kannst Bitmap-Objekte auch aus einem GrafikKontext eines Fensters erstellen. Abgesehen davon ist GetPixel sicherlich nicht die beste Möglichkeit. Möchtest du nur einzelne Pixel kopieren - Ok, aber wenn du komplette (rechteckige) Bereiche kopieren möchtest, geht das mit anderen Funktionen einfacher und vorallem schneller.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
City Hunter
Super JLI'ler


Alter: 38
Anmeldedatum: 18.04.2004
Beiträge: 330
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 29.03.2012, 16:25    Titel: Antworten mit Zitat

Nein AFE ich willl einfach nur gerne das Pixel haben den X,Y Koordinaten mehr nix. aber wie gesagt, GetPixel zeigt mir immer ein Exception an wenn ich es ausführe weil mein Zeichenprogramm kein Bildgeladen hat oder das aktuelle was ich gerade gemalt habe nicht abgespeichert habe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum