Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von trib
Thema: Was haltet ihr von Password Tools (bspw. KeePass Password Safe)? vs. einfache und sichere Passworte
Am im Forum: Smalltalk

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.

Thema: XML Datei öffentlich verfügbar machen (Intra- oder Internet)
Am im Forum: Netzwerktechnologien

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

Thema: Mit 30 noch ein Fernstudium anfangen?
Am im Forum: Smalltalk

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.

Thema: UML und Offshoring: Was ist wahr, was ist Legende?
Am im Forum: Rund um die Programmierung

Zitat von Mallett
[...]
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.

Thema: Kommunikation über serielle Schnittstelle: Wie werden Unterbrechungen (z.B. Kabel gezogen) behandelt
Am im Forum: Rund um die Programmierung

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.

Thema: Qualitätssicherung: Wie konnte ein offensichtlicher Fehler in JellyBean 4.2 übersehen werden?
Am im Forum: Smalltalk

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...

Thema: Pfad zu angeschlossenem Handy ermitteln (USB-Laufwerk? Was sonst, wenn das nicht geht?)
Am im Forum: Rund um die Programmierung

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

Thema: Pfad zu angeschlossenem Handy ermitteln (USB-Laufwerk? Was sonst, wenn das nicht geht?)
Am im Forum: Rund um die Programmierung

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

Thema: Indizierung bei Group By zeigt keine Wirkung
Am im Forum: Datentechnologien

Zitat von chilic
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] Danke gfoidl, hab ich geändert. Da war ich wohl auf einem Auge blöd...

Thema: Ftp Webspace Größe + verwendeter Speicher ermitteln
Am im Forum: Netzwerktechnologien

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 ;-)

Thema: [gelöst] Fokus-Kontrolle für Textboxen: Ermitteln, welches Control vorher den Focus hatte
Am im Forum: GUI: Windows-Forms

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.

Thema: Treeview: Drag&Drop von Collapse/Expand unterscheiden
Am im Forum: GUI: Windows-Forms

Zitat von Th69
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.

Thema: Treeview: Drag&Drop von Collapse/Expand unterscheiden
Am im Forum: GUI: Windows-Forms

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 ;-)

Thema: js touch scroll
Am im Forum: Web-Technologien

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

Thema: Programm schließt bei Herunterfahren von Windows nicht
Am im Forum: Rund um die Programmierung

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).

Thema: Reporting Services + Daten von Snapshots vergleichen
Am im Forum: Datentechnologien

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

Thema: Mehrere Oberflächen in einer Form
Am im Forum: GUI: Windows-Forms

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

Thema: Das Zeichnen von vielen kleinen Kacheln flackert
Am im Forum: Grafik und Sound

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!

Thema: Das Zeichnen von vielen kleinen Kacheln flackert
Am im Forum: Grafik und Sound

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 :) )

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Zitat von D4rkScr43m
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!

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

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!

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo zusammen,

[offtopic]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.[/offtopic]

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 :)

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Zitat von D4rkScr43m
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.
Zitat von D4rkScr43m
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;

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

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);
        }

Thema: Programm gegen Veränderung von Außen schützen
Am im Forum: Rund um die Programmierung

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"

Thema: Matrix in Schlangenlinien befüllen
Am im Forum: Rund um die Programmierung

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[...]
}

Thema: Matrix in Schlangenlinien befüllen
Am im Forum: Rund um die Programmierung

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 ;-)

Thema: text in einer Tabelle einlesen C#
Am im Forum: Rund um die Programmierung

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");
}

Thema: .NET Compact Projekt für Mobile Devices nach install per .cab ausführen
Am im Forum: Rund um die Programmierung

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.

Thema: Windows Senden an ermöglichen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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).