Laden...

Forenbeiträge von bonzy Ingesamt 157 Beiträge

13.09.2009 - 21:04 Uhr

Bin durch, hat jetzt alles weniger umständlich geklappt, als ich es erst vermutet hatte. Ist zwar "nur" die Initialisierung der Form, aber die beinhaltet recht viel, daher bringt es mich schon weiter. Danke.

13.09.2009 - 12:55 Uhr

Aber genau da liegt doch das Problem. Ich würde die Ladezeit des Fensters gerne einen Thread übernehmen lassen, doch dann erstelle ich die Form eben nicht mehr mit dem GUI-Thread. Deshalb zweifle ich ja daran, dass es mit Threads gehen würde. Oder hab ich jetzt etwas übersehen?

13.09.2009 - 12:40 Uhr

Hallo zusammen,

ich habe in meine Anwendung einen Splashscreen eingebaut, der in der Program.cs vor der MainForm aufgerufen und angezeigt wird. Allerdings beträgt die Ladezeit meiner MainForm knapp 2-3 Sekunden, daher würde ich gerne während des Splashscreens schon die Form laden. Ich habe erstmal an Threading gedacht, aber bin mir nicht sicher, ob es damit lösbar ist und wenn doch, wie es genau funktionieren soll.
Daher wäre ein Denkanstoß ganz gut. 😉

10.09.2009 - 17:27 Uhr

Alles klar, habe jetzt den SplashScreen über einen Timer geschlossen und keinen neuen Thread aufgemacht. Damit klappt es, danke.

09.09.2009 - 18:08 Uhr

Tag zusammen,

und zwar habe ich gerade einen SplashScreen in eine Anwendung eingebunden. Dieser wird in der Program.cs aufgerufen, ein eigener Thread wird erstellt, die Form des SplashScreens wird angezeigt und nach 3 Sekunden ist der ganze Spaß auch schon vorbei.
Wenn ich nach dem SplashScreen dann allerdings meine eigentliche Form starte, hat diese keinen Fokus. Dieses Problem tritt wiederum nur dann auf, wenn ich das Programm nicht über Visual Studio starte.

Hat jemand eine Idee? Wenn ihr mehr Infos braucht, einfach per Beitrag oder PM Bescheid geben.

05.09.2009 - 23:47 Uhr

Tag zusammen,

und zwar arbeite ich gerade mit einem TableLayoutPanel, dem ich zur Laufzeit zusätzlich Zeilen hinzufüge. Allerdings soll man diese auch wieder nach Belieben entfernen können, daher möchte ich wissen, ob jemand eine einfachere Methode kennt, eine Zeile "mitten" in der Tabelle zu löschen als die Zeile samt allen Controls nach unten zu verschieben und dann den RowCount zu verringern. Danke.

31.08.2009 - 22:46 Uhr

Jop das wars. Hatte mich wohl zu sehr auf ne Property versteift und es deswegen nicht gefunden. Danke.

31.08.2009 - 22:34 Uhr

Hallo zusammen,

also ich weiß ja nicht, ob ich gerade auf den Kopf gefallen bin, aber ich finde keine (gute) Möglichkeit, den "Basistyp" eines Arrays auszulesen. Über die PropertyInfo von "Typ[]" komme ich nicht an "Typ" ran. Bitte darum, mich aufzuklären. 😉

28.08.2009 - 00:48 Uhr

Ich habe jetzt die "Queries" weiter überarbeitet. Es ist soweit lauffähig, sicherlich noch nicht bugfrei.
Es gibt jetzt die Funktionen Select, SelectIndices, Remove, Update und Count. Mit Select erhält man natürlich die Items an sich, SelectIndices gibt die Indizes der Elemente zurück. Remove entfernt Objekte aus der Liste, Update ändert die Eigenschaften und Count gibt die Anzahl zurück. Da Update immer nur einen Wert ändert, kann man mit Hilfe einer Kombination aus SelectIndices und Update dennoch ans Ziel gelangen.
Bisher können nur Eigenschaften der Klasse übergeben werden, ob ich das noch ändere weiß ich noch nicht. Bisher wird alles über Variablen geregelt. Es über eine string zu regeln wie bei einem SqlQuery nimmt mir den Spielraum mit Eigenschaften, die wiederum eine Klasse als Typ aufweisen und keinen Werttyp.
Wer eine bessere Idee hat oder für eine Ansicht argumentieren möchte, ist hiermit eingeladen, dies zu tun. 😉

Die Änderungen werde ich dann demnächst in eine neue Version packen.

Edit: Ich werde mich jetzt wohl daran setzen, mehrere Listen in einem Manager zu verwalten. Die Frage ist, wie ich dann die Funktionen aufrufe. Soll ich jedes Mal den Namen der Liste entgegennehmen oder vielleicht eine Funktion bereitstellen, mit der man eine Liste als "aktiv" schalten kann und auf die dann automatisch zugegriffen wird. Mir persönlich gefällt die zweite Idee besser.

Edit2: Ich habe jetzt die Idee mit dem Setzen der aktuellen Liste implementiert. Es läuft alles soweit gut und es sind noch ein paar zusätzliche Feinheiten wie Methodenüberlagerungen dazugekommen.
Außerdem gibt es noch eine weitere Query-Methode namens "SelectWhere", die nicht die vollständigen Objekte, sondern nur eine Eigenschaft dieser zurückgibt.

Edit3: Neue Version 1.1 ist hochgeladen und steht zur Verfügung. Ein kurzes Changelog steht im Startbeitrag.

26.08.2009 - 19:51 Uhr

Find() sagt mir natürlich was und das hätte ich auch noch am ehesten benutzt. Problem dabei ist, dass ich mir gerade nicht ausmalen kann, ob ich anhand eines Parameters diese Abfragen erstellen kann. Ich habe es jetzt mal zu Fuß implementiert und schaue, was ich noch einbaue und ob sich dann die Umstellung auf deinen Vorschlag lohnt.

Hmm... warum nicht gleich eine DataTable?

Könntest du das noch was genauer fassen? Wo ist der Vorteil, wenn ich DataTable benutze?

Edit: Sry, aber mir ist erst gerade wieder klar geworden, dass ich ja 2.0 benutze, um möglichst kompatibel zu bleiben und deswegen sowieso kein LINQ benutzen kann. 😛

Edit2: Habe jetzt ein paar "Queries" eingebaut wie Select, Update, Remove und Count. Läuft bisher ohne Fehler. Der Test hat auch ein gutes Ergebnis gebracht, habe 1 Mio. Objekte durchlaufen lassen, davon wurden mir dank Modulo die Hälfte zurückgegeben und das Ganze dauerte knapp 4 Sekunden.

26.08.2009 - 19:06 Uhr

Aber der Vorteil der ID ist mir noch nicht ganz klar. Eine Abfrage wäre sicher sinnvoll, eventuell sogar mit den normalen SQL-Befehlen oder einer vereinfachten Version davon. Ist die Frage, ob man die auch auf eine Liste "abfeuern" kann.
Ansonsten bin ich doch mit einer Liste insofern gut dran, dass ich einen Index für jedes Objekt habe, über den ich auch an das Objekt rankomme. Das ist doch quasi schon eine ID. Mit dem Unterschied, dass sich der Index ändern kann, wenn man die Liste verändert. Dafür wäre es schon brauchbar, eine ID einzubauen.

26.08.2009 - 16:41 Uhr

Der Vergleich mit dem Automechaniker hinkt aber ein wenig. Schließlich entwickle ich ja nichts, was andere vom Inhalt her kennen müssen. Eher will ich ein Auto bauen, mit dem andere Leute fahren können. Oder besser gesagt, ich entwickle ein Teil eines Autos, das man nicht bis ins kleinste Detail kennen muss, um es in sein Auto einzubauen.

Die Idee mit der ID verstehe ich immernoch nicht ganz. Es geht mir in erster Linie darum, dass man Objekte miteinander vergleichen kann. Wenn ich in der Verwaltung eine Klasse mit sagen wir 2 Werten speichere, dann möchte ich doch später auch schauen können, ob Objekte mit dengleichen Werten schon in der Verwaltung liegen. Ein ID-Abgleich bringt mich da nicht wirklich weiter. Und synchron zu meinem echten Datenspeicher bleibe ich doch, indem ich speichere. Es sollte schon möglich sein, nicht nur eine Datei damit zu verwalten. Eventuell baue ich dafür alles nochmal ein wenig um, damit mehrere Listen in einem ObjectManager verwaltet werden können, aber das überdenke ich nochmal.

Edit: Habe gerade die Contains-Methode getestet. Belief sich im Schnitt auf 0,02 Sekunden für 1 Objekt in einer Liste von 10.000 Stück. Sind zwar nicht sonderlich kompliziert die Objekte, aber immerhin. Glaube nicht, dass die Performance sonderlich leidet.

26.08.2009 - 15:13 Uhr

Also ich bin immernoch der Ansicht, dass solange etwas läuft, man nicht weiter nachfragen muss, warum es läuft. Wenn ich ein externes Framework benutze, kriege ich meist den Code auch nicht zu gesicht, sondern nur eine Erklärung, wie es zu bedienen ist. Ob man das mit einer Doku löst, mit den Beschreibungen der Methoden/Eigenschaften oder mit beidem ist wohl dem Autor überlassen.

Aber vorrangig interessiert mich, ob das was ich entwickle auch ohne große Einblicke in die Struktur meiner Lösung verwendbar ist. Ich lege da mehr Wert auf das Ziel als auf den Weg, zumindest aus der Sicht des Benutzers.

Und wie ist das mit den IDs gemeint? Das würde mir doch nur bei einem referentiellen Vergleich helfen. Und dann kann ich auch gleich das Contains von List<> benutzen.

26.08.2009 - 13:46 Uhr

Die DLL ist verschleiert. Warum sollte ich deswegen kein Feedback mehr bekommen? Nur weil die Leute nicht sehen, was für Quellcode hinter der Lösung steckt? Sie sollen sie schließlich benutzen und nicht umschreiben, von daher sehe ich da nicht das Problem. Wenn etwas unklar ist und nicht aus dem "öffentlichen Teil" erklärbar, kann man immernoch nachfragen.

Contains prüft nicht mehr auf Referenzgleichheit, sondern auf die Gleichheit der Werttypen innerhalb der Klasse. Es wird solange "zurückgegangen" bis man auf einen entsprechenden Typen stößt und dieser dann verglichen. So kann ich zumindest sicher stellen, dass der Benutzer nicht selber Equals implementieren muss, um Contains lauffähig zu machen. Aber in Planung ist, auch eine Methode mit Überprüfung auf Referenzgleichheit einzubauen.

26.08.2009 - 12:55 Uhr

Habe die Contains-Methode jetzt fertig umprogrammiert. Die Eigenschaften der Typen werden über Reflection ausgelesen und miteinander verglichen. Listen/Arrays und Referenztypen werden ebenfalls beachtet und "auseinandergenommen".

25.08.2009 - 22:53 Uhr

Für mich hört sich das so an, als ob du nicht genügend Rechte hättest. In welchem Ordner liegt denn die Datei?

25.08.2009 - 22:10 Uhr

Bei:

  
public class FileExistsException : Exception  
  

musste ich schon ein wenig schmunzeln, vorallem weil es eine "FileNotFoundException" gibt.
Demenstprechend müsste deine Exception eher "FileFoundException" heissen, was allerdings keinen Sinn macht, daher würde ich vorschlagen FileAllreadyExistsException".

Wobei man sich dann wieder fragen könnte, ob das Sinn macht 😃

Gut, der Name war überstürzt gewählt und ist sicher überarbeitungswürdig. Habe jetzt mal deinen Vorschlag genommen und sie in "FileAlreadyExistsException" umbenannt. Sinn dahinter ist, dass man abfangen kann wenn eine Datei bereits existiert und der Parameter "overwrite" auf false gesetzt ist. Dachte mir, dass das eventuell ganz nützlich wäre, aber da es seltener auftritt steht auch eine Methode ohne den Parameter bereit.

Der XmlLoader sowie BinLoader sind halt nur Wrapper über die .NET Serialisierungen, bringt so also keine Vorteile und ist ziemlich langsam und hat den Nachteil das die Klassen serialisierbar sein müssen.

Sicher habe ich auch nur die .Net Serialisierung benutzt, aber dennoch glaube ich nicht, dass es ziemlich langsam ist und darauf verzichten möchte ich ebenfalls nicht. Und auf Serializable überprüfe ich teils schon, daher sollte das machbar sein. Solche Details kommen dann aber in die Doku der Methoden, die ich demnächst mal schreiben will.

Im Txt-, sowie CsvLoader hast du die selber Logik zweimal drin, zumindest teilweise.

Vorerst habe ich es so belassen, aber das kann man sicher noch etwas umbauen. Solange es erstmal läuft, bin ich zufrieden. Alles andere ist Aufräumarbeit und kommt demnächst dran.

Die Contains-Methode finde ich nicht sonderlich sinnvoll, denn sie ist nur benutztbar, wenn eine aktuelle Instanz inmemory in deiner Liste gespeichert wurde, da sie auf Referenzgleichheit prüft.

Das Detail habe ich nicht wirklich bedacht, allerdings weiß ich nicht, ob es reicht, alle Eigenschaften abzugleichen und quasi ein generisches Equals zu schreiben. Dann würde ich zusätzlich dem Benutzer Equals nahelegen und zwei Methoden anbieten, eine mit einem Wert-Vergleich und eine mit Referenzgleichheit.

Bitte als konstruktive Kritik auffassen.r

Wird gemacht. 😉

25.08.2009 - 19:21 Uhr

Object Management

Hallo zusammen,

ich stelle hier ein kleines Projekt vor, an dem ich gerade arbeite. Der aktuelle Name beläuft sich auf "Object Management", aber bin da noch unschlüssig. Verwendet wurde .Net 2.0.

Version: 1.2

Beschreibung: Das Projekt besteht aus einer Klassenbibliothek, die die Verwaltung eines übergebenen Typs ermöglicht. Die Objekte diesen Typs werden in einer Liste abgelegt und können von außen auf verschiedene Wege verwaltet werden. Aktuell ist die Funktionsliste des "ObjectManagers" nicht sehr lang, soll aber im Laufe der Arbeit weiter ausgebaut werden, besonders in Sachen Innovativität.
Bisher besteht der größte Vorteil der Lösung in der Dateiverwaltung der Objekte, sprich die verwalteten Objekte können auf verschiedene Wege auf der Platte abgelegt werden: Als Text-, Xml-, Csv- oder auch Bin-Datei. Die Auswahl des Dateityps findet mit Hilfe der Enumeration "FileType" statt.
Dazu hier ein paar (altbekannte) Informationen:

Vor- & Nachteile der Datentypen:

TXT: Leicht lesbar und verwertbar für andere Programme
XML: Ziemlich groß, dafür optimal lesbar, schnell einlesbar, langsam im Schreiben
CSV: Ebenfalls gut les- und verwertbar, außerdem über Excel einlesbar
BIN: Kleinstes Format, schnelle Schreib- und Lesezeiten, nicht extern verwendbar

Verwendung:

TXT: FileType.TXT verwenden, zum Ausschließen ObjectManager.Attributes.NonManagedAttribute als Attribut einer Property hinzufügen
XML: FileType.XML verwenden, zum Ausschließen System.Xml.Serialization.XmlIgnoreAttribute als Attribute einer Property hinzufügen
CSV: FileType.CSV verwenden, zum Ausschließen ObjectManager.Attributes.NonManagedAttribute als Attribut einer Property hinzufügen
BIN: FileType.BIN verwenden, zum Ausschließen System.NonSerializedAttribute als Attribut einem Field hinzufügen

Die konkreten Funktionalitäten der ObjectManager-Klasse will ich hier nicht auflisten, da sollte ein Blick in die Datei genügen. Wenn das Projekt an Größe zunimmt, werde ich aber um eine kleine Doku nicht rumkommen, aber sehe das noch nicht als notwendig an.

Freue mich über Fragen, Verbesserungsvorschläge und Kritiken. Und auch über einen eventuell besseren Namen, den "ObjectManager" gibt es ja leider schon im Namespace "System.Runtime.Serialization". 😉

Changelog

  • v1.1*[Methode] Contains - vergleicht enthaltene Werttypen der Elemente, sowohl normale als auch Listen *[Neue Methode] Count - Zählt alle Elemente mit den übergebenen Eigenschaftswerten durch *[Neue Methode] Select - Gibt alle Elemente mit den übergebenen Eigenschaftswerten zurück *[Neue Methode] SelectIndices - Gibt alle Indizes der Elemente mit den übergebenen Eigenschaftswerten zurück *[Neue Methode] SelectWhere - Gibt Werte einer Eigenschaft der Elemente mit den übergebenen Eigenschaftswerten zurück *[Neue Methode] Alter - Stellt die übergebenen Eigenschaftswerten für ein Element ein *[Neue Methode] Remove - Entfernt alle Elemente mit den übergebenen Eigenschaftswerten *[Neues Feature] Es können nun mehrere Listen innerhalb einer ObjektManager-Instanz verwaltet werden

  • v1.2* *[Methoden] Alle Methoden umbenannt mit "List" und "Item" *[Methode] ItemAt-Methode umbenannt in "GetItemAt" und zum Indexer umgestellt *[Neues Feature] ReadOnly führt auch zum Ausschluss des Objektes (Alternativ NonManaged rausnehmen) *[Neue Methoden] Die "Query-Methoden" DeleteItems, UpdateItems, CountItems, SelectItems, SelectWhereItems und SelectIndicesItems nehmen ein delegate entgegen, welches eine Abfrage der Items regelt *[Neue Methode] AddItems() hinzugefügt, fügt ein Array mit Items hinzu *[Neue Methode] UpdateItem() hinzugefügt, setzt die übergebenen Eigenschaften für ein Item *[Methoden] Bei verschiedenen Methoden wurde die Parameterlistenreihenfolge angepasst *[Neue Methoden] Die "Query-Methoden" DeleteItems, UpdateItems, CountItems, SelectItems, SelectWhereItems und SelectIndicesItems nehmen einen conditionstring entgegen, welcher eine Abfrage der Items regelt *[Bugfixing] Ein paar kleinere Bugfixes

19.08.2009 - 16:09 Uhr

Hi,

meinst Du so etwas ?

object v = Convert.ChangeType(_wert, _e.Property.PropertyType);  
 _e.Property.SetValue(this, v, null);  

Genau diese Lösung habe ich heute zufällig über die Hilfe gefunden. Und bisher scheint es zu funktionieren, aber werde es noch eingehender testen.

Warum verwendest du nicht gleich Serialisierung? Das Ganze dann gleich generisch:
>

Benutze Serialisierung auch noch, aber in dem Fall kann ich es schlecht verwenden. Der Zweck ist eben, dass ich die Informationen möglichst klein halte und leicht für andere Programme zum Einlesen, falls das denn nötig ist.

Du könntest auch komplett ohne Reflection auskommen. Dazu müsstest du zusätzlich eine Art Factory-Schnittstelle erstellen, die prüft, ob Sie den Typ erstellen kann und ihn dann eine neue Instanz zurückgibt. Die Factory-Instanzen arbeitest du dann aus einer Liste heraus einzeln ab.

An sowas hab ich auch schon gedacht, aber vorerst werde ich mal ChangeType weiter prüfen, ob es wirklich glatt läuft. Andernfalls muss ich wohl auf so eine Lösung zurückgreifen.

19.08.2009 - 00:32 Uhr

Hi,

folgendes Problem: Ich bastle an einer Art Verwaltung für einen beliebigen Dateityp. Da ich öfters mal mit sowas konfrontiert werde, möchte es etwas dynamisches haben, auf das ich dann immer wieder zurückgreifen kann. Problem dabei ist natürlich, dass alles generisch ablaufen muss, da es ja eine beliebige Klasse sein soll.
Wenn ich jetzt eine Textdatei anlege mit allen Eigenschaften der Klasse + deren Werte und diese wieder lade, muss ich natürlich die Werte wieder den Eigenschaften zuordnen. Mittels Reflection komm ich natürlich auch an die Properties dran, nur das Converten macht mir noch sorgen. Vorerst sollte es reichen, wenn es für alle Wertetypen klappt. Nur bin ich auf der Suche nach einer dynamischen Lösung, kein "if string -> convert to string".

Danke für jede Hilfe.

16.08.2009 - 15:30 Uhr

Das einzige wirkliche Problem, dass ich an der Lösung sehe, ist das Überschneiden von Bearbeitungen an der Datei.
Das wird in der Tat zum scheitern kommen mit der Idee. Den Grund nennst Du ja selbst schon.

Wobei ich da noch sagen würde, dass man das irgendwie umgehen kann. Es gibt sicher Methoden um nachzuprüfen, ob die Datei gerade "belegt" ist. Und wenn ja, kann man immernoch eine weitere Datei nachliefern und diese später zusammenlegen, wenn mal nichts in Bearbeitung ist.
Und sicher ist mir klar, dass das keine Lösung ist, mit der man dauerhaft leben kann. Allerdings geht es mir in erster Linie darum, etwas mit möglichst wenig Aufwand auf die Beine zu stellen, was ich mit meinem jetzigen Stand schon hinbekomme. Dazu möchte ich mich nicht wochenlang in PHP einarbeiten müssen. Wenn ich diesen Schritt schon wagen würde, dann auch gleich ganz und nicht nur, um mein kleines Problemchen in den Griff zu kriegen.

Also ich bedanke mich für die Ideen und Denkanstöße, aber lehne dennoch ab. Mich würde jetzt nur noch interessieren, ob es eine gute, eventuell sogar (fast) risikofreie Möglichkeit gibt, eine Textdatei im Netz zu updaten. Danach bin ich vorerst versorgt. 😉

Habe keine Möglichkeit gefunden und mich eben doch an PHP rangewagt. Trotzdem danke.

16.08.2009 - 15:14 Uhr

Wenn ich jetzt noch PHP beherrschen würde, wäres alles kein Problem. 😉
Habe mich da leider nie wirklich mit beschäftigt, verstehen tu ichs vielleicht, aber selber schreiben würde mich wieder etwas Zeit kosten.
Ist die Methode, die ich in meinem ersten Beitrag geschrieben habe, wirklich so krass umständlich? Im Prinzip möchte ich ja keinen wirklichen Server, sondern nur eine Anlaufstelle für die einzelnen Clients, an der sie schauen können, wer alles online ist. Soll heißen ich möchte die Clients alle in die Datei eintragen, diese dann für jeden Client anzeigen lassen und bei Auswahl eines Clients diesen mit dem anderen verbinden(funktioniert bereits). Das einzige wirkliche Problem, dass ich an der Lösung sehe, ist das Überschneiden von Bearbeitungen an der Datei.

16.08.2009 - 15:05 Uhr

Danke für den Beitrag.

So eine Lösung setzt allerdings voraus, dass ich einen Server im Netz hängen habe oder? Da ich selber keinen betreibe, wollte ich es eben mit ein wenig Webspace handeln. So in etwa meinte ich das mit "einfachere Art".
Sicher ist der Ansatz von dir richtig, aber wahrscheinlich zu aufwändig für das was ich vorhabe.

16.08.2009 - 14:51 Uhr

Hallo zusammen,

ich arbeite gerade an einem kleinen Netzwerkspiel und bin zumindest schonmal soweit, dass zwei Spieler einigermaßen fehlerfrei gegeneinander spielen können. Dazu muss man sich allerdings direkt mittels IP verlinken.
Ich hatte jetzt die Idee, schlicht mittels einer Textdatei, die im Netz hängt, eine Liste aller Spieler zu verwalten. So könnte man immer schauen, wer gerade online ist bzw. einfach erstmal eine Verbindung herstellen, ohne sich mit IPs und ähnlichem auseinanderzusetzen.
Die Textdatei abzurufen ist sicher schnell mit einem WebClient (client.DownloadString) gemacht, das aktualisieren der Textdatei geht allerdings nicht einfach mit UploadString. Dazu müsste ich entweder die Datei völlig neu hochladen, was mir aber zu risikoreich erscheint.
Gibt es da einen besseren Weg oder hat jemand direkt eine bessere Idee für eine Spielervermittlung der einfacheren Art?

13.08.2009 - 22:18 Uhr

PS: Wenn ich auf Debuggen gehe :

FileNotFoundExeption wurde nicht behandelt:
Die Datei oder Assembly "Microsoft.Xna.Framework.Game, Version=3.1.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Mh..da sagt es aber das es das FW net finden kann bzw meins veraltet sein soll . Ich Installier mal ein anderes FW könnte ja an mir liegen.

Übrigends würde ich irgendwo den Link zum XNA 3.1 Redistributable hinpacken ->
>

Alles klar?

11.08.2009 - 01:34 Uhr

Freut mich, dass es voran geht. Sieht super aus. Ich geb mal ein wenig Kritik im Forum ab. 😉

Übrigends würde ich irgendwo den Link zum XNA 3.1 Redistributable hinpacken -> http://www.microsoft.com/downloads/thankyou.aspx?familyId=53867a2a-e249-4560-8011-98eb3e799ef2&displayLang=en

16.07.2009 - 21:42 Uhr

Kommt hier nochmal etwas? Hatte dich auch privat angeschrieben, aber kam bisher gar nichts.

02.07.2009 - 11:07 Uhr

Ich habe relativ oft was über Sockets gefunden, daher dachte ich eben, dass das wohl eine Methode sei, mit der man öfters arbeitet. Und mit "offline" meinte ich nicht mit dem Internet verbunden, war vielleicht etwas schlecht formuliert.

Aber wie oben zu lesen:

Edit: Habe es schon hinbekommen, danke nochmal.

Von daher danke für die kleine zusätzliche Erläuterung, aber ich habe bereits Fortschritte gemacht. Im Moment hakts nur noch ein wenig am Finetuning, aber das liegt weniger an der Kommunikations-Technologie.

Die "Anwendung" ist eigentlich nur eine Klasse, die ich dann in einem Spiel benutze, um auch übers Netzwerk einen Multiplayer zu ermöglichen.

Wenns dich interessiert -> Snake

28.06.2009 - 22:43 Uhr

Ah danke für die Bugs, werde mich die Tage dransetzen. Im moment macht mir das Netzwerkspiel noch zu schaffen, aber sieht schon ganz gut aus.

27.06.2009 - 17:36 Uhr

Ich habe zwei Screens gemacht, von den Einstellungen und der Hauptform.

Hauptform
Einstellungen

Übrigends nehme ich gerne Vorschläge entgegen, wie ich die Netzwerk-Spiele einbauen soll. Beispielsweise muss geklärt sein, wie ein Spiel gestartet wird. Gibt ein Spieler ein Zeichen, dass er gerne starten würde, und der andere bekommt eine entsprechende Nachricht und startet dann endgültig oder wie wäre es gut?

27.06.2009 - 16:44 Uhr

Hallo zusammen,

aktuell arbeite ich an einem kleinen Spiel, um mich weiter in C# einzuarbeiten. Als Spielidee habe ich mir das gute, alte Snake ausgesucht, welches recht einfach umzusetzen ist und dennoch Spielspaß bietet. Es gibt also eine Schlange, die per Tastatur gesteuert wird und möglichst schnell Äpfel fressen muss. Allerdings wird mit jedem Apfel die Schlange länger und das Spiel schneller.

Bisher enthalten ist eine Form, in der gespielt wird, und eine Form mit Einstellungen zum Spiel. Die Größe der Hauptform passt sich der Spieleranzahl an. Einstellbar ist bisher die Anzahl an Spielern sowie deren Tastaturbelegung und Farbe. Außerdem soll es drei Modi im Multiplayer geben: Wer sammelt die meisten Punkte (bis zu seinem Tod), wer überlebt am längsten und wer sammelt am schnellsten eine gewisse Punktzahl. Die ersten beiden sind zwei bereits fertiggestellt.

Zusätzlich will ich das Spiel netzwerkfähig machen, damit auch im Multiplayer über LAN oder das Internet gespielt werden kann.

In der aktuell verfügbaren Version 1.1 ist alles soweit lauffähig und auch im Multiplayer spielbar. Bevor ich das Spiel weiter ausbaue, will ich allerdings die Netzwerk-Anbindung fertigstellen.

Hier noch ein paar Daten:

Name: Snake
Hersteller: bonzy
Version: 1.1
.Net: 2.0
Spieler: 1-4
Modi: Normal, Survival, Wettfressen

Ich hoffe, dass jemand gefallen an der Arbeit findet, und würde mich über Kritiken und Verbesserungsvorschläge freuen.

PS: Ich weiß, dass die Grafik nicht atemberaubend ist, aber sie erfüllt ihren Zweck. Dennoch nehme ich hierzu natürlich auch Vorschläge entgegen.

25.06.2009 - 22:54 Uhr

Das Problem bei mir ist gerade, dass ich zwar von einer Seite aus senden kann und von der anderen empfangen, aber nicht beides.

Eventuell hilft ja der Quellcode weiter, hoffe es ist nicht zu viel.

Edit: Habe es schon hinbekommen, danke nochmal.

using System;
using System.Collections.Generic;
using System.Text;

using System.Net;
using System.Net.Sockets;

namespace snake
{
    public class Network
    {
        private System.Net.IPEndPoint inputEndPoint;
        private System.Net.IPEndPoint outputEndPoint;

        private Socket listenSocket;
        private Socket acceptSocket;
        private Socket outputSocket;

        private const int port = 2208;

        public void InitNetwork(string ipAdress)
        {
            if (this.acceptSocket != null && this.acceptSocket.Connected)
            {
                this.acceptSocket.Close();
            }

            this.outputEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ipAdress), port); 

            this.acceptSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            this.Connect();
        }

        public void InitNetwork()
        {
            if (this.listenSocket != null) return;

            this.inputEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, port);

            this.listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            this.listenSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

            this.listenSocket.Bind(this.inputEndPoint);

            this.listenSocket.Listen(1);

            this.listenSocket.BeginAccept(new AsyncCallback(AcceptMessage), null);
        }

        private void Connect()
        {
            try
            {
                this.acceptSocket.BeginConnect(this.outputEndPoint, null, null);
            }
            catch
            {
                this.ErrorMessage("Connection failed");
            }
        }

        private void ErrorMessage(string message)
        {
            System.Windows.Forms.MessageBox.Show(message, "Error",
                System.Windows.Forms.MessageBoxButtons.OK,
                System.Windows.Forms.MessageBoxIcon.Error);
        }

        public void SendMessage(string message)
        {
            this.acceptSocket.Send(System.Text.Encoding.ASCII.GetBytes(message));
        }

        public void SendMessage(IAsyncResult result)
        {
            this.listenSocket.EndSend(result);
        }

        public void AcceptMessage(IAsyncResult result)
        {
            this.acceptSocket = this.listenSocket.EndAccept(result);

            byte[] buffer = new byte[4096];

            this.acceptSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
                new AsyncCallback(this.ReceiveMessage), buffer);
        }

        public void ReceiveMessage(IAsyncResult result)
        {
            try
            {
                this.acceptSocket.EndReceive(result);
            }
            catch
            {
                this.ErrorMessage("Connection abrupted");
                return;
            }

            this.OnNewMessage(System.Text.Encoding.ASCII.GetString((byte[])result.AsyncState));

            byte[] buffer = new byte[4096];

            this.acceptSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
                new AsyncCallback(this.ReceiveMessage), buffer);
        }

        ~Network()
        {
            if (this.listenSocket != null && this.listenSocket.Connected)
            {
                this.listenSocket.Close();
            }
        }

        private void OnNewMessage(string message)
        {
            this.NewMessage.Invoke(message);
        }

        public delegate void NewMessageEventHandler(string message);

        public event NewMessageEventHandler NewMessage;
    }
}
25.06.2009 - 21:47 Uhr

Die Erklärung hilft mir sehr, danke dafür. Eine Frage hätte ich jetzt noch: Kann ein Socket-Objekt parallel Senden und Empfangen oder braucht man dafür zwei?

25.06.2009 - 15:12 Uhr

Also wäre es egal, wer Server und wer Client ist, da beide sowohl Senden als auch Empfangen können? Es käme nur darauf an, wer die Verbindung hergestellt hat?
Wie genau ist denn der Ablauf beim Senden und Empfangen? So wie ich es verstanden habe sendet der Client etwas an den Server, dieser empfängt die Daten und schickt etwas an den Sender zurück. Dabei kann der Server aber nicht von sich aus einen Client ansprechen oder?

25.06.2009 - 14:41 Uhr

Also wären bei einer Verbindung zwischen zwei Rechnern beide sowohl Client als auch Server, da sie sowohl Senden als auch Empfangen können. Ich denke mit dem Wissen werde ich dann mal weiterschauen.

25.06.2009 - 13:48 Uhr

Hallo zusammen,

und zwar möchte ich wie im Topic angekündigt eine Verbindung über Sockets herstellen. Dazu gibt es im Netz zwar genug Tutorials, allerdings wird sich dort immer mit einer Verbindung zwischen Client und Server beschäftigt. Ich will allerdings direkt eine Verbindung zwischen zwei Clients herstellen, da so auch offline eine Verbindung möglich ist und mir außerdem kein Server zur Verfügung steht.
Über verschiedene Beispiele bin ich auf die Klassen Socket und NetworkStream gestoßen, mit denen ich auch schon eine Verbindung herstellen konnte. Allerdings macht mir die Übertragung zu schaffen, dort wäre ein wenig Hilfe nicht schlecht.
Allgemein bräuchte ich also Hilfe beim Senden und Empfangen von Daten über eine Client-Client-Verbindung, ob es nun auf Socket/NetworkStream hinausläuft oder nicht, ist mir dabei relativ egal, hauptsache es funktioniert gut, lasse mich da gerne von besseren Methoden überzeugen.

Bin dankbar für jede Hilfe. 😃

20.06.2009 - 13:45 Uhr

Hi JuyJuka,

schonmal danke für den Tipp, denke, dass ich damit zurecht kommen werde.
Habe jetzt FindForm() im Load-Event des UserControls aufgerufen und setze dort wiederum das Closing-Event der übergeordneten Form. Danke 😉

20.06.2009 - 12:55 Uhr

Hallo zusammen,

aktuell arbeite ich an einem UserControl, dass einige Einstellungen beinhaltet. Diese sollen nun unter Settings gespeichert werden, dazu rufe ich in der Dispose-Methode des UserControls eine Methode auf, die alles weitere regelt. Allerdings ist schon bei Aufruf von Dispose der Inhalt meiner TextBoxen gelöscht sprich die Text-Eigenschaft ist leer. Bei anderen Controls wie einer ComboBox ist noch alles vorhanden. Wenn ich jetzt in der Form, in der ich das UserControl verwende, am Anfang der Dispose-Methode der Form Dispose für das UserControl aufrufe, sind die TextBoxen noch gesetzt. Allerdings würde ich es nicht gerne so "umständlich" machen, da das UserControl von jemand anderem benutzt wird. Es soll möglichst ohne weitere Einstellungen von außen funktionieren.

Hat jemand eine Idee? Danke für jede Hilfe.

17.05.2009 - 13:52 Uhr

Man danke dem Meister 😃

17.05.2009 - 13:29 Uhr

Hallo zusammen,

ich bin gerade auf der Suche nach einem Weg, meine Unterfenster unveränderbar in ihrer Größe zu machen. Bei einer normalen Form funktioniert es mit "AutoSizeMode = GrowAndShrink" normal, aber bei einer Form, die ich mit ShowDialog aufrufe, kann man immer die Größe verändern. Eine Lösung wäre, die maximale/minimale Größe anzupassen, dadurch bleibt allerdings immernoch die Grafik unten rechts in der Ecke zum Ändern der Größe, auch wenn das nicht mehr klappt. Sieht einfach blöd aus und ich hätte es gerne auch optisch logischer.

Danke für jede Hilfe.

13.05.2009 - 15:15 Uhr

Ich habe es gerade ausprobiert und sowohl die Datei- als auch die Assemblyversion ändern den PublicKeyToken nicht.

10.05.2009 - 00:47 Uhr

Der PublicKeyToken scheint wohl der strongname einer Assembly zu sein. Und wenn der falsch ist oder null, dann wird die Assembly nicht gefunden.
Sollte jetzt also mit der Version auch der PublicKeyToken verändert werden, wäre es Arbeit, überall die Werte zu verändern. Daher die Frage.

09.05.2009 - 17:32 Uhr

Hallo zusammen,

ich habe eine kurze Frage: Ändert sich der PublicKeyToken beim Ändern der Version einer Assembly? Gibt es da vielleicht einen Trick, wenn es so sein sollte?

09.03.2009 - 16:28 Uhr

Ich wusste doch, dass es da was gibt. Danke. 😃

Edit: Gibt es für ein solches Zeichen auch einen bestimmten Namen bzw. gibt es mehr von der Sorte?

09.03.2009 - 15:10 Uhr

Hallo zusammen,

ich bin gerade auf das Problem gestoßen, dass meine Shortcuts meiner MenuStripItems nicht direkt angezeigt werden. Bei den meisten Porgrammen werden die Buchstaben, die den Shortcut des jeweiligen Items darstellen, unterstrichen und ich frage mich, ob das "einfach" geht, indem ich eine Einstellung setze oder ähnliches. Es würde zwar mit einem KeyDown-Event gehen, aber vielleicht übersehe ich ja was und es geht einfacher.

27.02.2009 - 15:40 Uhr

Ich zeichne jetzt wie gesagt ganz schlicht auf eine PictureBox, die eben mein Bild enthält. Das Bild wird entsprechend danach gezeichnet, sodass auch das Bild über dem vorher gezeichneten liegt.

27.02.2009 - 15:36 Uhr

Und da ich ein Bild habe, benutze ich die PictureBox. Wo ist jetzt der Fehler? Es klappt übrigends, wenn ich es so mache.

27.02.2009 - 15:32 Uhr

Und in die Form zeichnen? Dann doch lieber mit einer PictureBox.

27.02.2009 - 15:19 Uhr

Also im Klartext, ich soll bloß eine PictureBox statt zwei benutzen?

Naja, wenn es denn anders nicht geht.

27.02.2009 - 15:08 Uhr

Leider funktioniert das nicht so wie ichs will. Ich habe 2 PictureBoxen übereinander.
Vergiss die Pictureboxen und zeichne selbst!!!

Zeichnest du ein gutaussehendes Thermometer mit C#?

Also ich eher nicht.