-
Gesamte Inhalte
541 -
Benutzer seit
-
Letzter Besuch
-
Tagessiege
9
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Beiträge von Tician
-
-
Dagegen lässt sich nichts sagen
Aber hast du eine andere Lösung um es den Usern selbst zu überlassen ob sie die EInstellung haben möchten oder nicht ohne zum Admin zu rennen?
-
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.
-
Wenn es sonst nicht über zentrale Einstellungen geht gibt es auch den Weg über eine Reg-Datei. Ist nicht schwieriger zu schreiben als eine batch-Datei und lässt sich auch vom User doppelt anklicken.
https://itler.net/windows-reg-datei-erstellen-so-erstellt-man-registry-dateien/
-
Funktioniert einwandfrei!
-
Vielen Dank, ich schau mir aus Zeitmangel erstmal diese Parametrisierung an, sollte glaube ich nicht so einen großen AUfwand machen das umzustellen.
-
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
-
Super, vielen Dank!
-
Wenn es dir darauf ankommt wie gesagt auch Emsisoft^^
ZitatBereitstellen von Schutz, ohne jeden Client einzeln einrichten zu müssen.
Wie gesagt, schau es dir an. Du kannst die Leute auch direkt anschreiben^^ https://www.emsisoft.com/de/software/enterprise/
-
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.
-
-
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!
- JimTheLion und arlegermi reagierten darauf
- 2
-
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.
-
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...
-
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.
-
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 >.<
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?
-
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.
-
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()); }
-
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?
-
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?
-
Edit: Hat sich erledigt (hier stand eine doofe Frage^^)
Super, danke Leute!
-
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?
-
Events sind ja was richtig feines! Gefällt mir!
-
Damit kann ich was anfangen, werde ich sobald ich kann ausprobieren! Vielen Dank!
-
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.
Nützliche Tools und Software
in IT-Arbeitswelt
Geschrieben