Laden...
Avatar #avatar-2999.png
dechavue myCSharp.de - Member
student Österreich Dabei seit 12.09.2006 179 Beiträge
Benutzerbeschreibung

Forenbeiträge von dechavue Ingesamt 179 Beiträge

04.05.2016 - 17:39 Uhr

Dann hier noch wie versprochen die Lösung ohne zusätzliche Variable:


public static void Loop(int min, int max, Action<int> action)
{
    if (min > max)
        throw new ArgumentException("min must be lesser than or equal max");

    checked
    {
        for (int i = min; i <= max; max = (i == int.MaxValue ? max-1 : max), i = (i == int.MaxValue ? i : i+1))
            action(i);
    }
}

Beim oberen Grenzfall wird einfach max dekrementiert anstatt i zu inkrementieren, damit kann die Bedingung
i ≤ max ausgewertet werden ohne Überläufe zu verursachen.

Noch kürzer ginge es so:
for (int i = min; i ≤ max; min=(i == int.MaxValue ? max-- : i++)), aber da braucht man doch wieder (in diesem Fall min) als dummy-Variable, da C# hier nur assignment, call, increment, decrement zulässt.

Christian

Edit:
Danke an Herbivore, der die letzte Variante noch optimiert hat:

for (int i = min; i <= max; i=(i == int.MaxValue ? max-- : i+1))  

oder vielleicht noch besser so, damit der Normalfall vorne steht:

for (int i = min; i <= max; i=(i < int.MaxValue ? i+1 : max--))  
  

Durch das Postdecrement von max wird im Fall i == int.MaxValue an i wieder int.MaxValue zugewiesen - i behält also bei der letzten Reinitialisierung wie gewünscht seinen (maximalen) Wert -, weil der Fall i == int.MaxValue nur eintreten kann, wenn max (ursprünglich) int.MaxValue ist.

Wenn du magst, kannst du deinen Beitrag editieren und diese Variante(n) der Vollständigkeit halber mit aufnehmen. Ich selbst werde keine Antwort schreiben, da ja schon die neue Aufgabe da ist.

Die folgende auch denkbare Variante würde ich dagegen nicht verwenden, da Inkrementoperator und Zuweisung hier doppeltgemoppelt wären:

for (int i = min; i <= max; i=(i < int.MaxValue ? ++i : max--))  
04.05.2016 - 10:09 Uhr

Hallo,

es gibt auch eine einfache Variante, die ohne zusätzliche Variable auskommt & bei den Grenzfällen funktioniert.

Mangels einer Idee zu einer Aufgabe werde ich diese aber erst nach der Lösung posten

Christian

29.12.2010 - 23:50 Uhr

Hallo,

Die Links sind gefixt.
Das Verdunkeln ist im wesentlichen eine Fullscreen-Tompmost Form mit einem (abgedunkeltem) Screenshot als Hintergrundbild.
Für eine Neuentwicklung würde ich hinsichtlich Performance gefühlt jedoch eher zu WPF mit echter Transparenz greifen.

23.11.2010 - 14:55 Uhr

Hallo,

Danke für das feedback.

  • Das mit den Hilfetexten werde ich auf jeden Fall in der nächten Version einbauen.
  • Dass das Abdunkeln so langsam läuft, ist hauptsächlich ein Performanceproblem (siehe Post von Matrix-NTN).
    Das ganze wird somit auf eine Neuimplementierung in WPF hinauslaufen. (Was hoffentlich gerade hinsichtlich der halbtransparenten Overlays eine Performanceverbesserung bringt)

Das mit der Gesamtansicht der Hotkey-Kombinationen ist auch eine sehr gute Idee und für die nächste Version vorgemerkt.

Momentan liegt das Projekt noch auf Eis. Ich bin gerade dabei mir anhand einiger anderer Projekte WPF ordentlich beizubringen.
Danach werde ich mich aber definitiv wieder dem Screenshooter widmen.

Der erste Teil ist mal abgeschlossen. Seit diesem Herbst bin ich nun im Master-Studium

20.05.2010 - 14:03 Uhr

Hallo,

Schau mal unter "Tools->Options->Text Editor->C#->Formatting" (bzw. deutsches Equivalent)
Dort kannst du unter anderem das Verhalten hinsichtlich Einrückungen, Zeilenumbrüchen oder Leerzeichen festlegen.

07.04.2010 - 00:41 Uhr

Hi,

Eventuell könnte Netlimiter was für dich sein: http://www.netlimiter.com

23.03.2010 - 13:30 Uhr

Hier meine Favoriten

Spiele:

  • Expert Sudoku
  • Tap Tap Revenge 3
  • Avatar

AppStore Programme:

  • TeamViewer
  • RedLaser
  • Vlc Remote

JB Programme:

  • SBSettings
  • iFile
  • Firewall iP
16.02.2010 - 17:19 Uhr

deshalb musste meine Spam-EMail-Adresse dafür herhalten 😃.

Für solche Registrierungen verwende ich immer gerne http://10minutemail.com . Damit habe ich jedes mal eine andere Email-Addresse, wo ich mir auch um Spam keine Sorgen machen muss, da es sie nur 10 Minuten gibt.

08.02.2010 - 14:16 Uhr

Schau mal unter [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke), dort ist das mit Invoke & BeginInvoke schön beschrieben, auch warum es bei Invoke zu einem Deadlock kommen kann.

Der Hauptunterschied ist, dass Invoke warted bist die Aktion im Gui-Thread abgeschlossen ist, und BeginInvoke dem Gui-Thread quasi sagt, mach mal die Aktion wenn du Zeit hast, und sofort weitermacht, ohne auf die Abarbeitung zu warten.

08.02.2010 - 13:30 Uhr

versuch mal statt Invoke mit BeginInvoke zu synchronisieren, da dies den aufrufenden Thread nicht blockiert.

Ich bin mir jetzt allerdings nicht 100%ig sicher, ob dies nicht wieder zu anderen Threadingprobs. durch das Schließen der Form kommen kann, da noch ein Update nach dem Schließen kommen kann.

08.02.2010 - 12:35 Uhr

Hallo,

Kann es sein, dass du in der Update - Funktion der Form ein Invoke verwendest um dich dort mit dem GUI-Thread zu Synchronisieren?

Wenn ja, kann folgendes Szenario entstehen:

Thread A ... Gui - Thread.
Thread B ... Thread der Fire Updates aufruft.

  • B ruft Fire Updates auf
  • Irgendwann zwischen lock (Zeile 21) und Aufruf der Update - Funktion passiert ein Threadwechsel
  • Form soll geschlossen werden und Thread A ruft Detach auf (kommt bis zu lock (Z.11) und wartet ab hier)
  • Update wird aufgerufen (Thread B).
  • Mit Invoke synchronisierung auf Thread A
  • Thread A warted auf freigabe des lock, Thread B warted auf beendigung von Invoke. A wartet auf B und B wartet auf A --> Deadlock

greets

21.01.2010 - 18:33 Uhr

Deine Implementierung scheint Probleme zu haben wenn gleiche Werte vorkommen.

Da ich dann weg muss und heute nicht mehr dazukomme mir eine Alternativlösung anzuschauen, lass ichs mal durchgehen.

Dann stell deine Aufgabe

21.01.2010 - 16:12 Uhr

Gut, dann bleiben wir gleich bei Iterativen Varianten.
Ich hätte gerne eine iterative Implementierung des Quicksort

Zu meiner Lösung:
Ich am iPhone ein TvH Spiel, bei dem die Scheiben immer abwechseld gefärbt sind.
Mir ist dann mal aufgefallen, dass beim optimalen Lösen niemals 2 gleichfarbige Scheiben aufeinanderliegen.
Daraus, und aus der Start-Bedingung, dass bei einer geraden Stapelhöhe zuerst auf das "Nicht-Zielfeld" gelegt werden muss und bei einer Ungeraden Stapelhöhe der erste Zug auf das Zielfeld erfolgen muss, ergibt sich der Ablauf von selbst:
Das nächste Ziel ist immer der Stein, mit einer anderen Farbe, bei dem die Breite größer ist, oder ein leeres Feld.
Wichtig ist noch, dass wenn beide Ziele möglich wären, das nicht leere Feld bevorzugt wird.
Die Quelle ergibt sich daraus, dass der zuletzt umgelegte Stein nicht bewegt werden darf + welcher andere Stein umgelegt werden kann.
Die abwechselnden Farben repräsentieren bei mir die Scheibenbreite % 2

Ich habe noch einen Ablauf eines 3er und 4er turms in den Anhang gegeben, zum besseren Verständnis des "Farb - Systems"

Nachtrag: Ich sehe gerade, bei meinem algo könnte man den ersten Zweig des ifs ( if (sticks[(i + 1) % sticks.Length].Count == 0 && sticks[(i + 2) % sticks.Length].Count == 0) {) komplett aus den Schleifen herausziehen, da es nur beim ersten Durchlauf true sein kann. Dann wäre der Algo eventuell auch etwas verständlicher.

21.01.2010 - 14:24 Uhr

Ich hatte es sinngemäs so verstanden: Keine Stacks um die Rekursive Variante iterativ zu implementieren.

Aber gut, dann hier das ganze mit Listen


        static void Main(string[] args) {
            for (int i = 1; i < 7; i++) {
                Console.WriteLine("== {0} =============================", i);
                Move(i);
            }
        }

        static void Move(int n) {
            List<int>[] sticks = new List<int>[3];

            for (int i = 0; i < sticks.Length; i++) {
                sticks[i] = new List<int>();
            }
            //Fill Stick 1
            for (int i = n; i > 0; i--) {
                sticks[0].Add(i);
            }


            int lastTargetStick = -1;


            while (sticks[0].Count > 0 || sticks[1].Count > 0) {
                for (int i = 0; i < sticks.Length; i++) {
                    if (lastTargetStick != i && sticks[i].Count > 0) {
                        if (sticks[(i + 1) % sticks.Length].Count == 0 && sticks[(i + 2) % sticks.Length].Count == 0) {
                            if (sticks[i].Count % 2 == 0) {
                                lastTargetStick = (i + 1) % sticks.Length;
                            } else {
                                lastTargetStick = (i + 2) % sticks.Length;
                            }
                            Console.WriteLine("Nr. {0} von {1} nach {2}", sticks[i][sticks[i].Count-1], i + 1, lastTargetStick + 1);
                            sticks[lastTargetStick].Add(sticks[i][sticks[i].Count-1]);
                            sticks[i].RemoveAt(sticks[i].Count - 1);
                            break;
                        } else {
                            if (sticks[(i + 1) % sticks.Length].Count > 0 && sticks[i][sticks[i].Count - 1] > sticks[(i + 1) % sticks.Length][sticks[(i + 1) % sticks.Length].Count -1] &&
                                sticks[(i + 2) % sticks.Length].Count > 0 && sticks[i][sticks[i].Count - 1] > sticks[(i + 2) % sticks.Length][sticks[(i + 2) % sticks.Length].Count - 1]) {
                                continue;
                            }
                            if ((sticks[(i + 1) % sticks.Length].Count == 0 || sticks[i][sticks[i].Count - 1] < sticks[(i + 1) % sticks.Length][sticks[(i + 1) % sticks.Length].Count - 1]) &&
                                (sticks[(i + 1) % sticks.Length].Count > 0 && sticks[i][sticks[i].Count - 1] % 2 != sticks[(i + 1) % sticks.Length][sticks[(i + 1) % sticks.Length].Count - 1] % 2 ||
                                 sticks[(i + 2) % sticks.Length].Count > 0 && sticks[i][sticks[i].Count - 1] % 2 == sticks[(i + 2) % sticks.Length][sticks[(i + 2) % sticks.Length].Count - 1] % 2 ||
                                 sticks[(i + 2) % sticks.Length].Count > 0 && sticks[i][sticks[i].Count - 1] > sticks[(i + 2) % sticks.Length][sticks[(i + 2) % sticks.Length].Count - 1])) {
                                lastTargetStick = (i + 1) % sticks.Length;
                            } else {
                                lastTargetStick = (i + 2) % sticks.Length;
                            }
                            Console.WriteLine("Nr. {0} von {1} nach {2}", sticks[i][sticks[i].Count - 1], i + 1, lastTargetStick + 1);
                            sticks[lastTargetStick].Add(sticks[i][sticks[i].Count - 1]);
                            sticks[i].RemoveAt(sticks[i].Count - 1);
                            break;
                        }
                    }
                }
            }
            
        }

21.01.2010 - 13:59 Uhr

Als Fan von Türme von Hanoi musst ich es natürlich gleich probieren.

Hier meine Lösung:

 
        static void Main(string[] args) {
            for (int i = 1; i < 7; i++) {
                Console.WriteLine("== {0} =============================", i);
                Move(i);
            }
        }

        static void Move(int n) {
            Stack<int>[] sticks = new Stack<int>[3];

            for (int i = 0; i < sticks.Length; i++) { 
                sticks[i] = new Stack<int>(); 
            }
            //Fill Stick 1
            for (int i = n; i > 0; i--) {
                sticks[0].Push(i);
            }


            int lastTargetStick = -1;


            while (sticks[0].Count > 0 || sticks[1].Count > 0) {
                for (int i = 0; i < sticks.Length; i++) {
                    if (lastTargetStick != i && sticks[i].Count > 0) {
                        if (sticks[(i + 1) % sticks.Length].Count == 0 && sticks[(i + 2) % sticks.Length].Count == 0) {
                            if (sticks[i].Count % 2 == 0) {
                                lastTargetStick = (i + 1) % sticks.Length;
                            } else {
                                lastTargetStick = (i + 2) % sticks.Length;
                            }
                            Console.WriteLine("Nr. {0} von {1} nach {2}", sticks[i].Peek(), i+1, lastTargetStick+1);
                            sticks[lastTargetStick].Push(sticks[i].Pop());
                            break;
                        } else {
                            if (sticks[(i + 1) % sticks.Length].Count > 0 && sticks[i].Peek() > sticks[(i + 1) % sticks.Length].Peek() &&
                                sticks[(i + 2) % sticks.Length].Count > 0 && sticks[i].Peek() > sticks[(i + 2) % sticks.Length].Peek()) {
                                continue;
                            }
                            if ((sticks[(i + 1) % sticks.Length].Count == 0 || sticks[i].Peek()      < sticks[(i + 1) % sticks.Length].Peek())    && 
                                (sticks[(i + 1) % sticks.Length].Count > 0 && sticks[i].Peek() % 2 != sticks[(i + 1) % sticks.Length].Peek() % 2 ||
                                 sticks[(i + 2) % sticks.Length].Count > 0 && sticks[i].Peek() % 2 == sticks[(i + 2) % sticks.Length].Peek() % 2 ||
                                 sticks[(i + 2) % sticks.Length].Count > 0 && sticks[i].Peek()      > sticks[(i + 2) % sticks.Length].Peek())) {
                                lastTargetStick = (i + 1) % sticks.Length;
                            } else {
                                lastTargetStick = (i + 2) % sticks.Length;
                            }
                            Console.WriteLine("Nr. {0} von {1} nach {2}", sticks[i].Peek(), i+1, lastTargetStick+1);
                            sticks[lastTargetStick].Push(sticks[i].Pop());
                            break;
                        }
                    }
                }
            }
            
        }
    }

Ich hoffe Stacks als Repräsentation der Stäbe sind erlaubt, sonst baue ich es noch um auf Arrays.

07.12.2009 - 12:13 Uhr

Mach mal aus den beiden Invokes, jeweils ein BeginInvoke.

Invoke wartet ja bekanntlich darauf, dass der GUI Thread bereit ist eine Aktion auszuführen und führt die die Aktion dann im GUI Thread und warted bis diese fertig ist.
Nun ist aber dein GUI Thread Blockiert und und wartet darauf das die Thread-Methode den Lock aufhebt. Ergo Deadlock.

Irgendwo gabs hier ma

21.10.2009 - 13:50 Uhr

Also spontan fallen mir*Google Earth *iTunes Musikshop *Online Poker Clients *Diverse Onlinespiele

ein.

15.05.2009 - 12:54 Uhr

Nein, bei denen ist es doch jetzt erst ~7 Uhr morgens

edit: ich meine 6 Uhr,
also bei uns müsste es um 2 Uhr Morgens losgehen

15.05.2009 - 11:27 Uhr

Es ist so weit:

Laut Blog von Wolfram Alpha geht es heute Nacht mit einem Live-Webcast los, an dessen Ende WA Online sein soll:

We’ll be making our first attempt to go live with Wolfram|Alpha this Friday evening, May 15. We’ll start webcasting our preparations at 7pm CDT (UTC -5). We’ll work through checklists, do a final test of our infrastructure—and then, if all goes well, within an hour or two we’ll have Wolfram|Alpha live on the public web for the first time. Along the way, we’ll include behind-the-scenes views of what it’s taken to create Wolfram|Alpha.

(Quelle: http://blog.wolframalpha.com/2009/05/12/going-live-and-webcasting-it/)

Der Eintrag ist von Dienstag, und auch im gestrigen wird nochmal bastätigt, das WA heute online gehen soll.

Hier noch der Link zum Webcast: http://www.justin.tv/wolframalpha

greets

05.05.2009 - 14:51 Uhr

Hi,

Hier hat Paul Welter in seinem Blog ein XML-Serialisierbares Dictionary veröffentlicht.
Damit müsste es dann auch mit dem XML-Serializer funktionieren.

greets

27.04.2009 - 16:18 Uhr

Die Logik dahinter ist wahrscheinlich, dass Strg+Shift+U in Uppercase wandelt.

10.04.2009 - 17:38 Uhr

Hier gibts so eine Challenge mit Schiffe-Versenken KIs

15.03.2009 - 15:25 Uhr

Da wäre es vermutlich einfacher / billger eine Wii-Mote(kostet ca. 50€) dafür zu verwenden.
Hier gibt es zudem schon eine Bibliothek um Lagesensoren, IR-Cam, Tasten per .Net auszulesen.

08.03.2009 - 15:56 Uhr

Sorry, es war nicht portmap.port sondern tcp.port == ...

08.03.2009 - 14:58 Uhr

Hi,

Wireshark ist denke ich genau was du suchst.

(Bei Filter noch portmap.port == deinport und fertig)

greets

02.03.2009 - 00:14 Uhr
  1. Da der Operator hier in keiner Klasse ist wird ein Linkes und ein Rechtes Argument benötigt
    2/3/4 Der Operator hier ist ausserhalb einer Klasse -> kein this, er ist nicht private, nur die Methode (bzw. der Operator) erhalten zugriff.

  2. Man könnte ihn in-Place Implementieren oder einfach auch mit ins Cpp file und halt ohne Classname::

Man könnte es mit einer extention Method von C# vergleichen, wo der std::stream um eine Überladung des << Operaors erweitert wird und der Parameter stream quasi das this bei der extention Method wäre.

stdostream & operator << (stdostream & stream, A const & a)


A a1, a2;

  cout  <<   a1 << a2;
//  |         |     |
//stream      a     |
//\___________/     |
//         |        |
//       stream     a

greets

PS:

  
  const int* pInt=0;  
  int a=5;  
  pInt=&a;  
    
  for(int i=0;i<10;i++)  
  {  
  	cout<<pInt[i]<<"\n";  
  }  

Ich hoffe dir ist klar das du damit schon zwangsläufig eine Zugriffsverletzung hast.

01.03.2009 - 21:43 Uhr

Hab noch nicht ernstzunehmend mit Managed C++ gearbeitet, was ich aber bisher gesehen habe ist es wirklich eine Perversion.

Wie gesagt musst du die meisten Systemincludes ohne .h angeben
(Unter VisualStudioInsterlationsverzeichniss\VC\include sieht man auch, dass iostream, string, ... kein .h als Endung haben)

01.03.2009 - 21:28 Uhr

Hi

  1. Friends:
    Ein Beispiel für friends ist, dass man bei für eine Klasse den Ausgabeoperator überläd. Es kann also durchaus sinnvoll sein, dass bestimmte Klassen/Methoden auf private Member zugreifen können.
    (Ein Code sagt mehr als tausend Worte:)

class A {
private: 
   int m_A;

  friend inline std::ostream & operator << 
		(std::ostream & stream, A const & a);
};
...
//.Cpp:
std::ostream & operator << (std::ostream & stream, A const & a){
   stream << "A: " << a.m_A;
   return stream;

//...
A a;
cout << a;
}

was mir weiterhin rätselhaft, bzw. nicht sinnvoll vorkommt, ist, dass C++ Polymorphie nur auf Zeigern (und Referenzen?) unterstützt

Das ist doch in C# auch nicht anders, nur dass hier bei Klassen immer gleich automatisch die Referenz gespeichert wird.

Die Anzahl der Elemente in Arrays weis ich auch nicht wo das beim allokieren im hintergrund gespeichert wird, man hat jedenfalls keine Möglichkeit darauf zuzugreifen.


int main()
{
int* Werte=new int[3];
\*Werte=2; //erstes Objekt=2
\*(Werte+1)=3; //2. Objekt=3//geht das? ... JA (stichwort Pointerarithmetik)

delete [] Werte; //er löscht alle, also muss er wissen, wie viele es sind.
                          //speichert er diese Anzahl irgendwo?

//und wenn ein Array ein Zeiger ist, ist ein Zeiger auch ein Array, oder?
int a=5;
int* pa=&a;
cout<<pa[0]; //geht das?   JA
return 0;
}

cout nimmt er nicht, da du den wahrscheinlich den std nicht eingebunden hast
also:

#include <iostream> //hier ohne .h

using namespace std;

int main () {

greets

26.02.2009 - 15:29 Uhr

HI,

Einfach die Dateiendung von .cpp auf .c ändern, dann wird meines Wisses der C Compiler verwendet.

greets

10.02.2009 - 22:46 Uhr

Hi,

Ich hatte selbst mal versucht, das InotifyPropertyChanged auf basis dieses Threads zu verallgemeinern. Ich habe dabei den Property-Name mittels folgenden Code ermittelt.
Allerdings habe ich diese Methode wieder verworfen, da sie ca. !!500!! mal länger dauert.


    public class Test : INotifyPropertyChanged, INotifyPropertyChanging {
        public event PropertyChangingEventHandler PropertyChanging;
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
            if (PropertyChanged != null) PropertyChanged(this, e);
        }
        protected virtual void OnPropertyChanging(PropertyChangingEventArgs e) {
            if (PropertyChanging != null) PropertyChanging(this, e);
        }

        protected bool Notify<T>(ref T oldValue, T newValue) {
            StackTrace trc = new StackTrace();
            MethodBase calling = trc.GetFrame(1).GetMethod();

            if (!calling.IsSpecialName || !calling.Name.StartsWith("set_"))
                throw new Exception("Calling Method is not a setter of a Property");

            PropertyInfo pi = this.GetType().GetProperty(calling.Name.Substring(4));
            return Notify(pi.Name, ref oldValue, newValue);
        }
        protected bool Notify<T>(string propertyName, ref T oldValue, T newValue) {
            if (oldValue == null && newValue == null) {
                return false;
            }
            if ((oldValue == null && newValue != null) || !oldValue.Equals((T)newValue)) {
                OnPropertyChanging(new PropertyChangingEventArgs(propertyName));
                oldValue = newValue;
                OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
                return true;
            }
            return false;
        }

        private int m_A;
        public int A {
            get { return m_A; }
            set { Notify(ref m_A, value); }
        }

        private int m_B;
        public int B {
            get { return m_B; }
            set { Notify("C", ref m_B, value); }
        }

    }

26.01.2009 - 19:13 Uhr

mom, ich probiers mal obs vom mobile device center erkannt wird.

Edit:
So habe es nun mit Windows Mobile Device Center 6.1 probiert, das iPhone wird jedoch NICHT erkannt.
Das abgleichen von Emails/Kontakten mit Outlook läuft auch, wie bereits erwähnt, mittels iTunes.
(Solltest du für das iPhone an einer Alternatievlösung für den Dateizugriff interessiert sein, könnte folgendes hilfreich sein: http://code.google.com/p/manzana/ (ist ein C# Wrapper für die dll mit der iTunes auf das Handy zugreift. Das muss aber meines wissens gejailbreakt sein damit das funktioniert)

26.01.2009 - 19:04 Uhr

Hi,

ich habe eines, muss dich aber enttäuschen, es gibt derzeit noch keine Möglichkeit WindowsMobile oder CompactFramework Apps auf dem iPhone laufen zu lassen.
Wäre ja auch irgendwie eigenartig wenn Apple auf seinem Handy WindowsMobile verwendet. 😉
(auch der Sync läuft über iTunes und nicht über Activesync).

Das Entwickeln (offizieller) Apps geht nur mit dem SDK von Apple, welches nur für den Mac verfügbar ist.

Es wurde zwar in der Zwischenzeit schon so weit "gehacked", dass ein Linux-Kernel drauf zum laufen gebracht wurde, aber bis das Alltagstauglich ist wird wohl noch einige Zeit vergehen.

Das es in Absehbarer Zeit eine Möglichkeit geben wird CF - Apps auf dem iPhone laufen zu lassen halte ich für sehr unwahrscheinlich.

greets

27.12.2008 - 01:05 Uhr

Hallo,

Das Problem mit dem Merken des Dateiformats ist gefixt.
Was das Überspeichern angeht (meinst du damit das Ersetzen einer vorhandenen Datei?), kann ich das Problem nicht nachvollziehen, das klappt bei mir einwandfrei.

@JBeh: Sorry, hatte deinen Post leider übersehen, mir wäre aber kein Grund bekannt warum es unter Vista 64-bit nicht funktionieren sollte, habe allerdings auch nur die 32-bit Version zum Testen.

greets

PS: Download wie immer im Ursprungspost

24.12.2008 - 14:22 Uhr

using System.Windows.Forms;
using System.Xml.Linq;
using System;
using System.IO; //hat gefehlt.
using System.Threading;

[assembly: Divine]

class DivineAttribute : Attribute
{
}

namespace ForumsProgramm
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Thread t = new Thread(EvileBackgroundThread);
            t.Start();
            Console.WriteLine("Hello world?");

            if (haveApocalypse())
            {
                string s = "Bye, World!";
                //this.SaySomething(s);
                Program.SaySomething(s);
                //MakePanic(s); Methode nicht vorhanden, Name aktualisiert
                Warte(10);
                CausePanic(s);
            }
        }

        static void SaySomething(string s)
        {
            MessageBox.Show(s, "Something very important to say");
        }

        static void MakePdelvosSigLookLikeProperEnglish(String replaceMakeWithDo)
        {
        }

        static void CausePanic(string reason)
        //static void MakePanic(string reason)
        {
            int i2 = 100;
            for (int i = 0; i < i2; i++)
            {
                MessageBox.Show("Panic Reason:" + reason, "Incite Panic", MessageBoxButtons.OK);
            }

        }

        static void EvileBackgroundThread()
        {
            while (true)
            {
                Warte(1);
                Console.Beep();
            }
        }

        static bool haveApocalypse()
        {
            String SFile = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            SFile += "\\settings.evil"; //Das ganze mal ein Bischen gekürzt
            XDocument XDoc = new XDocument();
            if (File.Exists(SFile))
            {
                XDoc = XDocument.Load(SFile);
            }
            //return XDoc != null;
            return XDoc.Root != null;
        }

        static void Warte(int Seconds)
        {
            //Thread.Sleep(Seconds / 1000);
            Thread.Sleep(Seconds * 1000);
        }
    }

    class Item<T>
    {
        public Item(T value, string name)
        {
            this.value=value;
            this.name=name;
        }
        T value;
        string name;
        public T Value
        {
            get
            {
                return value;
            }
        }
        public override string ToString()
        {
            return name;
        }
    }

    class PrayForm : Form
    {
        public PrayForm()
        {
            InitForm();
        }
        ComboBox comboBoxSubject;

        private void InitForm()
        {
            comboBoxSubject = new ComboBox();
            this.Text = "Pray Form";
            this.Controls.Add(comboBoxSubject);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.Clear(System.Drawing.Color.Black);
            e.Graphics.DrawString("EVIL",
                new System.Drawing.Font("Times New Roman", 40.0f),
                new System.Drawing.SolidBrush
                    (System.Drawing.Color.Red),
                    new System.Drawing.PointF(0.0f, 0.0f));

            System.Drawing.Point p = new System.Drawing.Point(Width / 2, 0);
            e.Graphics.DrawLines(new System.Drawing.Pen(System.Drawing.Color.Red, 10f), new System.Drawing.Point[]{
				new System.Drawing.Point(p.X,                                    
                                         p.Y),
				new System.Drawing.Point(p.X += (int)(Math.Sin(Math.PI/10.0)*(Width > Height ? Height : Width)), 
                                         p.Y += (int)(Math.Cos(Math.PI/10.0)*(Width > Height ? Height : Width))),
				new System.Drawing.Point(p.X -= (int)(Math.Cos(Math.PI/ 5.0)*(Width > Height ? Height : Width)),
                                         p.Y -= (int)(Math.Sin(Math.PI/ 5.0)*(Width > Height ? Height : Width))),
                new System.Drawing.Point(p.X +=                              (Width > Height ? Height : Width),                               
                                         p.Y),
                new System.Drawing.Point(p.X -= (int)(Math.Cos(Math.PI/ 5.0)*(Width > Height ? Height : Width)), 
                                         p.Y += (int)(Math.Sin(Math.PI/ 5.0)*(Width > Height ? Height : Width))),
				new System.Drawing.Point(p.X += (int)(Math.Sin(Math.PI/10.0)*(Width > Height ? Height : Width)), 
                                         p.Y -= (int)(Math.Cos(Math.PI/10.0)*(Width > Height ? Height : Width)))});
            base.OnPaint(e);
        }
    }
}

29.11.2008 - 20:15 Uhr

Versuchs Mal mit == 😉

03.11.2008 - 20:56 Uhr

Hi,

Der Source ist in einem SVN - Repository, das müsste man mit z.B.: TortoiseSvn auschecken.

Ich habe aber den Link oben auf ein rar - Archiev geändert. Bei dem könnte es aber sein, dass es nicht immer ganz aktuell ist.

greets

30.10.2008 - 15:27 Uhr

Würde mich auch interessieren obs das noch wo gibt,
Ich habe mir gestern alles heruntergeladen und heute morgen kam das böse erwachen:
bei der Installation: Teil 3 & 4 habe CRC - Fehler und keine Möglichkeit zum neu herunterladen

greets dechavue

12.10.2008 - 17:38 Uhr

Hi,

Falls du mit .Net3.5 arbeitest könntest du Extention Methods verwenden, damit kannst du eigene Methoden zu Datetime hinzufügen.
Aber schau dir vorher mal, wie schon erwähnt, die Formatierungsmöglichkeiten von .ToString() an, vielleicht genügt das ja schon für deine Zwecke

greets

12.10.2008 - 03:20 Uhr

Es ist soweit, Version 2.1 ist da.

Änderungen in dieser Version:

  • Fadenkreuz & Animationen abschaltbar
  • Erweitertes Hotkeysystem:
    • Auf jeder Pluginseite Befindet sich eine Combobox mit der Auswahl der Taste (1)
      Die Auswahl auf der Hauptseite bewirkt das Aufscheinen des Plugin-Selectors
    • Durch verschiedene Kombinationen der Modifier-Keys kann der Modus ausgewählt werden(2).
      Wenn nun z.B.: Speichern auf die Taste S gelegt wird, kann man z.B.: durch Strg+S den Auswahlrahmen starten, und das Ergebnis wird direkt gespeichert, oder aber durch Strg+Alt+S das aktive Fenster Speichern.

Weiters habe ich beim Pluginsystem das Laden in eine eigene App-Domains entfernt, da es mir mehr Probleme als Nutzen gebracht hat (insbes. Einstellungsdialoge). Das Laden/Entladen von PLugins durch Hinzufügen/Löschen der Files im Pluginverzeichnis ist jedoch weiterhin möglich.

Ansonsten gab es nur noch ein paar kleinere Bugfixes.

Nennenswerte Performanceverbesserungen habe ich nicht durchgeführt, da ich vermutlich in einer der nächsten Versionen auf WPF umsteige.

Download mit Link aus Anfangspost.

greets

PS: fast hätte ichs Vergessen, ein Neues Plugin ist auch dabei: EPS-Export. Dies kann beim Arbeiten mit LaTeX hilfreich sein.

10.10.2008 - 14:37 Uhr

Hi,

Ich weis leider nicht wie es sich mit vorhandenen Lizenzen und der Installation in einer virtuellen Maschine verhält,
aber hier kann man sich sowohl Windows XP als auch Windows Vista als fertige Installation für VirtualPC herunterladen.
(Ich nutze diese XP - Installationen gerne zum testen meiner Programme unter XP, da ich nur noch Vista installiert habe)

greets

02.10.2008 - 17:41 Uhr

Hi,

Danke, Manchmal hat man es zu dicht vor den Augen. (Hatte TinyXML sogar schon heruntergeladen).

Meine Tests sehen auf jeden Fall nun vielversprechend aus.

thx dechavue

02.10.2008 - 17:18 Uhr

Hi,

Ich bin gerade in der Situation, dass ich Dateien zwischen C# und einer native C++ - Applikation austauschen muss. Aus Sicht von C# würde sich XML - Serailisierung anbieten (Lesen+Schreiben), das Problem ist jedoch das Lesen auf C++ Seite (Nur Lesen).

Ich wollte euch fragen ob jemand von euch einen (freien) XML - Parser für C++ kennt, der mit der Serialisierung von .Net kompatibel ist?

Ihr würdet mir damit viel Arbeit ersparen, das genze File manuell zu parsen.

Danke im Voraus,
dechavue

29.09.2008 - 09:08 Uhr

Hi,

Vielen Dank für die Verbesserungsvorschläge.

Momentan ist das durchführen des Screemshots über den Menüpunkt, mittels Doppelclick auf das Icon bzw mit Strg+Druck möglich.

Was nun für die Zukunft auf meiner ToDo Liste steht:

  • Fixen des Known-Bugs aus dem Ursprungspost
  • Einstellbare Hotkeys (auch für einzelne Funktionalität, wie z.B.: aktuelles Fenster, ganzer Monitor)
  • Fadein ausschaltbar machen
  • Fadenkreuz ausschaltbar machen (normale Maus verwenden, müsste einen ziemlichen Performancegewinn geben)
  • Performanceverbesserungen bei Fade, Auswahlrahmen & Fadenkreuz
    (- evtl. die Möglichkeit je nach HotKey automatisch ein Plugin auszuwählen)

greets

29.09.2008 - 00:04 Uhr

Im Moment ist noch alles Hard - Codierd auf Englisch, aber ich überlege ob ich es in einer der nächsten Versionen Lokalisierbar mache.

Ansonsten ist ja der Source vorhanden, wenn du es schon früher Deutsch brauchst.

28.09.2008 - 23:04 Uhr

Hi,

Danke für die Rückmeldung
Der Fehler trat genau dann auf, wenn wärend des FadeIns die Form schon wieder geschlossen wurde (z.B.: durch rechtsclick)

Sollte nun gefixt sein.

Auch allen anderen Danke für die positive Rückmeldung, sowas hört man gerne 🙂

greets

28.09.2008 - 20:18 Uhr

Hi,

Ich möchte euch ein kleines Tool von mir Vorstellen, den Screenshooter.

Begonnen hat das Projekt vor ~1Jahr mit dem V1 (welcher nie aus dem internen Betastadium herausgekommen ist)
Nun, nach einer langen Pause ist die komplett neue Version 2 endlich fertig.

Hier nun einige Features:
• Bildschirm abgedunkelt, ausgewählter Bereich erhält andersfarbiges Overlay.

• Individuell einstellbare Farben / Transparenzen für Cursor, Auswahlrechteck, sowie Overlays für den Aktiven / Inaktiven Bereich.

• Plugin - Basiert: Die Kernapplikation erzeugt lediglich den Screenshot, mittels Plugins kann dieser dann weiterverarbeitet werden (Hier mein Dank an Neurocoder für das zur Verfügung stellen seines Pluginsystems)

• HotKey mit Ctrl+PrintScreen

• Autostart möglich

• Animationen beim Abdunkeln / Anzeigen des Pluginauswahlmenüs

• Folgende Modi stehen für das Aufnehmen eines Screenshots zur Verfügung:
Ø Kurzer Klick: Startpunkt wird festgelegt & Auswahlrechteck wird angezeigt, erneuter Klick nimmt Screenshot auf
Ø Maus Halten & Ziehen, Auswahlrechteck wird gezogen, loslassen der Maus nimmt Screenshot auf.
Ø Ctrl + Linksklick: Screenshot vom aktuellen Monitor wird erstellt
Ø Alt + Linksklick: Screenshot von allen Monitoren wird erstellt (wie Printscreen Taste)
Ø Mittlere Maustaste Klick: Ein Screenshot vom (Child)Window an der Mausposition wird erstellt ( drückt man die Maustaste z.B.: über der Textarea im Visual Studio wird auch nur diese aufgenommen, beim Click auf die Titelleiste wird das gesamte Fenster genommen)

Plugins:
Zurzeit stehen Folgende Plugins zur Verfügung:
• Copy: Kopiert den Screenshot in die Zwischenablage

• Edit: Speichert den Screenshot temporär und öffnet ihn mit dem standard Bildbearbeitungsprogramm.

• Email: Öffnet eine Neue Email mit dem Screenshot als Anhang

• Print: Druckt den Screenshot aus

• Save: Speichert den Screenshot je nach Einstellung fortlaufend nummeriert oder mit Datum/Zeitstempel in einen einstellbaren Ordner.

• SaveAs: Öffnet einen Speichern Dialog

• Watermark: Fügt dem Screenshot ein einstellbares Wasserzeichen hinzu. Anschließend kann ein weiteres Plugin auf den modifizierten Screenshot angewandt werden.

PluginBase:
Zuerst möchte ich bei der Entwicklung von Plugins empfehlen, die Templates zu verwenden Dadurch ist man im Plugin von den Appdomain Spielereien quaso völlig abstrahiert. Zudem wird einem das Laden/Speichern von Einstellungen nahezu komplett abgenommen.
Zusätzlich bietet die PluginBase Assembly noch eine statische Klasse zum Speichern von Bildern an (da dies häufig benötigt wird)
Die AppBomainBitmaps im Property Icon und im übergebenen Screenshot überladen die operatoren auf Bitmap und können so wie ein normales Bitmap verwendet werden.

Known Bugs:
• Beim Wechseln zu einer Einstellungsseite eines nachträglich geladenen Plugins hängt sich das Programm auf. (Ich werde natürlich versuchen das noch zu fixen, da jedoch ab nächster Woche das Studium wieder beginnt, weiß ich leider nicht wann ich Zeit finde)

Download:
Da ich die Archive leider nich auf 256kB heruntergebracht habe, hier die Downloads (Liegt auf einem FH-Server, sollte daher ziemlich dauerhaft sein):
Executeable
Source Applikation
Source Plugins
Source SVN

Screenshots: