Zum Inhalt springen

Tician

Mitglieder
  • Gesamte Inhalte

    541
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    9

Beiträge von Tician

  1. Naja, immer noch besser als den Leuten eine Anleitung zu schreiben wie sie die Registry verändern oder? Und es hieß "selfdoing der Benutzer", von daher war das das erste was mir einfiel. Im Malware-Forum sah es vor nicht allzu langer Zeit auch so aus das man den Leuten gesagt hat "kopiere das, mach ne textdatei auf, füge ein, änder das Ende der Datei in .reg um und führe aus". Heutzutage machen wir das mit Tools, aber das ist alles über ein Forum und nicht vergleichbar mit einer Firma.

    Klar, weiter gedacht wäre es auch über Gruppenrichtlinie möglich diese Einträge zu setzen, aber ich hab das so verstanden das der Ersteller dieses Thread eine Lösung haben wollte die den Usern erlaubt selbst zu entscheiden ob sie diese Einstellung so haben wollen. Von daher finde ich meine Antwort immer noch passend.

  2. Moinsen,

    ich bin mal wieder am verzweifeln, seit heute morgen versuche ich eine Lösung für ein Problem zu finden, aber nichts funktioniert.

    Folgende Situation: Ich habe ein C# Programm das eine XML-Datei ausließt, die Values innerhalb verschiedener Elemente in string-Variablen speichert und diese dann in eine (php) MySQL-Datenbank schreibt. Jetzt gibt es aber öfter leere Elemente in der XML die als "NULL" in der Datenbank stehen müssen, sonst gibt es im weiteren Prozess-ablauf (nicht mehr zum Programm gehörend) Probleme.

    Ohne Veränderung: Wenn mein Programm ein Element einließt und dieses leer ist habe ich einen leeren string (""). Wenn ich diesen an die Datenbank übergeben (die wiederum einen integer für das Feld vorsieht) steht in dem Feld der Datenbank eine 0 (als Zahl).

    Sieht so aus:

                            XmlNode package = node.SelectSingleNode("package");
    
                            if (package != null)
                                string secret = package["secret"].InnerText;

    Das allein ist schon ein Problem, wenn der eingelesene String leer ist

    Quasi so: <secret></secret>

    kann ich nicht in einen int konvertieren: Convert.ToInt32("") -> Error

    Der String für die Datenbank:

    string command = "INSERT INTO test (un1) VALUES (" + secret + ");";

    Das ist nur eine von vielen Variablen.

    Was habe ich schon versucht?

     

    1. Ich frage die string in einer if-abfrage ab ob sie leer sind und weise ihnen dann direkt null zu. War für mich das logischste.

    if (string.IsNullOrEmpty(secret))
                            {
                                secret = null;
                            }

    Dann sieht mein SQL-command aber übersetzt (überwachung der Variablen) so aus:

    INSERT INTO test (un1) VALUES ();

    Meine null-Variable verschwindet einfach und natürlich bekomme ich eine Exception geworfen.

     

    2. Irgendwas im internet gefunden:

    secret = string.IsNullOrEmpty(secret) ? null : secret;

    Ich weiß weder was es macht, noch ob ich es richtig angewandt habe, ich habe das Fragezeichen noch nie gesehen und auch den Doppelpunkt nur bei der Vererbung von Klassen benutzt. Ich habe aber schon mit einem int? rumprobiert weil ich gelesen habe das es null-able ist - hat auch nicht geholfen wegen oben genanntem Problem der konvertierung.

    Dann habe ich noch ewig mit den Konvertierungen rumgemacht und ausprobiert, aber jetzt bin ich auch mit den nerven am Ende.

     

    Meine Mitarbeiter wollen das es funktioniert und ich sehe keine andere Möglichkeit mehr als den SQL-Befehl statt den Variablen anzupassen. Grund ist, dass wenn eine Variable beim Eintrag in die DB gar nicht angesprochen ist sie automatisch mit NULL drin steht. Bei 3 Variablen die nach null gefragt werden müssen sieht das so aus:

                            if (string.IsNullOrEmpty(secret1) && string.IsNullOrEmpty(secret2) && string.IsNullOrEmpty(secret3))
                            {
                                command = "INSERT INTO test () VALUES ();";
                            }
                            if (!string.IsNullOrEmpty(secret1) && string.IsNullOrEmpty(secret2) && string.IsNullOrEmpty(secret3))
                            {
                                command = "INSERT INTO test (secret1) VALUES (" + secret1 + ");";
                            }

    Das mit jeder erdenklichen Möglichkeit ergibt 8 if-Abfragen, ich lasse quasi immer die Variablen weg die null sind. Bedenkt das da noch viel mehr Variablen sind deswegen ist der obere SQL-Befehl nur hier so "leer".

    Ich bitte euch mal wieder instandig mir auf die Sprünge zu helfen. Wie mache ich aus einem leeren String eine Variable die meiner Datenbank NULL übergibt?

     

    Grüße

    Tician

  3. Moinsen,

    wir benutzen Avira, aber das hat unseren Server auch schon lahm gelegt (hat mit irgendeinem Prozess die komplette CPU ausgelastet). Ich persönliche bin kein Fan von Avira.

    Ich würde dir zu Emsisoft raten, wobei ich da zugeben muss, dass ich nicht weiß wie gut die Software zur zentralen Verwaltung ist, aber laut der Beschreibung bin ich zumindest begeistert.

    Ich weiß die Leute dort helfen schnell und beschäftigen sich auc freizeitlich mit aktuellen Bedrohungen, indem sie direkt mit Menschen interagieren die sich etwas eingefangen haben. (trojaner-board)

    Vorteil von Emsisoft: Vergleich mal die Datenschutzerklärungen von verschiedenen AVs. Emsisoft ist nicht groß bekannt, aber was die Sicherheit angeht würde ich behaupten das es locker mit Avira und Co mithalten kann und der rießen Vorteil ist das die keine Daten an irgendwelche anderen Firmen weiter geben. Außerdem hast du den Bing-Bar mist und jegliche weitere 3.Anbieter-Software nicht mit dabei.

    Schau dich auf deren Webseite gerne mal um, wie gesagt ist alles nur meine Erfahrung.

  4. Eine (hoffentlich) letzte Frage. Wie sieht das in einem UML aus wenn ich in meiner Form1-Klasse eines der Monster aus der World-Klasse kopiere? Geht dann ein Pfeil zwischen Form1 und World oder zwischen Form1 und Monster? Und wäre das dann eine Aggregation? Was fehlt sonst noch?

     

    5-1.PNG

  5. Macht Sinn. Stimmt, ich hab ja das Objekt mit drin stehen. Oh man ._. Jetzt finde ich Events doch nicht mehr so toll. Dann ruf ich das jetzt zu jedem neuen Monster auf. Das kriegt dann später (nach Donnerstag) noch ne extra Methode. Ich brauch ne Liste mit was ich alles machen wollte....

    Edit: So, Spiel rennt jetzt ohne Exceptions. Hat noch ein paar wenige Schreib- und Logikfehler, aber die krieg ich noch raus. Ihr seid toll, ich bin voll happy!

  6. Fehler gefunden! Mein Gott ich sollte nicht _player.HpChanged und _Monster.HpChanged simultan haben... wer hat nur so einen Mist programmiert...

    Edit: Doch nicht, die Events sind vorhanden (ich bin nur blind). Ich bin verwirrt. Sämtliche Monster-Events funktionieren nicht.

  7. Es gibt aber jemanden der darauf hören sollte...

    Form1
            private void InitializeEvents()
            {
                _player.HpChanged += UpdateHpLabel;
                _player.LocationChanged += UpdateControls;
                _currentMonster.HpChanged += MonsterTakesDamageOutput;
                _player.Victory += MonsterDeadOutput;
                _currentMonster.MonsterAttack += MonsterAttackOutput;
            }
    
            public void UpdateHpLabel(object sender, PropertyChangedEventArgs e)
            {
                lbCurHP.Text = _player.curHP.ToString();
                hpBar.Value = _player.curHP;
            }

    Form1 ist die einzige Klasse die auf Events hört.

    vor 11 Minuten schrieb arlegermi:

    Wieso setzt du die Events nicht beim Erzeugen der Monster?

    Weil mir Whiz-zarD 4 Posts weiter oben gesagt hat das es nicht in den Konstruktor gehört^^ Wenn ich mich das aber so anschaue sind sämtliche Subscribe-Events trotzdem in meinem Form1-Konstruktor enthalten...

  8. Monster
            //Events
            public event PropertyChangedEventHandler HpChanged;
    
            public void TakeDamage(int damage)
            {
                if (curHP > damage)
                {
                    curHP = curHP - damage;
                    HpChanged(this, new PropertyChangedEventArgs("curHP")); //NullReferenceException
                }
                else
                {
                    curHP = 0;
                }
            }

    Genau hier bekomme ich die Exception, andere Events funktionieren aber soweit ich sehen kann. Ich weiß zu wenig über Events um da einen Ansatz zu haben warum das jetzt nicht funktioniert, aber ein anderes Event das genau so aufgebaut ist funktioniert.

    Das Monster ist auch da, die curHP-Variable hat auch einen Inhalt.

  9. Klingt logisch! Ich frag dann nochmal wegen der besseren Lösung, jetzt wirds langsam knapp und ich renne gerade schon wieder in ein Problem.

    Ich initialisiere meine Subscribe-Events in Form1 bei Programm-Start - aber weil nicht alle Klassen schon ein Objekt direkt zu Beginn haben (Fight und Monster) komme ich hier auf eine NullReferenceException. Mir fällt keine Lösung drum herum ein. Ich brauche die Events :(

    Ich habe den Code wie er jetzt aussieht auch mal geupdated, ich weiß Github wäre besser, aber ich blick das nicht >.<

    https://pastebin.com/3krETNbs

    Irgendeine Idee wie ich da jetzt drum rum komme? Einfach trotzdem mal Objekte für die 2 Klassen erstellen ist ne blöde Lösung.

     

    Edit: Ich habe das Event komplett aus der Fight-Klasse genommen und mal ein Monster mit leeren Stats erstellt damit ich zumidnest mal den Code ausprobieren kann. In der Monster-Klasse bekomme ich beim HpChanged-Event ein NullReferenceException. Mach ich irgendwas mit den Events falsch?

  10. Wow da hat uns unser Lehrer dann aber ziemlichen Mist beigebracht.

    Ich lass es bis übermorgen drin, dann schau ich mal was ich damit mache, weil das war die elegante Lösung um diese beiden Dinge nicht wiederholend zu schreiben und sie müssen sowieso jedesmal aufgerufen werden wenn es in einen Fight geht.

    Die Alternative wäre dann in der Form1 eine Methode zu basteln die ich stattdessen aufrufe (und in der wiederum mein Fight-Object erstellt wird). Dann bin ich auch gleichzeitig das Event los.

  11.     public class Fight
        {
            Player player;
            Monster monster;
    
            //Events
            public event EventHandler MonsterAppear;
    
            public Fight(Player player, Monster monster)
            {
                this.player = player;
                this.monster = monster;
                player.MoveTo(World.LocationById(World.location_id_fight));
                MonsterAppear(this, new EventArgs());
            }

    ^_^

  12. Bin quasi schon dran, aber ich glaube ich mache es anders als es vorgesehen war, ich brauche nämlich schon wieder eine Starthilfe :(

    Form1:
            private void exploreForest(object sender, EventArgs e) //Schritt 1
            {
                case 3:
                        _currentFight = new Fight(_player, _currentMonster);
                        break;
            }
    
            private void attack(object sender, EventArgs e) //Angriffs-Button. Schritt 4
            {
                _currentFight.FightRound();
            }
    
            public void MonsterAppearOutput(object sender, EventArgs e)//Schritt 3
            {
                richTextBox1.Text = "A wild " + _currentMonster.name + " level " + _currentMonster.level + " appears!\nIt has "+_currentMonster.curHP+" HP.";
            }
    
    Fight:
            public event EventHandler MonsterAppear;
    
            public Fight(Player player, Monster monster) //Schritt 2
            {
                player.MoveTo(World.LocationById(World.location_id_fight)); //Spieler bekommt Button für "Angriff"
                MonsterAppear(this, new EventArgs()); 
            }
    
            public void FightRound() //Schritt 5
            {
                //???
            }

    Wenn ich von meiner Fight-Klasse die Methode FIghtRound() aufrufe muss ich nochmal Player und Monster übergeben um etwas zu machen - war das Sinn der Sache?

  13. Wenn ich ein Event habe und 2 Subscriber darauf: Welcher zieht zuerst?

    Ich bin gerade am refaktorisieren und mir fehlt nur noch der Kampf. Der Ablauf sollte so sein:

    - Button wird gedrückt "Angriff"

    - Spieler greift an: Berechnung der übrigen Monster HP (und ob Monster tot ist)

    - Wenn Monster noch am Leben: Text-Ausgabe über Monster HP

    - Monster greift an: Berechnung der übrigen Spieler HP (und ob SPieler tot ist)

    - Textausgabe über Monsterangriff and erhaltenen Schaden

    - Wiederholung bei jedem Button-Click bis einer von beiden Tot.

    ------------------

    Ausführung:

    Form1
            private void attack(object sender, EventArgs e) //Button Click
            {
                _player.Attack(_currentMonster);
                richTextBox1.AppendText("\nYou hit the monster!\nIt's remaining health is: " + _currentMonster.curHP);
            }
    
    Player
            public void Attack(Monster monster)
            {
                monster.TakeDamage(attack);
            }
    
    Monster
            public void TakeDamage(int damage)
            {
                if (curHP > damage)
                {
                    curHP = curHP - damage;
                    //player.TakeDamage
                }
                else
                {
                    //not omplemented^^
                }
            }

    Problem: Vermutlich sichtbar, ich wollte von der Monster-Klasse direkt wieder zurück zur Player-Klasse, aber diesmal fehlt mir mein Player-Objekt. Die Schlamperlösung wäre wohl den Player durch zu schleifen. Aber an diesem Punkt wäre wohl doch eine Klasse für den Kampf besser die ich in Form1 aufrufe und einfach sowohl Player als auch Monster mitgebe oder?

  14. Eine Frage zur Logik, weil ich mal wieder nicht weiß wie andere das machen: Wenn der Spieler angreift sieht das momentan so aus:

    Form1
            private void Attack(Monster monster)
            {
                _currentMonster.curHP = _player.Attack(_player, _currentMonster);
                richTextBox1.AppendText("\nYou hit the monster!\nIt's remaining health is: " + _currentMonster.curHP);
                if(_currentMonster.curHP == 0)
                {
                    MonsterDie();
                    return;
                }
                richTextBox1.AppendText("\nIt fights back!");
                Damage(_currentMonster.attack);            
            }
    Player
            public int Attack(Player player, Monster monster)
            {
                if(monster.curHP > player.attack)
                {
                    monster.curHP = monster.curHP - player.attack;
                }
                else
                {
                    monster.curHP = 0;
                }
                return monster.curHP;
            }

    Wie gehabt ist das grottenfalsch. Meine Frage ist ob das nun annehmbar ist:

    Main
    		_player.Attack(_player, _currentMonster);
    
    Player
            public int Attack(Player player, Monster monster)
            {
                //logik? Keine?
    			_monster.TakeDamage(monster);
            }
    Monster
            public int TakeDamage(Monster monster)
            {
                //logik hier
    			Die();
            }

    Mein Gott die Formatierung in den Code-Boxen regt mich auf!

    Ich kann mir ja vorstellen das die Player-Klasse vielleicht gar nichts von Monster aufrufen sollte. Außerdem bin ich verwirrt weil beides nicht zusammen passt, ich kann entweder sagen "Spieler greift an" oder "Monster nimmt schaden", aber beides hat zu wenig Logik, es passiert ja nichts außer einer text-message in der Main und ein Abzug der Monster-HP.

    Heißt im Prinzip gibt es kein "Spieler greift an":

    Main
    	_monster.TakeDamage(_player.AttackDamage, _currentMonster)
    	//textBox-Message blabla (hier vermutlich ein Event)
    
    Monster
            public void TakeDamage(int damage, Monster monster)
            {
                //Logik
                HpChanged(this, new PropertyChangedEventArgs("curHP");
            }

    Was ist da die schönere Lösung?

  15. Data Binding wurde mir auch schon als Stichwort genannt, aber nur in Verbindung mit WPF - ich habe ja nur eine Form-Anwendung. Oder habe ich das falsch verstanden und ich kann es irgendwie auch so benutzen?

    Das Beispiel von Microsoft sieht aus wie eine ganz normale Methode und wird ja auch aufgerufen, ich frage mich was der Unterschied ist ob ich nun eine herkömmliche Methode in der Setter aufrufe oder ein Event benutze.

    Wenn ich das richtig sehe ist das Event aber auch nicht Klassenübergreifen oder sowas. Ich kann das Puzzle nicht zusammensetzen, weil damit das Problem nicht gelöst wird. Ich kann das Event nicht in die Setter-Methode der Player.curHP Variable setzen weil ich von da aus trotzdem nicht auf die Elemente in Form zugreifen kann (sollte), aber das wäre das logischste, weil das die "Haupt-Variable" ist, die die Form1-Elemente grafisch wiederspiegeln sollen.

    Das einzige was mir einfallen würde wäre in der Form1 ein PropertyChanged-Event auf eines der Elemente zu legen, würde also Pseudomäßig so aussehen:

    Form1
    {
    	Player _player;
    	public event PropertyChangedEventHandler HpChanged;
    	labelCurHP.Text {set {HpChanged(value)}};
      
    	labelCurHP.Text = _player.TakeDamage(value);
    	
    	HpChanged(...)
        {
    	_player.CurHP = value;
    	hpBar.Value = value;
        }
    }

    Ich glaub hier wird man auch sehen das ich gerade den Unterschied zwischen Event und normaler Methode nicht sehe.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...