Laden...

Forenbeiträge von trib Ingesamt 708 Beiträge

19.08.2013 - 09:35 Uhr

Hallo nop,

ein super Programm!
Habe es gerade unter Win8 64bit getestet. Grafikkarte ist eine NVIDIA Quadro2000M.
Läuft problemlos und sehr flüssig. Auch die Leisten werden im Vollbild ordnungsgemäß eingeblendet.

Gruß,
trib

24.07.2013 - 13:15 Uhr

Hallo zusammen,

als Nachteil von WP8 (habe ein Lumia 920) sehe ich noch:
Fehlende Ordner-Integration in Exchange. In meinen Kontakten habe ich z.B. einen Ordner "Kunden", der nicht synchronisiert wird. Es bleibt einzig und allein, diese Kontakte in den Haupt-Ordner zu verschieben und sich auf dem Telefon eine Gruppe manuell anzulegen.
Mehr oder weniger Zwang vom XBOX-Live Account. (Der einmal angelegt sich nicht mehr ändern lässt)
Nur einen Homescreen. Natürlich sind die Tiles schick und funktional. Aber bei vielen Apps würde ich mir Ordner zur eingruppierung o.Ä. wünschen.
Die Widgets bei Android haben auch ihren eigenen Charm.
Man benötigt immer einen Fingertipp mehr als bei Android oder iOS. Um Anrufe anzunehmen muss man erst wischen und dann nochmal tippen. Im Telefonbuch wische ich erst von den Favoriten zu allen Kontakten, dann tippe ich auf den Buchstaben (cooles Feature) suche mir dann den korrekten Buchstaben heraus, scrolle zum Kontakt, wähle diesen aus und tippe dann auf die entsprechende Nummer.

Apps dürfen keine Einstellungen vornehmen. Von Android bekannt, kann ich Zeit-, GPS, oder Sendemastgesteuert mein WLAN aktivieren oder das Telefon auf lautlos stellen. Diese Berechtigung gibt es nicht (mehr).

Grundsätzlich bin ich aber sehr zufrieden mit dem Telefon und würde es für den Firmengebrauch absolut weiterempfehlen. Gerade dass alle Apps (auch von Fremdanbietern) dem Designkonzept folgen ist klasse.
Privat bleibe ich aber bei meinem Android. Es ist zwar minimal langsamer (Android 4.1.1 - 1,5Ghz Dualcore) aber dafür kann ich alles konfigurieren und schick machen 😃

27.06.2013 - 09:12 Uhr

Guten Morgen zusammen,

ich habe vor einiger Zeit auf Windows 8 gewechselt und nach einiger Zeit auch alles lauffähig eingerichtet. (Registry-Eintrag damit VS immer als Admin startet, usw.)

Nun möchte ich ein unter Win7 funktionstüchtiges Visual Studio 2008 Projekt neu erstellen.
Es handelt sich dabei um eine CE 6.0 Anwendung, die auf einem MDE laufen soll.
Dort ist ein Installationspaket enthalten, welches folgenden Fehler schmeißt:

Fehlermeldung:
Fehler beim CAB-Assistenten von Windows CE. Weitere Informationen finden Sie im Ausgabefenster.

Das Ausgabefenster liefert dann folgendes:> Fehlermeldung:

ÿWarning: Section [RegKeys] has no data
Warning: Section [DefaultInstall] key "AddReg" - there are no section entries to process
Error: CAB file "C:\Kunden\MDE Solution 1.0.0\Release\MDE Solution.CAB" could not be created

*Die Meldung tritt bei jedem CE Installationspaket auf *Es gibt keine Registry-Einträge oder Ähnliches in dem Installer *Neu erstelltes Projekt mit Installationspaket liefert den selbigen Fehler *Hinzufügen eines Registry-Eintrages ändert auch nichts

Jegliche Suchanfragen liefern dasselbe Ergebnis. "Ignorieren Sie einfach diese Warnung". Nur dass es sich bei mir um einen Fehler und keine Warnung handelt und das Paket nicht erstellt wird.
Ein weiterer Vorschlag war, den Inhalt im Debug/Release-Ordner zu löschen (CabWiz.log & MDE Solution.inf). Diese änderte aber ebenfalls nichts am Ergebnis.

Hatte jemand ein ähnliches Problem oder eine Idee was diese Meldung verursachen könnte?

12.06.2013 - 08:40 Uhr

Guten Morgen H2SO4,

was stellst Du denn mit den Panels an? Mehr als 300 sind natürlich schon eine Menge. Wenn diese nicht so kompliziert aussehen, empfiehlt es sich in jedem Fall 300 Rectangles selbst zu zeichnen und im OnPaint der Form die sich ändernden Bereiche neu zu zeichnen.
Dazu sollte man, genau so wie Du es schon mit der Liste machst, die Grafik-Objekte in einer Liste vorhalten.
Hier hat herbivore das excellent beschrieben: [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

24.05.2013 - 14:58 Uhr

Ich habe nun zu Skydrive gewechselt und bin sehr zufrieden.

Hi Tomot,

falls Du Windows 7/8 nutzt, kannst Du den SkyDrive auch einfach verschlüsseln, wenn Du das möchtest:
BoxCryptor (kostenlos).
Apps für iOS, Android & Mac OS X gibt es ebenfalls.

Gruß,
trib

14.05.2013 - 12:01 Uhr

Hallo Christian,

vielen dank für die schnelle Antwort!
Aus den Tutorials hatte ich natürlich das static übernommen. Aber aufgrund des o.g. Fehlers testweise mal herausgenommen. Daher auch das [EDIT].
Kaum wieder einprogrammiert und es funktioniert alles wie gewünscht!
Vielen Dank! Da habe ich vor lauter Testen und probieren den Wald vor lauter Bäumen nicht gesehen 😃

Gruß,
trib

14.05.2013 - 11:10 Uhr

Guten Tag zusammen,

vor einiger Zeit habe ich mich an WPF gewagt und nach einige anfänglichen Schwierigkeiten, läuft es auch ganz gut. Bis jetzt 😁
Es ist eine Sache Controls mit DataBinding zu verwenden und eine andere, diese selbst zu erstellen.

Ziel:
Mein UserControl soll einen Button mit OpenFileDialog darstellen. Dieser soll anzeigen ob die Datei vorhanden ist und/oder sich öffnen lässt.

Step 1:
Die Umsetzung des Buttons mit interaktiver Border-Farbe und OpenFile-Dialog war natürlich kein Problem.

Step 2:
String-Property erstellen und im Setter prüfen ob die Datei existiert. => Funktioniert natürlich nicht, da keine INotify-Funktionalitäte o.ä. implementiert wurde

Step 3:
Nach etwas Recherche dann DependencyProperty implementiert, um die Änderung an dem Wert mitzubekommen.

public string Text
        {
            get
            {
                return (string)GetValue(TextProperty);
            }
            set { SetValue(TextProperty, value);
                CheckFileExists();
            }
        }

        public static readonly DependencyProperty TextProperty =
          DependencyProperty.Register("Text", typeof(string), typeof(BrowserDialog), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, TextValueChanged));

private static void TextValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
      var sender = o as BrowserDialog;
        if (e.NewValue != null)
            sender.Text = e.NewValue.ToString();
    }

Das erscheint mich zwar nicht sonderlich elegant, aber ich habe es so in etlichen Tutorials gesehen und übernommen.
Beispiel Tut 1
Beispiel Tut 2

Funktioniert!
Nun ändert sich die Farbe unmittelbar bei Änderung des Dateipfades. Auch die Rückgabe nach dem Datei-Dialog funktioniert.

Problem:
Füge ich nun noch ein UserControl von meinem Typ ein, so kommt die Meldung:

Fehler	1	"Text"-Eigenschaft wurde bereits von "BrowserDialog" registriert.	

Das ist natürlich klar, aufgrund der static Variablen & des Events . Aber wie löse ich es sonst?

Es kann doch eigentlich nicht so kompliziert sein, ein DataBinding zu implementieren und dynamisch auf dessen Änderungen zu reagieren.
So langsam habe ich das Gefühl, ich bin vollkommen auf dem Holzweg und verrenne mich da in den DependencyProperties und es gibt etwas viel einfacheres X(

Für jeden Schubs in die richtige Richtung wäre ich sehr dankbar!

[EDIT] ein static vergessen

08.05.2013 - 17:47 Uhr

So Kunde A möchte gerne am 2.6.2013 das Nokia leihen. Heist ich schreib in denn leihauftrag in Spalte "Verliehenam" 2.6.2013 und die Spalte "zurückam" bleibt Null.
Jetzt möchte Kunde B das Nokia am 23.5.2013 Leihen. Das ist möglich weil das Nokia erst am 2.6 an Kunden A Verliehen wird. Das heist das Nokia muss bis zum 2.6 Sichtbar sein. Damit ich Kunden B das Nokia auch verleihen kann (Vorrausetztung ist natrülich das Kunde B am 1.6. das Nokia wieder zurückbringt).

Und da hab ich das Problem ich bekomm das nicht hin das wenn der Auftrag drin steht das Gerät in dem Zeitraum sichtbar bleibt bis das Gerät tatsächlich Verliehen ist.

Hi Cokie,

das löse ich eigentlich immer dadurch, dass ich das Feld mit dem Enddatum durch das Tagesdatum fülle, sofern dies leer ist.
Also:

WHERE ISNULL(la.zurückam,GETDATE()) < GETDATE()

Egal an welchem Tag das Statement ausgeführt wird, das fehlende Enddatum ist nie < Getdate 😃

Schönen Feiertag,
trib

07.05.2013 - 09:26 Uhr

Hallo zusammen,

diese Frage habe ich mir auch schon häufig gestellt. Das Hauptproblem ist sicherlich der Wandel, den das Internet mit sich führt. Früher musste man für seine Doktorarbeit noch in die Bibliothek. Heute reicht eine Maus, Strg, C & V.
Viele Jüngere probieren garnichts mehr aus, sondern kennen mindestens einen aus dem Bekanntenkreis, den sie mal "eben" anschreiben können.
Wozu recherchieren, wenn man nur kurz eine Frage eintippen muss? Vielleicht käme man bei einer vernünftigen Suche im Internet auch mit deutlich weniger Worten und Aufwand aus, aber diese Option scheint es bei manchen einfach nicht zu geben. Das passiert auch nicht aus böser Absicht, sondern weil sie es nie anders gelernt haben. Und weil es immer noch zu häufig funktioniert 😃

Allerdings gibt es in jeder Firma auch die "An alle Mailuser"-Nachrichten von alten Hasen, die man am liebsten mit lmgtfu beantworten würde. Oder in riesigen Foren, in denen Leute zwischen 30-40 Jahren nicht in der Lage sind den ersten Post im Thread zu lesen und eine Frage zum fantastillionsten Mal stellen.

Es ist also nicht so, dass es nur bei jungen Leuten so läuft. Überall wo einem Arbeit abgenommen werden kann, wird es auch Menschen geben, die das in Anspruch nehmen.

18.03.2013 - 19:40 Uhr

Hallo zusammen,

ich hänge mich mal in den Thread hinein, da ich ebenfalls eine eigenen WPF-MessageBox gebaut habe.
Allerdings bin ich auf ein Problem gestoßen und habe ich die obigen Beispiele getestet. Mit selbigem Ergebnis:
Rufe ich die MessageBox/TaskDialog aus einem Thread auf, so gibt es eine Exception > Fehlermeldung:

"Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies für viele Komponenten der Benutzeroberfläche erforderlich ist."

Okay, das ist natürlich nachvollziehbar. Also das ganze entweder Invoken oder per [STAThread] versehen. Allerdings ist das nicht möglich, da bereits im Konstruktor die Exception auftritt.

Die Standard-MessageBox kann natürlich auch aus einem Thread oder BackgroundWorker aufgerufen werden. Alle von mir getesteten benutzerdefinierten MessageBoxen haben dasselbe Verhalten.

Eine zwei Tage andauernde Suche hat mich auch nicht wirklich weitergebracht 😕
Meist wird beschrieben, wie ich den Thread in dem STAThread aufrufen kann, aber das kommt für den Anwendungsfall leider nicht in Frage, da ich den Aufrufer ja garnicht kenne. Und ich würde dann alle Parallelisierungen zur Nichte machen.

Wahrscheinlich passt der Post auch in ein eigenes Thema. Wenn´s so ist, bitte verschieben 😃

Gruß,
trib

04.03.2013 - 15:31 Uhr

Wie MrSparkle schon vermutet, bin ich auch überrascht einen FTP-Pfad mit einem Laufwerksbuchstaben anzusprechen. Möglicher weise ist der Root-Ordner einfach als "F:" benannt. Aber das widerspricht etwas den Namenskonventionen von Ordnern...

Wie auch immer, hier fehlt definitiv noch ein Slash:

string uri = "ftp://" + ftpServerIP + "/%2F/F:" + "Ordner/" + fi.Name;  

Es müsste "/%2F/F:" + "++/++Ordner/" heißen.

27.02.2013 - 16:29 Uhr

Da muss ich doch glatt meinen Thread wieder aus der Versenkung holen.

Nachdem ich seit längerer Zeit mein Projekt habe brach liegen lassen, hat mich mal wieder der Ehrgeiz gepackt.
Die Problematik ist weiterhin folgende gewesen:
Zeichne ich 100 "Pixel" mit DrawRectangle, so werden diese nahezu sofortig angezeigt.
Nutze ich selbige Logik für Kreise mit DrawEllipse, dauert dies doppelt so lange.
Die Dauer steigt exponentiell mit der Anzahl der "Pixel".

Sobald sich die Farbe oder Größe eines Pixels ändert, so wird nur dessen Bereich neu gezeichnet. Quasi alle Tipps in den o.g. Links habe ich ausprobiert und die Zeiten miteinander verglichen, die das Zeichen von 100 Kreisen beansprucht hat. Ohne eine wirkliche Verbesserung zu spüren.

Nun habe ich das Projekt neu aufgebaut und gesehen, dass ich zwar in der Hauptform

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

setze, nicht aber in dem Control selbst. Und genau da lag der Hase begraben!
Naiver Weise bin ich davon ausgegangen, dass das Setzen des DoubleBuffers auf der Form sich automatisch auf dessen Controls auswirkt. Das ist aber nicht so!

Die ganze Testerei war also sinnlos und der DoubleBuffer im Konstruktor des Controls hat das gewünschte Ergebnis erzielt.

Vielleicht hilft diese späte Erkenntnis jemandem weiter 😃

20.02.2013 - 16:54 Uhr

Dann würde ich ein Windows Mobile Gerät empfehlen.
Es kann in .Net Programmiert werden, gibt hunderte Tutorials und die SDK ist gibt es bis zur letzten Version (6.5).
Geräte gibt es wie Sand am Meer für erschwingliche Preise. Dabei hält der Akku, im Gegensatz zu aktuellen Geräten, meist noch eine Woche.

Allerdings setzt man auf eine tote Technologie, da es seit Windows Phone und Windows Embedded 8 keine Weiterentwicklung von CE/Mobile mehr gibt.

Jeder Hersteller hat meist noch eine eigene SDK für Sensorik usw. bereitgestellt. Das ist für die SMS Funktionalitäten aber nicht notwendig.

06.02.2013 - 13:12 Uhr

Hallo zusammen,

ich nutze KeyPass ebenfalls und bin froh dass ich es habe.
Für den privaten Gebrauch hilft es sehr gut weiter, wenn man z.B. sich nur in einem Forum angemeldet hat um etwas herunterzuladen. Oder Sich vor 10 Jahren einen Webspace eingerichtet hat und den Zugang nicht mehr kennt.
Es gibt zahlreiche Beispiele, wo ich mir gewünscht hätte schon vor 5 Jahren damit begonnen zu haben die Passwörter zu sichern.
Aktuell habe ich dort alle meine Passwörter drin. Allerdings nutze ich z.B. auch kein Onlinebanking.
Die Gefahr, dass jemand mein Emailkonto mit einem Trojaner knackt sehe ich als Risikoreicher, als dass Jemand meine kdbx-Datei entschlüsselt.
Die Datei liegt auf meinem Handy und auch einem Cloud-Dienst.

Für die Arbeit ist es ebenfalls ungemein praktisch, das ich viele Kundenzugänge habe, die ich dort zentral sammle. Die Datei liegt in dem Fall aber auf meinem Firmenrechner und darüber hinaus in einem verschlüsselten Verzeichnis.
Die Sicherheit sehe ich dabei ebenfalls höher an als die Daten in Emails zu belassen oder auf Zettel zu schreiben. Einige Kollegen haben auch Word/OneNote/Excel-Dokumente und legen ihre Zugänge dort ab. Auch auf einer verschlüsselten Partition, aber wer einmal seinen Rechner nicht sperrt ermöglicht den direkten Zugriff.

Fazit: Ich stehe so einem Programm äußerst positiv gegenüber. Es muss halt nur ein Mindestmaß an Sensibilität vorausgesetzt werden, wenn es um den Ablageort und das Masterpasswort geht.

05.02.2013 - 11:57 Uhr

Guten Tag shad0wman,

du hast natürlich immer das Problem, dass die Benutzer Zugriff auf diesen Ordner benötigen.
Da du aber schreibst, dass ihr euch innerhalb einer Domäne befindet, sollte das doch kein Problem sein dort die bestimmten Nutzer oder Benutzergruppen dem Ordner zu hinterlegen.
Dann können diese per integrierter Windows-Authentifizierung auf die Datei zugreifen. Ohne Anmeldung, ohne Passworteingabe.

Nun stehst du vor der zweiten Problematik:
Mehrere Benutzer sollen auf die selbe Datei zugreifen. Also musst du die Datei beim öffnen für die anderen sperren. Wie das geht, verrät dir das Property FileMode im FileStream.

Generell zu SFTP: Dort kann man auch mir jedem anderen Programm einen Zugriff realisieren. Das "S" beschreibt nur die SSH Verschlüssung, ähnlich dem HTTPS-Protokoll (Dies nutzt allerdings SSL).
Anders ist es bei FTPS dort wird es etwas komplizierter, da ein gültiges Zertifikat benötigt wird. Dann wird ebenfalls wie bei HTTPS auch SSL verwendet.
Es gibt einige OpenSource Libraries, die man verwenden kann, die einem damit viel Arbeit abnehmen.

Gruß
trib

08.01.2013 - 12:02 Uhr

Hi,

also ich stehe/stand vor der selbigen Entscheidung. Von der technischen Seite sehe ich auch keine großartigen Weiterentwicklungen. Natürlich lernt man nie aus und so ein Studium bringt einem immer Erfahrung und ermöglicht auch ein paar andere Denkweisen.

Wenn man seinem Arbeitgeber treu bleiben möchte und nach 3 Jahren seinen Chef überrascht mit "Überraschung ich bin jetzt Bachelor", wird es imho auch keine/kaum Veränderungen geben.

Bei einem Wechsel sieht das Ganze wieder anders aus. Zum Einen ist ein Abend-/Fernstudium gerade in der Informatik-Welt hoch angesehen. Nicht viele kommen mit der Doppelbelastung klar und es bescheinigt einem Einsatz und Zielstrebigkeit.
Zum Anderen kann man sich unmittelbar als Team- oder Abteilungsleiter (je nach Firmenstruktur) bewerben. Das geht i.d.R. nur mit Arbeitserfahrung UND Studium.

Weiterhin kann das Gehalt natürlich deutlich steigen, da Ausbildung, Arbeitserfahrung & Studium in dem Alter noch relativ selten ist.

Zu guter Letzt erwirbst Du damit die Möglichkeit auch andere Wege zu gehen. Zum Beispiel als Quereinsteiger an eine Berufsschule zu gehen und Wirtschaft & Informatik zu unterrichten. Das beugt dem Burnout vor und man kann unter 40 (je Bundesland auch nur bis 35) noch verbeamtet werden 😉

Leider bin ich in meinem Job so eingespannt, dass ich keine Woche unter 50 Stunden arbeite. Dann noch parallel ein Fernstudium würde meine spärliche Freizeit komplett aufbrauchen. Das ist es mir aktuell (noch) nicht wert.

02.01.2013 - 09:24 Uhr

[...]
Zum Thema Offshore - bisher haben alle Auftraggeber für die ich gearbeitet habe, damit ausnahmslos schlechte Erfahrungen gemacht.
[...]

Guten Tag zusammen,

die Frage ist doch, mit welcher Erwartungshaltung gehe ich an diese Sache heran?
Wenn ich nur das reine Ergebnis betrachte, kann ich diese negative Erkenntnis teilen. Es wird eine Programmierung in Auftrag gegeben und exakt so ausgeführt, wie man sich beschrieben hat. Sehr schnell und auch technisch auf hohem Niveau. Warum sind wir trotzdem unzufrieden damit?
Weil wir selbst das Ergebnis nicht exakt genug spezifiziert haben und es auch keinen Raum für (für uns) Logische Erweiterungen/Optimierungen gibt, die sich erst während dem programmieren herausstellen.

Kann man dafür jetzt den rumänischen Inder in China verantwortlich machen?
Wir verlangen hohe Preise für eine Individualisierung beim Kunden, die Maßgeschneidert ist. Das ist mit outsourceing in dem Rahmen nicht möglich. Zumindest nicht in meinen Projekten.

Nach einem anfänglichen Versuch mit der Auslagerung von Teilbereichen, hat sich herausgestellt, dass wir in der Zeit in der man das UML macht und noch eine Seite Text dazu erfasst, plus die anschließende Kontrolle und Optimierung des Ergebnisses, keinen Zeit- & Geldvorteil bringt.

20.12.2012 - 09:00 Uhr

Hallo Mallett,

an der Schnittstelle passiert erstmal nichts. Es kommen einfach keine Daten mehr an. Die ausgehenden verbleiben erstmal im Buffer.
Windows erkennt das Trennen des Kabels und entfernt den COM-Port. In der Anwendung gibt es eine Exception, dass der COM-Port nicht mehr erreichbar ist.
Soweit ich mich erinnere, kommt diese Exception aber auch nur wenn du wieder etwas in die Schnittstelle schreiben möchtest.

Kann man also alles abfangen und entsprechend darauf reagieren.

20.11.2012 - 13:06 Uhr

Da fällt mir doch gleich wieder das Thema "Apple und Zeitumstellung" ein.
Es war so, dass am Tage der Zeitumstellung der Wecker (in vielen Fällen) seine Funktion verweigert hatte. Wenn mich nicht alles täuscht, ist das sogar zweimal aufgetreten.

Das dies ein recht komplexes Thema ist, steht außer Frage. Dazu kommt noch, dass alle weiteren Funktionen und Zusatzprogramme auf diese Umstellung reagieren müssen.

Aktuell hat es auch mal wieder einen Autohersteller getroffen, der mehrere Millionen Kfz zurückrufen muss, weil ein vergleichsweise einfaches Teil Probleme verursacht.

Im Fall von Android wurden sicherlich auch umfangreiche Unittests gemacht. Aber der Kalender an sich kennt natürlich den Dezember, einzig die GUI beim Anlegen des Datums war fehlerhaft.

Es kann und wird nie unfehlbare Software (und auch Hardware) geben. Zwar entwickeln sich die Tests immer weiter, aber die Geschwindigkeit, mit der heutzutage entwickelt wird tut ihr übriges, dass nicht alles auf Herz und Nieren getestet wird.
Wichtig ist doch nun die Reaktion, wie schnell Google ein Update bereitstellt, damit der Fehler behoben wird.

Traurig finde ich nur den Aufschrei von vielen News-Seiten, vorzugsweise den sehr Apple orientierten. Man denke doch mal zurück an den Todesgriff, Kratzer in der Schale, Grünstich bei der Kamera oder das "zufällige" mitloggen der kompletten Bewegungsdaten im Mobilfunknetz.
Die mediale Diskussion ist doch nur noch ein in zwei Lager gespaltenes Bashing, die auf der Suche von Fehlern bei dem anderen sind...

16.11.2012 - 10:06 Uhr

Geht es beim S3 nicht mehr einzustellen, welche Standard-Aktion beim anschließen eines USB-Kabels ausgeführt werden soll?
Schau mal unter dem Arbeitsplatz -> Eigenschaften -> Gerätemanager
einmal vor dem Anschluss des Telefons und einmal danach. Da sollte sich doch unter dem Menüpunkt "USB-Controller" und vielleicht sogar "Anschlüsse (COM & LPT)" tun. Letzteres macht der Treiber damit ADB arbeiten kann.

Dann könnte man den Ansatz über alle USB-Geräte gehen und nicht nur über die "Removable Devices". Soweit ich das richtig gesehen habe, müsste folgender Code z.B. auch Tastaturen oder Mäuse anzeigen:
c-sharp-usb-detection

15.11.2012 - 16:20 Uhr

Hallo words_sourcecode,

steckst du denn das Android Gerät nur ein? Denn das fragt ja i.d.R. was du machen möchtest:
Nur laden, SD-Karte oder ggf. einer Synch. Software.
Als Removable wird das nur erkann, wenn es sich auch um einen Wechseldatenträger handelt.
Im Falle von "Nur Laden" könnte man per ADB prüfen ob es sich um das Smartphone handelt. Müsste das allerdings pollen.

trib

EDIT: Link eingefügt

13.11.2012 - 10:01 Uhr

Für diese Abfrage könntest du ein WHERE Gleichheit > 0.98 einbauen, vielleicht bringt das was.

Definitiv bringt das etwas. Das HAVING lässt sich alle Datensätze von der Datenbank übermitteln und wendet anschließend auf das Ergebnis den Filter an.
Das WHERE sendet den Filter gleich an die Datenbank und bekommt das schon gefilterte Ergebnis zurückgeliefert.

Je nach Datenmenge wird das einen riesen Unterschied machen, da zum einen der schnellere Datenbank-Server die Arbeit übernimmt und zum anderen die zu übertragende Datenmenge deutlich kleiner ist.

Ein Index auf User wäre trotzdem sicherlich nicht das verkehrteste, wenn die Änderung auf das WHERE nicht ausreichend Performance bringt.
(_Der MSSQL-Server würde den ~~Schlüssel[\S] Index selbst anlegen, wenn die Abfrage ein paar male ausgeführt wird. Der ist recht lernfähig. Wie das genau bei Oracle funktioniert weiß ich leider nicht.[/i])

**[EDIT] **:::

13.11.2012 - 09:50 Uhr

Hallo Norman9494,

leider geht das nicht so einfach, dass du zwei Werte abfragst und dann dein gewünschtes Ergebnis bekommst.
Den belegten Speicherplatz kannst du nur kalkulieren indem du alle Dateien einzeln durchgehst.
Wobei du unterscheiden solltest zwischen der ListDirectory-Methode, wo du dann manuell noch per GetFileSize iterieren musst.
Sofern der Server dies unterstützt ist es natürlich einfacher gleich mit ListDirectoryDetails zu arbeiten.

Die MSDN empfielt zur Performance natürlich dann die Verbindung immer wieder zu benutzen und nicht neu zu öffnen (FTPWebRequest)

Die gesamte Speicherkapazität kann man allerdings nicht per FTP abfragen. Diese Möglichkeit gibt das Protokoll von FTP aber nicht her. Wenn du den FTP-Server selbst aufgesetzt oder gar programmiert hast, ist es aber möglich weitere Befehle hinzuzufügen.
(Dort endet aber dann mein Wissen)

[EDIT] Da war wohl jemand schneller 😉

12.11.2012 - 09:27 Uhr

Guten Morgen,

ja es geht auch mit etwas weniger Aufwand:

Man läuft automatisch alle Controls durch und fügt den Focus-Listener hinzu und wertet diesen aus:


         private void AddGotFocusListener(Control ctrl)
        {
            foreach (Control c in ctrl.Controls)
            {
                c.GotFocus += new EventHandler(Control_GotFocus);
                if (c.Controls.Count > 0)
                {
                    AddGotFocusListener(c);
                }
            }
        }
        
        private void Control_GotFocus(object obj, EventArgs e)
        {
            Control ctl = (Control)obj;
            Console.WriteLine("Focus: " + obj.ToString());
            Console.WriteLine("Control: " + ctl.Text);
            Console.WriteLine("Parent: " + ctl.Parent.Name);
            if(ctrl is Button || ctl.Visible == false)
            {
                Console.WriteLine("Nächstes Control aktivieren");
                ctl.SelectNextControl(this.ActiveControl, true, true, true, true);               
            }
        }

In diesem Fall wollte ich bestimmte Elemente/Button überspringen, die "zugeklappt" sind.
Für Deinen Fall, kannst du dann in der Konsole den Verlauf nachvollziehen oder das Ganze in einer Liste o.ä. speichern.

[EDIT] Auf anraten von herbivore den Code etwas Angepasst.
Überprüfung von typeof durch is ersetzt.

07.11.2012 - 15:35 Uhr

P.S. Rabban und trib: diese Events werden aber erst ausgeführt, wenn man auch irgendwo vorher DoDragDrop() aufgerufen hat, und das macht man passenderweise im OnMouseDown.

Dafür würde ich dann das ItemDrag-Event nutzen. Dafür isses da 😃
MouseClick nutze ich nur um z.B. Cut, Copy & Paste als ToolStripMenue anzuzeigen und dynamisch die MenuItems anzuzeigen. Ggf. noch um Zusatzinformationen unter dem TreeView einzublenden.

07.11.2012 - 14:22 Uhr

Hallo Christel,

genau dafür gibt es dich die Events: DragDrop, DragEnter, DragLeave und DragOver.
Weshalb also per Click-Event das "Draggen" starten?

Im DragOver kann man entscheiden, ob überhaupt ein Droppen erlaubt sein soll und ein entsprechendes Icon anzeigen (e.Effect = DragDropEffects.Move;).
Im DragDrop dann behandeln, wenn die Node losgelassen wurde.

PS: Zu spät, dafür aber mehr Infos 😉

30.10.2012 - 13:03 Uhr

Hallo Stedenko,

was ist denn das letztendliche Ziel? Du hast einen Multitouch-Tisch und möchtest dort eigene Webseiten anzeigen? Oder fremde und diese um das Script ergänzen?
Welcher Browser ist im Einsatz? Kann dieser modifiziert werden?

Bei FireFox Mobile ist es z.B. so, dass man immer horizontal und vertikal scrollen kann. Zum markieren von Text muss ich den Finger etwas länger auf dem Text halten und es wird erstmal ein Wort markiert. Diese Markierung kann ich dann größer ziehen.
Das halte ich für relativ aufwändig. Einfacher wäre es ggf. die Zeit zu messen, die der Cursor auf einem Punkt verbringt. Möchte ich scrollen, bewege ich den Finger unmittelbar zur Seite. Möchte ich markieren, halte ich ihn eine gewisse Zeit und bewege ihn dann erst weiter.
Beides erfordert natürlich eine Anpassung an der zynga-Lösung oder eine Anpassung der Browserengine.

Webseite Touchfähig machen

29.10.2012 - 15:36 Uhr

Hallo SeCuRiiTaS,

benutzt du Threating? Meist liegt das daran, dass im Hintergrund noch irgendein Prozess läuft und dieser nicht direkt vom System beendet werden kann (bzw. das nicht gewollt ist).

29.10.2012 - 11:39 Uhr

Hallo Campy,

das klingt nach einer netten Aufgabe! Habe ich so aber auch noch nie lösen müssen.

Jedes Snapshot wird automatisch in der ReportServerTempDB-Datenbank gesichert. Und dort könnte man diesen theoretisch auch auslesen. Allerdings werden die Daten dazu in ein vorgegebenes Daten-Schema gepackt, welches sich nicht einfach wieder zu den ursprünglichen Daten auslesen lässt.

Also würde ich einen Snapshot generieren, den SQL-Profiler anwerfen und mir das Statement ansehen, welches auf diese Datenbank zugreift. Allerdings würde ich nochmal kontrollieren, ob der aktuelle Snapshot nicht den des Vormonats überschreibt. (Müsste eigentlich so sein)
In diesem Fall würde ich ein Stored Procedure einbinden und mit die Daten selbst in eine bestimmte Tabelle wegsichern.

Gruß,
trib

26.10.2012 - 08:21 Uhr

Hi knoden,

in diesem Thread von herbivore findest du wonach du suchst.
[FAQ] Assistenten/Wizards: Mit Windows Forms eine Art Frameset einer Website nachbauen

Gruß,
trib

19.10.2012 - 12:25 Uhr

Hallo herbivore,

ich bin schon durch einige Threads gegangen und habe festgestellt, dass in den Beispielen ebenfalls im OnPaint per foreach alle GraphicsObjects durchgegangen werden.
Der Unterschied besteht nur darin, dass die Liste mit den GraphicsObjects nur aktualisiert wird, wo es nötig ist. So mache ich das ja bereits.

Zeige ich 20x20 Rechtecke an und aktualisiere alle 50Millisekunden eine Reihe aus 20 Stück, so funktioniert das hervorragend. Ändere ich nun die Darstellung auf einen Kreis, Flackert immer die entsprechende Reihe. Der Rest wird ja nicht neu gerendert.
Das wird letztendlich mit dem Kreis an sich zu tun haben.

Was mir aber aufgefallen ist, ist das

this.Invalidate(myRectangle);

Damit aktualisiere ich immer sofort jeden aktualisierten Pixel. Wenn ich nun z.B. die gesamte erste Reihe aktualisieren möchte, macht es mehr Sinn den Tipp aus "Gezieltes OwnerDrawing" - schnelles Zeichnen bewegter Objekte zu beherzigen und das Invalidate auf den geänderten Bereich anzuwenden.

Auf den ersten Blick tut das schon genau was ich brauche. Nun ist es am Feintuning die Bereiche Sinnvoll aufzuteilen.
Entweder per fester Frequenz oder nach logischer Aufteilung (Pro Spalte, Bereich, usw.)
Das würde aber bei dargestellten Quadraten (nicht ausgefüllt) mehr aktualisieren als nötig. Zumindest aber nicht so häufig 😃

Danke für den Tipp und Entschuldigung, dass ich nicht gleich die anderen Threads gelesen habe. Ich wollte erstmal mein Problem überhaupt eingrenzen um zu wissen wonach ich suchen muss.

Allen ein schönes Wochenende!

18.10.2012 - 11:48 Uhr

Mahlzeit,

ich habe fleißig weiter programmiert und das Grund-Control der Matrix soweit fertig.
Nun kann man mit einer Handvoll Funktionen verschiedene Muster darstellen und hübsch animieren.

Damit ist mir nun aufgefallen, dass ein gezeichneter Kreis im Gegensatz zu einem Rechteck schon ziemlich flackert. Lege ich nun noch (wie im Screenshot oben zu sehen) die Pixel Nummer darüber, kann man schon fast jeden Frame mitzählen!

Der DoubleBuffer ist schon aktiviert und ich zeichne auch nur die nötigen Pixel neu.

 privat private void DrawPixel(int pixelNo)
        {
            Point p = GetPixelLocation(pixelNo);
            int x = p.X;
            int y = p.Y;
            
            string text = string.Empty;
            Rectangle myRectangle = new Rectangle((this.Padding.Left + pixelWidth + this.Padding.Right) * x,
                                                  (this.Padding.Top + pixelHeight + this.Padding.Bottom) * y,
                                                  pixelWidth, pixelHeight);
            if (DrawPixelNo)
                text = pixelNo.ToString();

            if (listGo.Count <= pixelNo)
            {
                if (this.PixelStyle == PixelStyles.Circle)
                    listGo.Add(new MyFilledEllipse(new SolidBrush(ledPixels.LedStrip.Chain[pixelNo].RGBColor.ToColor()),
                                                    myRectangle, text));
                else if (this.PixelStyle == PixelStyles.Rectangel)
                    listGo.Add(new MyFilledRectangle(new SolidBrush(ledPixels.LedStrip.Chain[pixelNo].RGBColor.ToColor()),
                                                      myRectangle, text));
            }
            else
            {
                if (this.PixelStyle == PixelStyles.Circle)
                    listGo[pixelNo] = new MyFilledEllipse(new SolidBrush(ledPixels.LedStrip.Chain[pixelNo].RGBColor.ToColor()),
                                                    myRectangle, text);
                else if (this.PixelStyle == PixelStyles.Rectangel)
                    listGo[pixelNo] = new MyFilledRectangle(new SolidBrush(ledPixels.LedStrip.Chain[pixelNo].RGBColor.ToColor()),
                                                      myRectangle, text);
                this.Invalidate(myRectangle);
            }
        }

Oder liegt der Hund beim OnPaint begraben, dort wird natürlich immer alles wieder neu gezeichnet.
Macht es vielleicht Sinn eine Logik zu implementieren, die sich merkt welche Pixel geändert wurden und nur diese zu aktualisieren? Quasi eine Black- & WhiteList. Nur wenn z.B. die Größe oder Art der Pixel geändert wird, gibt es ein Clear().


        protected override void OnPaint(PaintEventArgs e)
        {
            if (currentGridSize != this.Size)
                CreatePixels();
            e.Graphics.Clear(this.BackColor);
            base.OnPaint(e);

            foreach (MyGraphicObject go in listGo)
            {
                go.Draw(e.Graphics);
            }
        }

(Der aufmerksame Betrachter wird merken wo ich das her habe 😃 )

16.10.2012 - 17:05 Uhr

ich hab ausversehen das Endgame bei der Punkteberechnung doppelt mit eingerechnet.

Hier die korrigierte Version (Außerdem hab ich noch weitere Fehleingaben abgefangen):

Meine UnitTests wurden alle bestanden und ich habe auch sonst nichts zu beanstanden!
In meiner Lösung habe ich die Berechnung ausschließlich in der Score() vorgenommen und in der Roll(int pins) nur die Werte gespeichert. Weiterhin hatte ich mit verschachtelten Klassen für den Frame und die dahinterliegenden Würfe gebaut. Das hat sich aber schnell als komplizierter herausgestellt als nötig. Die Version mit einem Array ist natürlich viel einfacher (auch wenn sie sich nicht sooooo korrekt anfühlt [Finde ich persönlich])

Dann bist Du dran, D4rkScr43m!

16.10.2012 - 15:37 Uhr

Hallo D4rkScr43m,

Folgender Test für einen Perfekten Lauf liefert einen Fehler:

for (int i = 0; i < 12; i++)
    Roll(10);
    //Für Spartaaaa
    Assert.AreEqual(300, Score());
Keine Würfe mehr! Zuerst die Punktzahl abrufen!
15.10.2012 - 15:51 Uhr

Hallo zusammen,

vorweg: Ich habe nochmal meine Lösung angepasst und hoffe nun alles erfüllt zu haben.
Dazu habe ich meinen letzten Beitrag editiert um die neue Aufgabe hier nicht unübersichtlich zu gestalten.

Aufgabe:
Die nächste Aufgabe ist ein kleines Bowlingspiel. Beziehungsweise die Auswertung dessen.

Regeln:
Es werden die allgemein gültigen Spielregeln angewendet Bowling - Spielregeln.
Demnach besteht jedes Spiel aus 10 Frames. Jeder Frame besteht aus bis zu zwei Würfen. Im Falle eines Strikes nur einem.
Der 10. (letzte) Frame macht die Ausnahme, werden dort ein Spare oder zwei Strikes geworfen, so darf der Spieler ein drittes Mal werfen.

Die maximale Punkteanzahl beträgt 300. Diese setzt sich aus der Summe aller Würfe zusammen.
Dabei werden nach einem Spare die Punkte aus dem Folgewurf addiert. Im Falle eines Strikes sogar die der beiden folgenden Würfe. (Bei einem "Miss" / "Pudel" natürlich 0-Punkte)

Durchführung:
Es sind zwei Funktionen gegeben:

public void Roll(int pins)

welche für jeden Wurf ausgeführt wird und

public int Score()

die die aktuelle Punktezahl ausgibt.

Einschränkungen:
Für eine gültige Lösung muss kein Wurfzähler implementiert werden. Sprich: Wie viele Würfe der Spieler noch hat.

Test:

//20 Würfe mit einem Punkt
for (int i = 0; i < 20; i++)
   Roll(1);
Assert.AreEqual(20, Score());
//Spare (10 + 3) +3
Roll(5);
Roll(5);
Roll(3);
Assert.AreEqual(16, Score());

Viel Spaß!
PS: Persönlich war ich überrascht, dass die Aufgabe doch etwas aufwändiger ist, als man zuerst denkt 😃

11.10.2012 - 13:12 Uhr

da ist aber noch ein kleiner Fehler drin:

Richtig, dort habe ich vergessen dem output += code noch ein "\n" oder besser noch System.Environment.NewLine hinzuzufügen.

Außerdem fehlt die Implementierung von 99 Bottles of beer.

Das ist im Code oben mit drin und funktioniert meines Erachtens auch.

Eine neue Aufgabe folgt in Kürze!

[EDIT]
Okay, dann habe ich es wirklich falsch verstanden. Der case für 9 muss dann natürlich so lauten:


for (int beer = 99; beer > 0; beer--)
{
    output += String.Format("{0} bottles of beer on the wall, {0} bottles of beer.{2}" +
                "Take one down and pass it around, {1} bottles of beer on the wall.{2}",
                beer, beer == 0 ? (beer - 1).ToString():"no more", System.Environment.NewLine);
}
output += String.Format("No more bottles of beer on the wall, no more bottles of beer.{0}" +
               "Go to the store and buy some more, 99 bottles of beer on the wall.", System.Environment.NewLine);

[EDIT 2]
Okay, ich habe das etwas zu schnell "hingepfuscht" ohne ausgiebig genug zu testen. Nun sollte aber alles wie gewünscht funktionieren und auch der Singular bei der letzten Flasche.
Die Codes aus deinem Link habe ich natürlich nicht genommen, weil ich das selbst implementieren wollte 😕


case '9':
   for (int beer = 99; beer > 0; beer--)
   {
   output += String.Format("{0} bottle{3} of beer on the wall, {0} bottle{3} of beer.{2}" +
       "Take one down and pass it around, {1} bottle{4} of beer on the wall.{2}",
       beer, beer > 1 ? (beer - 1).ToString():"no more", System.Environment.NewLine,
       (beer > 1) || (beer ==0) ? "s" : "", beer == 2 ? "" : "s");
   }
   output += String.Format("No more bottles of beer on the wall, no more bottles of beer.{0}" +
      "Go to the store and buy some more, 99 bottles of beer on the wall.{0}", System.Environment.NewLine);
    break;

10.10.2012 - 17:08 Uhr

Hallo D4rkScr43m,

"Nichts leichter als das" habe ich mir gedacht und bin dann prompt auf folgendes Ergebnis gekommen:

        private static void ExecuteHQ9Plus(string code, ref int acc)
        {
            int i = 1;
            foreach (var c in code.ToUpper().ToCharArray())
            {
                switch (c)
                {
                    case 'H':
                        Console.WriteLine("Hello World!");
                        break;
                    case 'Q':
                        Console.WriteLine(code);
                        break;
                    case '9':
                        Console.WriteLine("[99 Bottles of Beer on the Wall]");
                        break;
                    case '+':
                        acc++;
                        break;
                    default:
                        Console.WriteLine("Fehler im Programm an Stelle: {0} [...]{1}[...]", i, c);
                        break;
                }
                i++;
            }
        }

Diese "kompiliert" allerdings nicht und gibt bis zum Fehler alle bis dato gültigen Befehle aus.
Um das zu umgehen, aber auch die Stelle des verkehrten Zeichens heraus zu filtern habe ich dann einfach die Ausgabe zwischengespeichert. (Den Akkumulator ebenfalls)
Ist sicherlich nicht die schönste Lösung wegen des ganzen Zwischengespeichere, aber sie funktioniert:

        private static void ExecuteHQ9Plus(string code, ref int acc)
        {
            bool error = false;
            int accOriginal = acc;
            int i = 1;
            string output = string.Empty;
            foreach (var c in code.ToUpper().ToCharArray())
            {
                switch (c)
                {
                    case 'H':
                        output += "Hello World!\n";
                        break;
                    case 'Q':
                        output += code;
                        break;
                    case '9':
                        output += "[99 Bottles of Beer on the Wall]\n";
                        break;
                    case '+':
                        acc++;
                        break;
                    default:
                        output = String.Format("Fehler im Programm an Stelle: {0} [...]{1}[...]", i, c);
                        acc = accOriginal;
                        error = true;
                        break;
                }
                if (error)
                    break;
                i++;
            }
            Console.WriteLine(output);
        }
10.10.2012 - 16:41 Uhr

Um generell mal zu verstehen, wie simpel* solche Hacks zu realisieren sind, gibt es ein super Tutorial wie man Minesweeper auslesen kann:
Minesweeper-Behind-the-scenes

Das hat mir schonmal sehr gut geholfen wie die Grundlegende Technik überhaupt funktioniert. Bei aktuellen Spielen ist diese aber natürlich völlig nutzlos.

*Bezogen auf "Wenn man einmal weiß wie es geht"

08.10.2012 - 14:37 Uhr

Guten Tag zusammen,

erstmal vielen Dank für die Antworten!

chilic´s klingt erstmal als die simpelste. Allerdings muss ich mir merken ob ich Spalten oder Zeilenweise vorgehe und wohin ich meinen Startpunkt setzen muss. Möchte ich nun über das Zeichen hinaus gehen und z.B. auf meinen Punkt klicken, muss ich aus der Position wieder zurückrechnen. Dafür eignet sich die Methode so nicht ganz.

Die Lösung von Crone habe ich auch schnell präferiert. Bis ich auf die Problematik gestoßen bin, wenn ich von der "norm" 10x10 abweiche und z.B. 11x9 als Matrix auswähle. Im Nachhinein gesehen war das aber nur ein Rechenfehler, den ich da eingebaut habe.
Dann stehe ich aber genauso vor dem Problem, keinen Pixel allein ansprechen zu können, sondern immer eine Schleife benötige.

Letztendlich hatte ich schon begonnen herbivore´s Vorschlag mit einer switch-Anweisung zu programmieren. Sieht zwar relativ unübersichtlich aus (wie ich schon vermutet hatte) aber ist dann schnell erledigt, wenn man das Prinzip verstanden hat.

private void DrawPixel(int pixelNo)
      {
        int x = 0;
        int y = 0;
        switch(pixelFlow)
        {
            case FlowDirection.UpperLeftToRight:
                y = pixelNo / gridWidth;
                if(y%2==0)
                    x = pixelNo % gridWidth;
                else
                    x = (gridWidth - 1) - pixelNo % gridWidth;
                break;
            case FlowDirection.UpperLeftToBottom:
                x = pixelNo / gridHeight;
                if(x%2==0)
                    y = pixelNo % gridHeight;
                else
                    y = (gridHeight - 1) - pixelNo %gridHeight;
                break;
            case FlowDirection.UpperRightToLeft:
                y = pixelNo / gridWidth;
                if (y % 2 == 0)
                    x = (gridWidth -1) - (pixelNo % gridWidth);
                else
                    x = pixelNo % gridWidth;
                break;
            case FlowDirection.UpperRightToBottom:
                x = (gridWidth -1) - pixelNo / gridHeight;
                if ((pixelNo / gridHeight) % 2 == 0)
                    y = pixelNo % gridHeight;
                else
                    y = (gridHeight - 1) - pixelNo % gridHeight;
                break;
            case FlowDirection.RightBottomUp:
                x = (gridWidth -1) - pixelNo / gridHeight;
                if ((pixelNo / gridHeight) % 2 == 0)
                    y = (gridHeight - 1) - pixelNo % gridHeight;
                else
                    y = pixelNo % gridHeight;
                break;
            case FlowDirection.RightBottomToLeft:
                 y = (gridHeight -1) - pixelNo / gridWidth;
                 if ((pixelNo / gridWidth) % 2 == 0)
                    x = (gridWidth -1) - (pixelNo % gridWidth);
                else
                    x = pixelNo % gridWidth;
                break;
            case FlowDirection.LeftBottomUp:
                x = pixelNo / gridHeight;
                if(x%2==0)
                    y = (gridHeight - 1) - pixelNo %gridHeight;
                else
                    y = pixelNo % gridHeight;
                break;
            case FlowDirection.LeftBottomToRight:
                y = (gridHeight -1) - pixelNo / gridWidth;
                if ((pixelNo / gridWidth) % 2 == 0)
                    x = pixelNo % gridWidth;
                else
                    x = (gridWidth - 1) - pixelNo % gridWidth;
                break;
            default:
                throw new Exception("Wrong PixelFlow!!!");
        }
   DrawRectangle[...]
}
28.09.2012 - 14:23 Uhr

Guten Tag zusammen,

meine Anforderung könnte schon fast ins Programmier Spiel passen 😃

In einer von der Größe frei definierbaren Matrix (gegeben sei jetzt mal 3x3) wird ein Kabel verlegt. Bekannt ist quasi nur Start und Endpunkt.
Somit wird in Schlangenlinien das Raster von oben nach unten befüllt.


            for (int y = 0; y < gridHeight;y++)
            {           
                for (int x = 0; x < gridWidth; x++)
                {
                        if (y == 0 || y % 2 == 0)
                            xI = x;
                        else
                            xI = gridWidth-1 - x;

                    Rectangle myRectangle = new Rectangle(this.Padding.Left + (xI * pixelWidth) + (this.Padding.Right * xI), this.Padding.Top + (y * pixelHeight) + (this.Padding.Bottom * y), pixelWidth, pixelHeight);
                        _listgo.Add(new MyFilledRectangle(new SolidBrush(Color.Red, myRectangle));
                }
            }

Ergebis:

1 2 3
6 5 4
7 8 9

Prinzipiell kein Problem. Nun möchte ich aber alle 8 möglichen Start<>End Kombinationen darstellen und komme nicht so recht weiter.
Mit einer Hilfsvariablen yI könnte ich jetzt noch von unten nach oben darstellen, aber dann müsste ich schon anfangen die beiden Schleifen zu vertauschen und erst x zu durchlaufen und dann y durch zu iterieren.

Mein Enum für die Richtungen sieht aktuell so aus:

public enum FlowDirection
        {            
            UpperLeftToRight = 1,
            UpperLeftToBottom = 2,
            UpperRightToLeft = 3,
            UpperRightToBottom = 4,
            RightBottomUp = 5,
            RightBottomToLeft = 6,
            LeftBottomUp = 7,
            LeftBottomToRight = 8
        }

Hat jemand schonmal ein ähnliches Problem einigermaßen elegant gelöst?
Aktuell überlege ich schon ob ich einfach ein Konstrukt wie folgt baue damit wenigstens eine minimale Übersicht gewahrt bliebe:

for(i=0,i< gridWidth*gridHeight;i++)
  switch(flow)
{
  case FlowDirection.UpperLeftToRight:
    y++;
    x--;
 break;
}
DrawPixel(x,y);

(Eben aus dem Kopf hier hineingepfuscht)

Vielleicht sehe ich auch gerade nur den Wald vor Bäumen nicht. Freitag Mittag eben 😉

12.09.2012 - 13:46 Uhr

Hallo parrain,

warum löschst du die Datei, bevor du versuchst sie zu lesen?
Abgesehen liest du in die "Zeile" line den gesamten Inhalt der Textdatei, da nicht ReadToEnd() sondern nur Read() Zeilenweise arbeitet.

Gruß,
TriB

[EDIT]
Um zu sehen weshalb dein Konstrukt so nicht funktioniert, solltest du den Catch.Block auch mit Leben Füllen:

catch(Exception ex)
{
  MessageBox.Show(ex.Message, "Mein Fehler");
}
10.09.2012 - 09:25 Uhr

Hi,

die Lösung für das Problem liegt doch nicht in dem Installationspaket, sondern darin die Anwendung Kaltstartsicher zu machen.
Das bedeute, dass sie 1. auf dem Flashspeicher installiert wird und nicht unter "Programme" und 2. die Änderungen im Startmenü, Registry, usw. durch ein Datalogic-Tool gesichert werden. Das müsste im Startmenü unter Programme/DataLogic zu finden sein.
Auch für Schritt 3, sollte sich da das entsprechende Programm finden lassen: WLan-Einstellungen sichern.

I.d.R. kann man vom Hersteller ein HowTo anfordern, wie man ein Gerät, bzw. die Applikationen darauf Kaltstartsicher bekommt.

04.09.2012 - 16:43 Uhr

Unter Windows XP hat jeder Benutzer einen "Senden an"-Ordner in seinem Profil:

C:\User\[Name],[All User]\SendTo\

Dort konnte man einfach eine Verknüpfung ablegen. Den Ordner gibt es unter Win7 weiterhin, aber er scheint nicht mehr zu funktionieren (Zumindest bei mir).

17.08.2012 - 09:28 Uhr

Hallo jannemann13 ,

vorab: Getestet und für gut befunden 😃
Du bist dran!

Zum Code:
Der sieht für mich vollkommen in Ordnung aus. Mir ist nur aufgefallen, dass ich mit einem Array weniger ausgekommen bin. "_magnitude1" ist ja quasi bis auf ein/eins in "_lessThan20" enthalten.

Meine Lösung:
Die Arrays:

        static string [] upTo20 = new string[]{"Null", "ein", "zwei", "drei", "vier", "fünf",
              "sechs", "sieben", "acht", "neun", "zehn", "elf",
              "zwölf", "dreizehn", "vierzehn", "fünfzehn",
              "sechzehn", "siebzehn", "achtzehn", "neunzehn"};

        static string[] ten = new string[]{"Null", "zehn", "zwanzig", "dreissig", "vierzig",
                "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig"};

        static string[] singular = new string[]{"s", "tausend", "e Million", "e Milliarde",
                    "e Billion", "e Billiarde", "e Trillion", "e Trilliarde",
                    "e Quadrillion", "e Quadrilliarde"};

        static string[] plural = new string[]{" ", "tausend", " Millionen", " Milliarden",
                    " Billionen", " Billiarden", " Trillionen", " Trilliarden",
                    " Quadrillionen", " Quadrilliarden"};

Dreier-Pakete schnüren:

        private static string Speak(long number)
        {
            string result = string.Empty;
            double maxNo = Math.Pow(10, (3 * singular.Length)); //10*3*10
            if(number >= maxNo)
		        return "Nummer ist zu groß!!!";

            if (number == 0)
                return "null";

           //number in Dreiergruppen aufspalten:
	        int[] group = new int[(number.ToString().Length / 3)+1];
	        int i = 0;
	        while( number > 0)
            {			        
		        group[i++] = Convert.ToInt32(number % 1000);
                number = number / 1000;
	        }

            //Dreiergruppen von links nach rechts aussprechen:	        
            i = group.Length -1;
	        while(i >= 0)
            {
                result += SpeakTrifurcator(group[i], i) + "\n";
                i--;
	        }
            return result;
        }

Dreier-Zahlen aussprechen:


        private static string SpeakTrifurcator(int number, int position)
        {
            string result = string.Empty;
            
            if(number == 0)                
                return string.Empty;
            if (number == 1)
                return upTo20[number] + singular[position];
            
            int hundred = number / 100;
            int rest = number % 100;
            int tenth = rest / 10;
            int first = number % 10;

            //Make it speak
            if (hundred > 0)
                result += upTo20[hundred] + "hundert";
	
            //Do the rest
            if (rest > 0)
            {                
                // Sonderfall: number endet auf 01,
                // ist aber ungleich 1
                if (rest == 1)
                    result += "eins";
                else
                    if (rest < 20)
                        result += upTo20[rest];
                    else
                    {
                        if (first > 0)
                            result += upTo20[first];
                        // sage "und", wenn es Einer-
                        // und Zehneranteile vorhanden
                        if (tenth > 0 & first > 0)
                            result += "und";
                        // Zehneranteil aussprechen:
                        if (tenth > 0)
                            result += ten[tenth];
                    }
            }
            return result + plural[position];
        }
14.08.2012 - 08:41 Uhr

Vermutlich handelt es sich aber um eine Lösung wie z.B. von
>
und dann passt das schon wieder.

Das muss es aber nicht. Per RDP kann ich mittlerweile ebenfalls nur Applikationen freigeben und als Verknüpfung bereitstellen.
Der Name Remote Desktop Protokoll hinkt etwas 😉

Darin sehe ich aber keine Schwierigkeit, sondern den Vorteil, dass ich im Zuge eines Updates nur zentral ein Server die neue Software ausgeliefert bekommt. Weiterhin werden Komplikationen ausgeschlossen ("Bei mir geht aber das & das nicht"). Ist doch prima!

Auf der anderen Seite steht nun die Software. Mir ist aktuell keine bekannt, wo ich gleichzeitig einen Datensatz mit mehreren Personen bearbeiten kann. Dabei muss es doch schon aus rein logischen Gründen zu Redundanzen oder Überschneidungen kommen. (Bei Transaktionen werden immer die Ganzen Datensätze übermittelt. Nicht nur einzelne Felder)
Access geht z.B. nach dem Prinzip vor, wer zu Letzt kommt mahlt zu erst und speichert immer die Daten des letzten Bearbeiters. Alternativ dazu werfen andere Programme Fehlermeldungen "Ein anderer Anwender bearbeitet diesen Datensatz". (Dabei trifft es im Gegensatz zu Access den, der zu Letzt kommt).

Daher ist das nicht sonderlich ungewöhnlich. Die Fragen dich sich mir stellen:*Was passiert, wenn man sich nicht abspricht und einen DS bearbeitet? *Welche Software unter Mac kennst du denn, die die o.g. Probleme nicht hat?

23.07.2012 - 09:33 Uhr

Hallo msmike68,

es gibt etliche (sehr gute) Klassen, die dir einen Teil der Arbeit abnehmen und auch etwas "eleganter" programmiert sind. z.B. ohne diesem ganzen Byte gecaste 😃
Template Serial Com Port

Nun aber zu dem eigentlichen Problem:
Auf den Ersten Blick sollten die Einstellungen soweit korrekt sein. Du sendest die Prüfsumme und abschließend das CR. Aus meiner Erfahrung reicht das aber oft nicht aus. Versuch einfach mal den Befehl zusätzlich mit einem LineFeed abzuschließen. (Der Com-Controller hat manchmal die Eigenschaft was zu cachen, bis der Befehl fertig zusammengebaut ist. Das erledigt alternativ der Befehl ComPort.WriteLine() )
Weiterhin solltest du mal das Property "DtrEnable" ausprobieren. Das wirkt oftmals Wunder 😄
Bedeutet "Data Terminal Ready" und prüft ob das Gerät bereit ist eine Abfrage zu empfangen.

Was sich sonst immer empfiehlt ist ein Tool, was im Hintergrund die Daten mitschneidet. Damit kann man sofort erkennen ob ggf. das Gerät antwortet, aber das Programm nicht reagiert o.ä.

Zu guter Letzt: Bau dir eine GUI mit allen Einrichtungsparametern und probier alles mögliche aus. Das ist bei manchen Geräten der Einzige Weg 😦

20.07.2012 - 09:49 Uhr

Hi,

es gibt noch eine andere Lösung, die ich immer verwende.
Im MDIChild_Activated weise ich einfach eine Kopie des Icons zu:


           // Fixes bug where loading form maximised in MDI window shows incorrect icon.
            this.Icon = Icon.Clone() as Icon;

Ob das die eleganteste Lösung ist, weiß ich nicht. Sie funktioniert aber 😁

17.07.2012 - 10:33 Uhr

Da sich bisher noch niemand gemeldet hat, gebe ich noch schnell zwei entscheidende Tipps:
(Wer sich dessen schon angenommen hat, sollte hier ggf. nicht weiterlesen 😁 )
*Die Hunderter, Tausender, usw. habe ich absichtlich weggelassen, da diese optimaler Weise auf zwei Arrays aufgeteilt werden müssen. Und zwar in singular & plural. *Die Eingabe wird in Dreiergruppen aufgespaltet und verarbeitet!

Ansonsten: Kritik oder Anregungen?
Zu einfach, zu langweilig, gibt es schon 100fach im Internet?

16.07.2012 - 10:32 Uhr

Das klappt aber dementsprechend nicht auf mobilen Geräten, oder?
Zum Austausch zwischen 2 Rechnern auf jeden Fall eine adäquates Sicherheitsfeature 😃

Wahrscheinlich geht der Trend dahin, eine Lösung pro Anwendungsfall zu nutzen. Normalerweise benötige ich auf dem Handy nur einen Bruchteil der Daten, die ich zwischen den Rechnern austausche...

16.07.2012 - 09:02 Uhr

Hallo omega90,

ich benutze immer den Root-Pfad des Webservices (z.B. "127.0.0.1/myWebservice/WS/Services") und kann dann auf die verschiedenen Elemente zugreifen.
Der Hintergrund dazu: Ich habe nicht für jedes Webservice Element eine Referenz in Visual Studio, sondern nur eine einzige und initialisiere diese dann mit dem entsprechenden Ziel.

Hast du in Visual Studio unter den WebReferences schon den kompletten Webservice-Pfad angegeben, kannst du dir diesen Schritt natürlich sparen und einfach "myWebServices" durch den von dir vergebenen Namen austauschen.

Das sind aber imho Grundlagen.