Autor Beitrag
KingSP
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 21.11.15 13:35 
Heyho,

ja ich bins wieder, ich hatte vor kurzem erst einmal gefragt ob ein bestimmtes Programm in C# möglich ist.

Ich habe mich nach überlegen einmal dran gesetzt und bin eigentlich auch zufrieden. Nur werde ich das Gefühl nicht los das es doch komfortabler geht. Bevor ich anfange alles zu erklären ich werde 3 Screenshots anhängen um es euch zu veranschaulichen.

Im Screenshot 1 seht ihr das Programm im Rohzustand, euer Auge sollte sich auf die TextBox und die GroupBox namens "Details" richten. Diese steht auf Screenshot 1 noch auf 0 und in der TextBox steht nichts. In Screenshot 2 seht ihr was passiert wenn ich den Namen "Vayne" in die TextBox eingebe und meine eingabe mit der Enter-Taste bestätige.

Nun zu meiner Frage:

Ich hab das jetzt so geregelt das ich dafür eine IF Schleife benutzt habe und diese dann mit Else If erweitert habe, nun stellt sich für mich die Frage, kann man das nicht übersichtlicher Lösen? Ich habe mich durch Google schon durchgekämpft und das mit der Datenbank gefällt mir auch, nur möchte ich niht das man die Datenbank sieht sondern das es sich nur die Werte aus der Datenbank zieht, hat jemand dafür eine Lösung?


Mit freundlichen Grüßen


KingSP


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Sa 21.11.2015 um 13:20
Einloggen, um Attachments anzusehen!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Sa 21.11.15 14:04 
Moin,

ja, du kannst das einfacher lösen und zwar mit objektorientierter Programmierung (OOP). Dazu musst du eine Klasse erstellen, die die Eigenschaften deiner
sog. Champs enthält.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
//...
public class Champ {
  public string Name { get; set; }
  public double Armor { get; set; }
  //...

  public Champ(string name) {
    Name = name; 
  } 
}


Objekte dieser Klasse kannst du dann in einer beliebigen Datenstruktur, z.B. einem Dictionary verwalten:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
//...
  var myChamps = new Dictionary<string, Champ>();
  myChamps.Add("Dieter"new Champ("Dieter"));
  
  //Zugriff
  myChamps["Dieter"].Armor = 32.5;
  myLabel.Text = myChamps["Dieter"].Name;


PS: Für weiter Fragen: Es hilft uns immer mehr, deinen Code zu sehen, als Screenshots von deiner Benutzeroberfläche.

Viel Spaß
Finn
KingSP Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 21.11.15 14:27 
Hey danke für die schnelle Antwort und ich entschuldige mich schonmal wenn ich was Frage was sich selbst erklärt.
Ich hab versucht mal mein ganzes Projekt unten reinzuposten. Wo genau und wie muss ich das jetzt machen? Weil Ich wollte auf diese weise nicht nur 2 machen sondern ungefähr .. 128.
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
namespace League_of_Legends_Helper
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Reset_Click(object sender, EventArgs e)
        {
            lbl_Health.Text = "0 - 0";
            lbl_AD.Text = "0 - 0";
            lbl_Range.Text = "0";
            lbl_Armor.Text = "0 - 0";
            lbl_MR.Text = "0 - 0";
            lbl_MS.Text = "0";
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Vayne") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("vayne"))
            {
                lbl_Health.Text = "498 - 1909";
                lbl_AD.Text = "53 - 109";
                lbl_Range.Text = "550";
                lbl_Armor.Text = "19 - 76.8";
                lbl_MR.Text = "30";
                lbl_MS.Text = "330";
            }
            else if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Lucian") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("lucian"))
            {
                lbl_Health.Text = "554 - 1914";
                lbl_AD.Text = "52 - 103";
                lbl_Range.Text = "500";
                lbl_Armor.Text = "24 - 75";
                lbl_MR.Text = "30";
                lbl_MS.Text = "335";
            }
        }

        private void btn_Flash_Click(object sender, EventArgs e)
        {
            
        }
    }


Mit freundlichen Grüßen

KingSP

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 21.11.15 14:35 
Zitat:
Wo genau und wie muss ich das jetzt machen?


Wo - in einer neuen Klasse damit du die von überall aus einfach benutzen kannst.
Wie - z.B. so wie von Finno gezeigt. Wenn du das in einer neuen Klasse machst also eine Klasse die eine Liste deiner Champs veröffentlicht die du dann in deiner Anwendung an beliebiger Stelle nutzen kannst hast du die Chance später die Implementierung dieser Klasse zu ändern (z.b. du beginnst mit einen Dictionary mit in der Anwendung fest verdrahteten Werten stellst das dann aber später auf eine Datenbank um dann must du nur diese Klasse ändern und deine Anwendung wird ansonsten genauso einfach weiter funktionieren)

Zitat:
Ich hab das jetzt so geregelt das ich dafür eine IF Schleife benutzt habe


Über den Ausdruck solltest du nochmal nachdenken ;)

Zitat:
das mit der Datenbank gefällt mir auch, nur möchte ich niht das man die Datenbank sieht


Das mit dem nicht sehen verstehe ich nicht ganz. Meinst du das man kein Datenbank File im Dateisystem sehen können soll? Oder was meinst du genau?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 21.11.15 14:49 
Statt einer Datenbank kannst du doch auch einfach eine Text- oder XML-Datei oder ähnliches nehmen.
Diese liest du dann in die Datenstruktur ein, z.B. das von Finn erwähnte Dictionary<> und brauchst so nur den Code dafür in eine kleine Methode packen.
Die Textdatei sieht dann einfach so aus:
ausblenden Quelltext
1:
2:
Vayne, 498 - 1909, 53 - 109, 550, 19 - 76.8, 30, 330
Lucian, ...

Das Einlesen kannst du dann entweder mit File.ReadAllLines und String.Split vornehmen oder du benutzt einen CSV-Parser, z.B. A fast CSV-Reader.

Beim Programmieren sollte man immer Codeduplizierungen vermeiden und dann ist es das beste Daten und Code voneinander zu trennen.

Wenn dir das mit der Textdatei (noch) zu kompliziert erscheint (obwohl es das wirklich nicht ist ;- ), dann kannst du auch die Daten direkt im Programmcode anlegen (aber getrennt von den Methoden):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
class Data
{
  public static readonly var Champs = new Dictionary<string, Champ>()
  {
    { "Vayne",  new Champ("498 - 1909""53 - 109"550"19 - 76.8"30330) },
    { "Lucian"new Champ(/* ... */),
    // ...
  };
}
KingSP Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 21.11.15 15:40 
Heyho,

kann mir vielleicht jemand die Möglichkeit von FinnO genauer erklären? Wie genau ich diese nun einbinden müsste um dann nur noch den Namen in die TextBox schreiben zu müssen?

Vielen lieben dank


Mit freundlichen Grüßen


KingSP
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 21.11.15 17:53 
So in etwa (anhand meines Beispiels):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Champ champ;
if (Data.Champs.TryGetValue(txtBox_Champ.Text, out champ))
{
  lbl_Health.Text = champ.Health;
  lbl_AD.Text = champ.AD;
  lbl_Range.Text = champ.Range.ToString();
  // ...
}

Du mußt die Datenklasse Champ dann entsprechend um die Eigenschaften erweitern.
Wenn du meinen Code (mit direkter Initialisierung) nutzen willst, dann benötigst du auch noch einen passenden Konstruktor, welcher die Parameter in die Eigenschaften speichert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class Champ
{
  public Champ(string health, string ad, int range /*, ...*/)
  {
    Health = health;
    AD = ad;
    Range = range;
    // ...
  }

  public string Health { get; set; }
  // ...
}

Du mußt bei den Eigenschaften dann schauen, welches der jeweils passende Datentyp dafür ist (wenn du nicht damit rechnen willst, dann kannst du natürlich überall string für nehmen).
KingSP Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 21.11.15 19:51 
Heyho..

kann mir einer sagen was ich falsch gemacht habe?
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace League_of_Legends_Helper
{
    public partial class Form1 : Form
    {
        public class Champ
        {
            public string Name { get; set; }
            public double Health { get; set; }
            public double AD { get; set; }
            public double Range { get; set; }
            public double Armor { get; set; }
            public double MR { get; set; }
            public double MS { get; set; }

            public Champ(string name) { Name = name; }
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Reset_Click(object sender, EventArgs e)
        {
            lbl_Health.Text = "0 - 0";
            lbl_AD.Text = "0 - 0";
            lbl_Range.Text = "0";
            lbl_Armor.Text = "0 - 0";
            lbl_MR.Text = "0 - 0";
            lbl_MS.Text = "0";
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            var myChamps = new Dictionary<string, Champ>();
            myChamps.Add("Lucian"new Champ("Lucian"));
            myChamps.Add("Vayne"new Champ("Vayne"));

            if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Vayne") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("vayne"))
            {
                lbl_Health.Text = "498 - 1909";
                lbl_AD.Text = "53 - 109";
                lbl_Range.Text = "550";
                lbl_Armor.Text = "19 - 76.8";
                lbl_MR.Text = "30";
                lbl_MS.Text = "330";
            }
            else if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Lucian") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("lucian"))
            {
                myChamps["Lucian"].Health = 400 - 1200;
                myChamps["Lucian"].AD = 53;
                myChamps["Lucian"].Range = 500;
                myChamps["Lucian"].Armor = 50;
                myChamps["Lucian"].MR = 82;
                myChamps["Lucian"].MS = 330;

                lbl_Health.Text = myChamps["Lucian"].Health;
            }
        }

        private void btn_Flash_Click(object sender, EventArgs e)
        {
        }
    }
}


Wenn ich das dann starten will kommt folgende Fehlemeldung:

CS0029 Der Typ "double" kann nicht implizit in "string" konvertiert werden.


Allerdings versteh ich kein Wort was die bei Google damit meinen.. Ich danke schonmal für Antworten!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 21.11.15 20:17 
Zitat:
ausblenden C#-Quelltext
1:
if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Vayne") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("vayne"))					


Das solltest du einfacher und richtiger ausdrücken. Contains heißt der Text in der TextBox muss das nur enthalten. Der Code würde also auch "vaynen" oder "dfjghlvaynesdkjhg" in der TextBox reagieren.
Möglicherweise hast du jetzt schon Champs deren Name Teil einer Namens eines anderen Champs sind. Das würde also in die Hose gehen.

Besser wäre z.B.

ausblenden C#-Quelltext
1:
if (e.KeyCode == Keys.Enter && txtBox_Champ.Text.Trim().ToLower() == "vayne")					


Jetzt reagiert das auf jeder Groß/Kleinschreibweise ignoriert Leerzeichen vor und dahinter und reagiert nur auf "vayne".

Zitat:
ausblenden C#-Quelltext
1:
lbl_Health.Text = myChamps["Lucian"].Health;					


Health ist ein double in einer TextBox wird aber ein string angezeigt. Du musst also erst eine Typumwandlung vornehmen (den Typ konvertieren). In diesem einfachen Fall reicht erstmal ein

ausblenden C#-Quelltext
1:
lbl_Health.Text = myChamps["Lucian"].Health.ToString();					


So wie du das Dictionary myChamps in der Methode textBox1_KeyDown benutzt ist das übrigens völlig sinnfrei. Es beginnt Sinn zu machen wenn du es globaler in einer anderen Klasse definierst.
Hole es zumindest aus der textBox1_KeyDown raus, definiere und befülle es woanders, so das du es ,z.B. in textBox1_KeyDown, wiederverwenden kannst.
KingSP Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 21.11.15 21:46 
Hey,
erstmal vielen dank für deine Antwort sie war sehr hilfreich.
Ich bin noch komplett neu in C# deswegen entschuldige ich mich für solche Fehler einfach mal.

Aber kannst du mir erklären wie man das Dictionary in einer anderen Klasse definiere?
Weil ich habe gerade absolut keine Ahnung.. Und finde auch nichts hilfreiches bei Google.

Mfg


KingSP
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 22.11.15 10:58 
Mit welchem Buch lernst du denn C#? Du solltest dir ersteinmal die Grundlagen erarbeiten, bevor du so ein Projekt angehst (du scheinst ja meinen Code nicht verstanden zu haben, sonst würdest du ihn ja benutzen).