Ich weiß noch nicht mal genau, wie sich die Box verhält, wenn man die DSL-Verbindung kappt und ob das nicht automatisch wieder eine neue Verbindung aufbaut.
Zur Version 1.0 hab ich leider keine Ahnung mehr wie es aufgebaut war.
In der aktuellen Version stehen dir in WANIPConnectionClient und WANPPPConnectionClient je nachdem welche Verbindungsart du hast Methoden zur Verfügung zum Beenden der Internetverbindung und zum Neuaufbau der Verbindung.
Was mich aber eher interessiert, woran scheiterst du bei der aktuellen Version? - In wie fern bekommst du die nicht zum laufen? => das gerne per PN. Damit müssen wir den Thread hier nicht zu ballern.
Spätestens wenn die Nutzer gleichzeitig auf der "Datenbank" arbeiten können sollen, ist Access keine gute Idee mehr.
Ansonsten würde ich mir im ersten Schritt nicht so viele Gedanken über das UI machen. Wichtiger ist erst einmal, die Logik und Datenhaltung zu implementieren. Am Ende entscheidest du dich ja vielleicht statt einer Anwendung für eine Webapplikation.
erstellst du im Code eine neue Instanz von "TestClass"? Dann ist natürlich klar, dass nichts passiert. Damit generierst du ein komplett neues Objekt was mit dem an die Controls gebundenen Objekt nichts zu tun hat.
Du musst hier auf jeden Fall genau das TestClass-Objekt verwenden, dass du dem Control auch in den Binding festgelegt hast.
Ist es wirklich ein: Du klickst auf die *.exe-Datei und es passiert einfach gar nichts?
Wenn irgendwelche notwendigen Dateien fehlen würden, sollte dir eigentlich ein Exception-Fenster aufgehen. Esseidenn du fängst die Exceptions ab und tust nichts damit.
der Hinweis ist zwar gut. Aber: An dieser Stelle ist es nicht erforderlich den Basistyp zu verwenden. Und an Stellen, wo ohnehin der Konkrete Typ bekannt ist kann und sollte der verwendet werden.
Erst wenn es komplexer wird und die konkreten Typen nicht mehr bekannt sind, sollte und muss man auf die Basisklasse zurück greifen. Hier absolut nicht erforderlich.
Und ansonsten ist die Aufgabe relativ einfach zu Lösen. Du generierst eine Liste mit Objekten vom Typ ILebewesen und fügst dieser deine einzelnen Lebewesen hinzu.
List<ILebewesen> lebewesen = new List<ILebewesen>();
Mensch mensch = new Mensch();
// ...
lebewesen.Add(mensch);
Im Anschluss brauchst du dann nur noch mit Hilfe einer foreach-Schleife die einzelnen Lebewesen durchgehen und ausgeben.
EDIT: Vergiss die Liste. Du sollst ja ein Array von ILebewesen verwenden. - Aber ist jetzt auch nicht sonderlich schwerer.
der Nutzer hat doch jederzeit selbst die Möglichkeit einen Link in einem neuen Tab zu öffnen. Dazu einfach die mittlere Maustaste / das Mausrad reindrücken.
Sind die 11 Zeichen pro Zeile eigentlich ernst gemeint? Dann wird doch die hälfte verschluckt. Ich meine klar, wenn nur die Kommas ausgegeben werden passt es. - Aber die Zahlen sind ja schon 22 Zeichen auf 7 Zeilen.
Sind hier nicht eher 22 Zeichen pro Zeile gemeint und nur die Kommas sollen weggelassen werden?
Ich würde schon mal vorschlagen, erst das Bytearray einzulesen und dann die Seriennummer auszugeben.
Spart dir nämlich eine ganze Schleife für die Ausgabe.
// EDIT: Ach nein. Du hast ja gar keine zusätzliche Schleifen.
// Dennoch weiterhin. Hole dir erst das vollständige Array und schreibe dann den Text in die Textbox.
LogLevel unterstützen denke ich alle vernünftigen Lösungen (z.B. Log4Net). Das Filtern bezüglich der IP-Adressen wirst du jedoch selbst implementieren müssen.
Fummel das am besten so nicht im Code Behind zusammen. Erstelle dir eine Klasse, welche dein Objekt enthält z.B. etwas wie:
public class DateSelectionEntry
{
private DateTime _date;
public DateTime Date
{
get { return _date; }
set { _date = value; }
}
public string DisplayText
{
get { return this._date.ToString("d M"); }
}
}
Das sauber per DataBinding angebunden (natürlich die Klasse auch ensprechend angepasst) ist deutlich besser als zu versuchen da über den CodeBehind was zusammen zu fummeln.
Wie ich schrieb, liegt es am Wechsel des Nutzerkontextes.
Nutzer XYZ verbindet das Netzlaufwerk mit seinen Berechtigungen. Wenn jetzt Nutzer ABC eine Anwendung unter seinem Namen startet, ist das doch nix anderes als hätte er sich mit seinem eigenen Konto angemeldet und die Anwendung gestartet. Warum sollte er hier also die Netzlaufwerke von XYZ sehen können? Schon in Bezug auf Computersicherheit wäre das etwas unglücklich.
Wobei ich bis heute auch noch nicht ganz durchgeblickt habe, warum das Berechtigungssystem mit Windows 7 so stark abgeändert wurde, dass man um eine Anwendung wirklich als Admin zu starten (der man ja eigentlich schon ist) einen Kontextwechsel ausführen muss.
Ich meine klar. der Grund ist mir durchaus geläufig. Das erhöht einfach erheblich die Sicherheit des Systems. Ist aber im Umkehrschluss halt häufig auch so semi cool.
Mal davon ab, dass ich es für eine schlechte Idee halte Anwendungen automatisch zu beenden, an denen gerade jemand arbeitet eventuell folgender Ansatz:
- In der Datenbank in einer meinetwegen "Config"-Tabelle ein Flag einführen: "Shutdown".
Die Anwendung muss dann zyklisch die Tabelle anfragen und auf das Flag prüfen. - Ist es "1" wird ein Hinweis in der Anwendung angezeigt, mit der Möglichkeit die Anwendung zu beenden. Bestätigt der Nutzer das nicht, läuft die Anwendung einfach weiter.
Haben alle Nutzer bestätigt und die Anwendung beendet, kannst du dein Update ausführen und das Flag wieder auf 0 setzen.
Schön ist die Lösung nicht, aber es ist neben der Lösung von BerndFfm, das einzige was mir einfällt was halbwegs i.O. erscheint.
wenn es Netzlaufwerke sind, die mit Zugangsdaten des Nutzers verbunden werden, liegt es tatsächlich daran, dass die Anwendung mit Adminrechten ausgeführt wird.
Das liegt einfach daran, dass damit in einem anderen Nutzerkontext gewechselt wird.
Nein du musst gar nichts in einen String umwandeln. Du liest die Bytes und anhand der Werte (Rückumwandlung in UInt16) weißt du, wie die Antwort aussieht.
Was hast denn du die ganze Zeit mit deinen Zeichen / Strings?
Insofern scheint ja zumindest das anzukommen, was du auch versendest. Allerdings ist das was du versendest nicht korrekt. Übrigens verschickst du 11 Bytes und nicht wie Eingangs in der Beschreibung angeführt, 2 die du versenden sollst.
Fragst du nämlich mich sollte dein Byte Array das du versendest folgende Werte haben:
1
0
Mit dem Bridgemode und Konfiguration der Fritz!Box auf Verwendung eines vorhandenen Kabelmodems funktioniert alles genau so, wie ich es brauche.
Eine gute Anleitung bietet dafür AVM. FRITZ!Box für Betrieb am Kabelanschluss einrichten.
Funktioniert soweit ich das sehe auch mit allen aktuellen Geräten.
natürlich ist angedacht in Zukunft auf ein Kabelrouter von AVM zu wechseln. - Allerdings mag ich nicht gerne mit Mietgeräten hantieren, weswegen ich das erst einmal nach hinten geschoben habe. - Finanziell ist jetzt ein neuer Router einfach nicht drin.
Aber nach langem suchen habe ich wohl einen Weg gefunden der viel versprechend ist. Kann ich aber erst am Mittwoch ausprobieren, weil es so lang dauert bis V/KD den Homespot abgeschaltet hat.
Laut einigen Sachen die ich im Netz dazu gefunden habe, muss die Kabel-Box von V/KD nur im Bridgemodus betrieben werden und die Internetverbindung anschließend über den Assistenten neu eingerichtet werden (Betrieb an Kabel-Modem).
in meiner neuen Wohnung habe ich auf Kabel-Internet von Kabel Deutschland gesetzt. - Der gelieferte Standard Router soll hierbei jedoch "nur" als Modem dienen. - Daher habe ich meine Fritz!Box als IP-Client angeschlossen.
In der Fritz!Box ist seit langem der VPN Zugriff und DynDNS aktiv. Natürlich bekommt die Fritz!Box die Neueinwahl nun nicht mit. Welche Möglichkeiten, außer einen zusätzlichen Progrämmchen auf weiterer Hardware stehen mir denn jetzt zur Verfügung den DynDNS Anbieter über die geänderte IP-Adresse zu informieren?
DynDNS auf der Kabel Deutschland Hardware zu aktivieren möchte ich eigentlich vermeiden.
was für Informationen beschreiben denn die "Settings"? Das sind doch wenn ich dich richtig verstehe irgendwelche Parameter für eine andere Schnittstelle (du schriebst: "und möchte sie konvertieren in Bytes und über den Serialport senden").
Dann haben die einzelnen Parameter ja sicherlich sprechende Namen.
Ansonsten, da du ja schreibst du kannst die XML frei ändern. Was spricht also dagegen dein Configuration-Objekt direkt zu serialisieren / deserialisieren? Das Xml sehe hier ja auch nur ein klein wenig anders aus:
Ist das Xml so vorgegeben oder kannst du das frei ändern?
Ansonsten.. wieso arbeitest du mit Reflection? Ich würde die Parameter einfach in einer Schleife durchgehen und anhand des Parameters den entsprechenden Wert setzen.
Configuration configuration = new Configuration();
foreach(Parameter parameter in settings.Parameters)
{
switch(parameter.Name)
{
case "Settings1":
configuration.Settings1 = Convert.ToUInt32(parameter.Value);
break;
....
}
}
Das wäre am Ende die sicherste Variante auf deinem Weg.
was würdet ihr empfehlen bei einer kleinen App, soll ich den Austausch von Informationen zwischen Klassen per Eventhandler oder Nachrichten schicken umsetzen?
Nachrichten in welcher Form? Zumal das stark abhängig vom Aufbau der Anwendung ist. Und wenns eine kleine Anwendung ist, sollte i.d.R. die einfache Werterückgabe von aufgerufenen Methoden ausreichen.
ich bin gerade dabei für Windows CE eine Rotationsfunktion für ein Array von Punkten zu schreiben, die anschließend gezeichnet werden sollen. Das funktioniert soweit erst einmal auch. Allerdings scheine ich irgendwo einen Knoten zu haben, da es augenscheinlich zusätzlich um die Z-Achse rotiert.
Meine Funktion ur Rotation sieht wie folgt aus:
private Point[] Rotate(Point[] originalPoints, int angle, Point middlePoint)
{
Point[] rotatedArrowPoints = new Point[originalPoints.Length];
for (int i = 0; i < originalPoints.Length; i++)
{
// Punkte um den Mittelpunkt verschieben (Standard 0,0 = oben links)
double x = originalPoints[i].X - middlePoint.X;
double y = -originalPoints[i].Y + middlePoint.Y;
// Berechnung neue Koordinaten
x = (x * Math.Cos(angle * Math.PI / 180)) - (y * Math.Sin(angle * Math.PI / 180));
y = (x * Math.Sin(angle * Math.PI / 180)) + (y * Math.Cos(angle * Math.PI / 180));
// Verschiebung um Mittelpunkt rückgängig machen
x = x + middlePoint.X;
y = (y - middlePoint.Y) * -1;
rotatedArrowPoints[i] = new Point((Int32)x, (Int32)y);
}
return rotatedArrowPoints;
}
Auch ohne die Multiplikation mit Math.PI / 180 sieht das Ergebnis ähnlich verkorkst aus. - Lediglich bei 0 und 180 grad sieht das Bild korrekt aus. Hat jemand eine Idee, an welcher Stelle ich den Rechenfehler mache?
Das Bild im Anhang zeigt die verwendete Beispielzeichnung bei 0°, 30° und 90 °.