Ich hab es nun so gemacht wie es eigentlich sein sollte, Ich nutze object und Konvertieren nun immer entsprechend selbst, damit bin ich Typ sicher muss aber immer in den Funktionen Konvertieren.
die Interpretation von Latino ist Korrekt genau das wollte ich erreichen :).
Type.MakeGenericType und Activator.Createinstance hab ich mir auch angeschaut und ist tatsächlich eine Möglichkeit, jedoch gefällt mir die noch weniger als alles manuell zu Konvertieren :D
Ich erzeuge einen SplashScreen immer folgendermaßen:
1. MainForm Konstruktor ausführen
2. Im Konstruktor als erstes this.Hide ausführen
3. Im Konstruktor als zweites SplashScreen erzeugen und mit Show und BringToFront anzeigen
4. Im Konstruktor einen neuen Thread erzeugen in dem dein Ladevorgang stattfindet.
5. Wenn Ladevorgang beendet SplashScreen.Hide und this.Show ausführen.
Damit solltest du einen Funktionierenden SplashScreen bekommen.
public class NetworkArgs<T> : EventArgs
{
public T Message;
public NetworkArgs(T Message)
{
this.Message = Message;
}
}
Nun hätte ich gerne eine Liste in dieser sollen verschiedene (T's) Typen gespeichert werden
Anschließend möchte ich eine neue Instanz von NetworkArgs erzeugen mit einen Typen aus der vorher erstellten List.
Ist das möglich, wenn ja wie?
ich habe es bereits mit einige Datentypen versucht, jedoch ohne erfolgt.
Auch habe ich versucht die Datentypen einfach als object zu speichern und später mit typeof zu ermitteln, jedoch ohne erfolg.
Ich hab mich mit 2D ohne Camera leider zu wenig beschäftigt, aber ohne Camera muss du eigentlich folgendes tun:
1. Maus Position bestimmen
2. Alle Bilder so verschieben das die Maus Position das Zentrum ist und die Sprites vergrößern.
So würde ich es zu mindestens ohne Camera versuchen zu Lösen, aber ob das der Richtige weg ist kann ich dir leider nicht sagen.
zu den Parametern die View und Projection Matrix sind Werte die eine Camera benötigt.
Wenn du also eine Camera einsetzen solltest benötigt diese eine View und Projection Matrix, diese wiederum werden in der oben gezeigten Funktion benötigt.
Zu der Camera in XNA wirst du aber ein Haufen Tutorials finden die ausführlich und meist sehr anschaulich dir alles erklären.
Thread.Sleep ist meiner Meinung nach ein Workaround für Problem die man nicht sauber lösen kann. Verwende einen Custom EventHandler oder ein Delegate, diesen/dieses rufst du auf wenn der Ladevorgang abgeschlossen ist, dadruch sollte die schleife unnötig sein.
Die try...except- Behandung habe ich herausgenommen, denn sie kaschiert den Grund für den Fehlschlag komplett (Disk voll, Dateiname ungültig, Daten korrupt).
Diese würde ich nicht entfernen, da sonst bei jeder Exception das Programm crashed. Grade bei TCP/SQL etc. sollte man immer zu Sicherheit try catch verwenden,da man nie alle Fehler selbst abfangen kann bzw. es enormer Aufwand währe. Jedoch wurde das try catch natürlich falsch implementiert
Hier ein etwas bessere Fehlerbehandlung
try
{
}
catch(Exception error)
{
//error.StackTrace -> in Error-Log speichern
//error.Message -> in Error-Log speichern
//ggf. Datum / Uhrzeit in Error-Log speichern
//MessageBox mit nachricht an den User das etwas nicht funktioniert hat ggf. error.Message anzeigen
//bei Exceptions wie timeout ggf. auto-retry einbauen
}
Natürlich kann man die Fehlerbehandlung auch außerhalb der Klasse gestallten, es sollte aber jedenfalls darauf geachtet werden das die Exceptions irgendwo, ob nun in der Klasse oder außerhalb, abgefangen werden.
Data Source=DATENBANK;Initial Catalog=TABELLE;Persist Security Info=True;User ID=reader;Password=**********
Was mir auffällt ist das Data Source eigentlich der Server ist und Initial Catalog die Datenbank.
Die Tabelle wird in einem ConnectionString nicht angegeben.
ich hab ein Tool welches mehrere unbekannte DLLs laden kann, die aber mit meinem Interface übereinstimmen müssen.
In einen Eigenen Thread werden die DLL's geladen und mehrere Funktionen werden aufgerufen.
Nun kommt es aber ab und zu vor (Ja nicht immer, bei ca. 1 von 5 Programm-Starts), dass wenn ich die Rückgabewerte in einen Dictionary einfüge eine NullReferenceException auftritt.
Was wirklich interessant ist das:
1. Die NullReferenceException nur ab und zu kommt -> Der Programmablauf ist aber vollkommen identisch und ein User kann noch nicht eingreifen, da der Code mit dem Form_Load Event ausgeführt wird.
2. Wenn ich die Variablen mir anschaue ist keine der Variablen NULL.
3. Ich füge vier Rückgabewerte in vier verschiedene Dictionaries ein und der Fehler scheint bei einen beliebigen Dictionary aufzutreten... mal ist es das erste, dann wieder das dritte.
if (plugin != null)
{
if (!plugins.ContainsKey(FileName))
plugins.Add(FileName, plugin); //Fehler hier
if (!pluginInfos.ContainsKey(FileName))
pluginInfos.Add(FileName, plugin.GetPluginInfo()); //Fehler hier
if (!pluginButtonTexts.ContainsKey(FileName))
pluginButtonTexts.Add(FileName, plugin.GetButtonText()); //Fehler hier
Control c = plugin.GetControl();
if (!pluginControls.ContainsKey(FileName))
pluginControls.Add(FileName, c); //Fehler oder hier
}
Mir ist vollkommen schleierhaft wie ich eine Exception bekommen kann wenn keiner der Werte NULL ist.
ich hoffe jemand von euch hat eine Idee woran es liegen könnte, den ich könnte nach ewigen Debuggen nichts entdecken.
Der FTP Path ("ftp://192.168.100.2:21/subdir/test.txt") enthielt als Verzeichniss "subdir" dieses war aber schon das Standardverzeichnis des verwendeten Benutzers.
Das subdir musste also einfach aus den FTP-Path gelöscht werden.
Warum dies mit den Explorer und anderen FTP-Programmen problemlos funktioniert ist mir zwar noch ein Rätsel, da der Fehler vom FTP-Server zurück gegeben wurde.
ich habe drei Dateien die ich mit einen kleinen FTP Programm hochladen bei zweien funktioniert es super nur bei der dritten nicht.
leider konnte ich nach stunden langen debuggen und google noch immer keine Lösung finden.
Jedes mal wenn ich versuche die Datei zu Uploaden bekommen ich folgenden Fehler:
Der Remoteserver hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z.B. nicht gefunden oder kein Zugriff
Ich hab via FileZilla den Username und das Passwort ausprobiert und auch versucht einen Datei Manuell hoch und runterzuladen. Alles lief ohne Probleme.
Versuche ich eine Datei mit mein Programm herunterzuladen klappt das nicht.
ich bin auf ein komisches Problem gestoßen welches vermutlich ein bug im debugger oder Framework ... oder ich bin vollkommen blind :)
Ich möchte mehrere DLL's aus einem Verzeichnis laden (alle unterschiedlich aber von der selben Basis Klasse UND Interface abgeleitet)
Wenn ich nun folgenden Code ausführe wird bei LoadFrom(Pfad) die falsche DLL geladen trotz eindeutiger Pfad-Angabe.
private void LoadDll(string dllpath)
{
try
{
Assembly assembly = Assembly.LoadFrom(dllpath);
Type[] types = assembly.GetTypes(); //hier kommt immer das selbe raus
foreach (Type type in types)
{
//IBase baseInterface = assembly.CreateInstance(type.FullName) as IBase;
object data = assembly.CreateInstance(type.FullName);
IBase baseInterface = data as IBase;//gibt null zurück warum auch immer...
}
ich hab im Ordner z.b
InfoCollector.dll
a.dll
b.dll
für jede Datei ruf ich die Funktion LoadDll auf mit den entsprechenden Pfad als parameter
in der Variable assembly wird auch die richtige assembly geladen, solang es keine DLL ist die von dem Interface und der Basis Klasse Ableitet... ist es jedoch eine so wird immer die zuerst geladene DLL in dem Fall InfoCollector.dll geladen
Ich hab leider absolut keine Ahnung mehr woran das liegen könnte bzw. wie ich das Problem beseitige.
Desweiteren kann ich das geladene object wenn ich eine Instanz der Assembly erstelle nicht ins Interface Konvertieren. (es wird null zurückgegeben)
In meinem Test Projekt wo sich alle Klassen in einer Datei (2 Namespaces) befanden hat das Konvertieren super geklappt. Mit Ausnahme das sich alles in einer Datei befand (kein laden einer dll notwendig) hat sich bei der Konvertierung nichts geändert.
Ich hoffe jemand von euch hat eine Idee dazu, Danke.
Wenn du in Dynamics Nav zuvor entwickelte DLL's verwenden möchtest, muss du lediglich die DLL erstellen und in Windows registrieren. Anschließend kannst du diese als ganz normale Variable in Navision erstellen (DatenTyp: Automation in neueren Version glaube ich heißt der Daten-Typ: DotNet)
um eine DLL zu Registrieren kann folgendes in einer Batch-Datei gepackt und ausgeführt werden. (OurDLL.dll durch dein DLL-Namen ersetzen!)
SET GACUTIL="C:\Program Files (X86)\Microsoft SDKs\Windows\v7.0A\bin\gacutil.exe"
SET REGASM="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe"
%REGASM% OurDll.dll /tlb:OurDll.tlb
%GACUTIL% /i OurDll.dll
Zusätzlich solltest du folgendes Tutorial befolgen... Nun sollte nichts mehr schief gehen :)
Zu guter letzt sei gesagt das Google alle fragen zum Thema Interorp und Dynamics Nav schnell beantwortet hätte... auch wenn die Doku nicht so der bringer ist gibt's mittlerweile eine Menge Tutorials.
Wenn ein Dreieck 3D sein soll muss es eine Dicke haben daher würde man um genau zu sein ein Prisma Zeichnen. Würde man dies nicht tun könnte man das Dreieck von der Seite nicht sehen da es ja keine Dicke hat... Sprich wenn man ein 3 Dimensionales Dreieck zeichnen möchte muss man zwangsläufig ein Prisma zeichnen. Daher 2 Dreiecke die übereinander liegen und die verbindungswänder der zwei Dreiecke mit einer minimalen Dicken.
Das bedeutet alle Punkte werden mindestens zweimal gezeichnet und die Ränder sogar 3 mal wenn er jedoch nur ein Dreieck in einen Raumzeichnen möchte (was bedeutet dass,das Dreieck nicht 3 Dimensional ist) dann braucht man das natürlich nicht.
Wenn die Kompelierungzeit stark zu nimmt hat das fast immer etwas mit externen Medien zu tun also nicht mit dem Code sondern mit z.B. Bildern, Videos bzw. irgendwelches Content welches aber auch ein Kompile Vorgang durchläuft. Das war zu mindestens bei mir meistens der Grund das es schonmal mehrere Minuten dauerte.
Die Pixel müssen doch alle Doppelt gesetzt werden Wenn dein Dreieck 3 Dimensionen hat, hast du 2 Dreiecke die Exakt aufeinander liegen mit einen gewissen abstand dazwischen die Rand bereiche müsste also daher mindestens 3 mal gezeichnet werden da ja noch die verbindungspixel gezeichnet werden müssen.
jedoch schaust du mit deiner "Kamera" von oben direkt auf dein Dreieck du würdest also nie mitbekommen ob dein Dreieck nun 2D oder 3D ist. Du brauchst also erstmal eine Kamera bzw. ansicht die es dir erlaubt das Dreieck von allen Seiten zu betrachten vorher kannst du nicht wirklich gescheit testen.
Wenn auf einen bestimmten Punkt schon etwas gezeichnet worden ist solltest du im normalfall diesen nicht nicht nochmal zeichnen, da du diese Pixel ja nicht mehr sehen kannst außer du fügst Tranzparenz hinzu.
Es muss auch darauf geachtet werden das du deine Objekte bzw. dein Dreieck von hinten nachvorne zeichnste sonst überdeckt die rückseite deine forderseite. (Nur notwendig wenn du nur das Zeichnen möchtest was du auch siehst ... was durchaus sinnvoll ist, jedoch muss du dein Dreieck immer wenn die Kamera oder Ansicht sich änder neu zeichnen)
Also jedemenge zu tun bevor das wirklich richtig funktioniert.
An hand deines Codes kann man leider nicht viel helfen grade auch weil wichtiger Code fehlt.
z.B. die Funktion Dist(list1, list2)
Am besten wäre es wenn du erstmal structs erstelltst z.B. wie in XNA
Vector3(x, y, z)
Vector2(X, y) oder auch Point
Line(Vector2 start, Vector2 ziel)
solche sachen sind viel einfacher zu verstehen und helfen dir auch ungemein weiter.
Ein object also z.B. eine Liste werden grundsätzlich als Referenz behandelt und nicht als Kopie, sogesehen gibst du der ComboBox ein Link zur Quellen, löscht du nun bei einer ComboBox etwas wird dies an die Quelle weitergeleitet in dem Fall die List<string>. Da beide aber als Quelle deine List haben wird das Element auch aus der zweiten ComboBox gelöscht.
Entweder du füllst die ComboBoxen selbst indem du die List mit einer Schleife durchläufst und anschließend
Der Operator "!=" kann nicht auf Operanden vom Typ "T" und "T" angewendet werden.
Weiß jemand wie ich diese zwei Werte vergleichen kann?
oldValue und Value sind immer vom gleichen DatenTyp der DatenTyp kann aber immer ein anderer sein.
wie Programmierhans schon gesagt hat, liegt es vermutlich an einer Foreach-Schleife in der du die Collection veränderts z.B. durch .Add() oder .Remove().
Wenn du in einer Schleife die entsprechende Collection verändern willst solltest du lieber eine FOR oder WHILE-Schleife verwenden.
Ohne weiteren Code lässt sich jedenfalls nicht weiter helfen bzw. genauere Aussagen treffen. :)
IPEndPoints lassen sich grundsätzlich übertragen nur die variable "Adress" des IPEndPoints wird auf null gesetzt.
Auf übertragungsfehler würde ich es jetzt nicht schieben sonst wäre das Problem glaube ich nicht immer an der selben stellen.
Warum das im Lan funktioniert und im Internet nicht ist mir auch ein Rätsel :)
Im Lan kann ich so wie du ohne Probleme De-/Serialisieren aber mit .Net 4.0
Naja ich sende nun die IP und den Port als Variablen mit und bau mir daraus den IPEndPoint auf der anderen seite selbst zusamme... das funktioniert wenigstens :)