Die gedachte Verwendung dieser Methoden ist, sie den Cursor beim Eintritt auszublenden und beim Austritt wieder anzuzeigen. Deshalb werden die Aufrufe auch bilanziert.
Im Mausklick machst du doch bestimmt noch irgendwas anderes. Dann blendest du den Cursor beim Start aus und beim Beenden wieder ein. Das Control, bei dem er sichtbar sein soll, sollte beim Enter die alte Cursorform speichern, das Kreuz einstellen und den Cursor sichtbar schalten. Beim Leave entsprechend wieder ausschalten und den alten Cursor setzen.
Du verschränkst hier die Aufrufe der Methoden und bekommst daher Probleme.
Trotzdem frage ich mich, wozu du den Cursor bei einem Klick ausschalten willst.
Du kannst auch die BigInteger-Klasse von J# verwenden. Die ist bei jedem Framework dabei.
Zumindest im WinAPI war es so, dass der Cursor nur angezeigt wird, wenn genauso oft Show wie Hide aufgerufen wurde. Ich vermute, dass dieses Verhalten sich daher auch im Framework zeigt.
Ich würde beim Vergleich sämtliche alphanumerischen Zeichen entfernen. Auf ein solches Zeichen folgende Nullen werden auch entfernt. dadurch erhältst du die reine Nummer. Das einzige, was dann noch Probleme bereitet, sind gleiche Telefonnummern, die sich nur in der Angabe der Vorwahl unterscheiden (beispielsweise +49(030)12345678 zu 03012345678). Dieses Problem kann man ohne Liste der gültigen Vorwahlen kaum umgehen.
public string ConvertToComparablePhoneNumber( string PhoneNumber )
{
StringBuilder Converted = new StringBuilder( PhoneNumber.Length );
bool RemoveZero = true;
for( int i = 0; i < PhoneNumber.Length; i++ )
{
if ( Char.IsDigit( PhoneNumber, i ) )
{
if (PhoneNumber[i] == '0')
{
if (!RemoveZero)
{
Converted.Add( PhoneNumber[i] );
}
}
else
{
Converted.Add( PhoneNumber[i] );
RemoveZero = false;
}
}
else
{
RemoveZero = true;
}
}
return Converted.ToString();
}
Nachricht von sarabande vom 09.05.2007 21:14:44
Keyboardevent greift nicht oder lässt sich nicht auflösenZitat:
Original von Borg
@sarabande: Bevor du jetzt mit Windows Messages ankommst:
Lies doch bitte mal einen Thread durch, bevor du postest. megamacy möchte einen (mit Steuerung behafteten) Mausklick auf eine bestimmte Koordinate in einem DirectX-Spiel simulieren. Also vermutlich in irgendeinem Spiel cheaten. Und das funktioniert nicht so wie gedacht.Wenn mit der Koordinate (x/y) kein Ereignis verknüpft ist, kann es auch nicht fünktionieren. Voraussetzung ist auch, dass man SendInput, keybd_event, mouse_event oder SendMessage mit VK_* korrekt implementiert.
Zitat:
EDIT: Und nachdem du wegen bunt und fett und groß (vermutlich) eine Verwarnung bekommen hast, arbeitest du jetzt mit Asterik und Gänsefüßchen und der gleichen Aggressivität.@Borg - ich mag dich auch nicht!
Wenn Test mehrmals vorkommt macht das nichts, da ist vorgesorgt.
Diese Aussage verstehe ich nicht. Wenn du ein eindeutiges Trennzeichen hast, reicht ein simples:
string[] blocks = File.ReadAllText( dateiname ).Split( trennzeichen );
string[][] inhalt = new string[][blocks.Length];
for( int i = 0; i < blocks.Length; i++ )
{
inhalt[i] = blocks[i].Split( '\n' );
}
um das ganze zu splitten.
Meinst du mit deiner Aussage, das Test kein zulässiges Wort in der Beschreibung ist?
Diese Variable enthält nach der Zuweisung die Referenz
In diesem Fall ja nicht, da int. Daher enthält id eine eigenständige Kopie des Wertes und Synchronisation ist nicht erforderlich.
Da "Test" ein Wort ist, das auch einfach so im Text stehen kann, würde ich den Text von Hand splitten. Es wäre trotzdem empfehlenswert, ein anderes Trennzeichen zu verwenden.
@f.ritz:
Nein, da die Methode in jedem Thread eine eigene lokale Variable id hat.
Sehe ich ähnlich wie herbivore. Sprich doch mal mit den Chefs über die finanziellen Möglichkeiten, die sich dir bei der anderen Firma bieten.
Sie können nur auf drei Arten reagieren:
Auf jeden Fall solltest du dich nicht einfach so wegschleichen, sondern offen und ehrlich darüber reden.
Ich habe noch nie mit C# programmiert
Dann vergiss dein Projekt erst mal und fang an kleine Brötchen zu backen.
Und jeder Programmierer muss traditionell mit einem Hello-World-Programm beginnen...
Nun ja, die angegebenen Namen sprechen ja sehr deutlich aus, wofür sie verwendet werden.
Da die Runtime die Threads nur erzeugt, wenn sie auch benötigt werden, ist es logisch, dass sie nicht automatisch in jeder Applikation laufen.
Trotzdem bitte keine Crossposts.
Sorry, wenn ich dir mit diesen beiden Sätzen auf den Schlips getreten bin. Das war sicherlich nicht persönlich gemeint.
In deinem Ursprungspost klang es so, als ob du dir den Code nicht anschauen möchtest. Und auf diese Einstellung bezogen sich auch die beiden Zeilen.
Nur wenn du dir den Code angesehen hast und bis FormEx vorgedrungen bist, wieso hast du dann nicht einfach nachgefragt, was dort passiert?
Das hätte wahrscheinlich immer noch schneller zu Antworten geführt, da man als Antwortender nicht gezwungen wäre, den Code zu durchsuchen.
Als Beispiel könnte ein Downloadmanager dienen.
Diese lädt mehrere Dateien herunter und zeigt den Fortschritt in einem ListView an. Dann könnte man beim Start des asynchronen Downloads das zugehörige ListViewItem übergeben.
Der Download-Progress-Handler kann dann einfach im "mitgelieferten" ListView den Fortschritt ausgeben, ohne wissen zu müssen, was da eigentlich getan wird.
Noch deutlicher kann ich es dann fast nicht mehr beschreiben.
Wie wäre es mit einem Doppelklick auf die Spalte?
Ist ja auch nur eine deutlich erweiterbare Grundidee. Man kann ja trotzdem bestimmte Exceptions abfangen, indem man einfach spezifischere catch-Blöcke davor hängt.
Das Problem bei den ganzen asynchronen Methoden ist ja, dass du prinzipiell mehrere davon gleichzeitig ausführen kannst. Im Normalfall benutzen diese aber alle den gleichen Progress- bzw. Completed-Handler. Nur woher soll der Handler dann wissen, für welchen Transfer er jetzt aufgerufen wurde?
Ganz einfach: durch das beliebige Objekt, das allen async-Methoden mitgegeben werden kann. Das könnte zum Beispiel eine ID sein. In deinem Fall halt einfach ein String.
Dann schreib eine statische Klasse, der du die Exception übergibst und eventuell noch weitere Informationen.
Die Klasse entscheidet dann, wie welche Exception angezeigt werden soll.
Damit hast du den Code nur einmal und ansonsten in jedem try-catch nur den Aufruf der statischen Methode.
Also:
try { ... }
catch( Exception ex )
{
ExceptionHandler.Handle( ex );
}
// und
internal static class ExceptionHandler
{
public static void Handle( Exception ex )
{
switch( ex.GetType() )
{
case typeof(DivideByZeroException):
// ...
break;
case typeof(ArithmeticException):
// ...
break;
// ...
default:
// ...
break;
}
}
}
Am besten ist es, wenn du jede Zahl als einzelne Zeile schreibst und dann auch so wieder einliest.
List<int> Zahlen = ...
// schreiben
using ( StreamWriter writer = new StreamWriter("datei1.txt") )
{
foreach( int Zahl in Zahlen )
{
writer.WriteLine( Zahl.ToString() );
}
writer.Flush();
writer.Close();
}
// lesen
using ( StreamReader reader = new StreamReader("datei1.txt") )
{
while (!reader.EndOfStream)
{
int Zahl = 0;
if( int.TryParse( reader.ReadLine(), Zahl ) )
{
Zahlen.Add( Zahl );
}
}
reader.Close();
}
Ok, hatte ich überlesen.
ABER:
Das Durchsuchen des Codes hat zehn Minuten gedauert. Runterladen, in VS öffnen, ein Form mit dem gewünschten Verhalten finden und dann in der Vererbungshierarchie immer weiter hinauf, bis man bei der Klasse FormEx ankommt.
Dort sieht man, dass die Klasse, immer wenn das Form deaktiviert wird, per SendMessage die Nachricht WM_NCACTIVATE mit wParam gleich 1 an das eigene Fensterhandle schickt. Laut Platform-SDK gibt der Parameter wParam dieser Nachricht an, ob der NC-Bereich des Fensters sich als aktiv (wParam == 1) oder inaktiv (wParam == 0) zeichnen soll.
Das ist also das ganze Geheimnis.
Und hat nicht länger gedauert als das Posten solch langer Texte.
Mit welcher IDE arbeitest du denn? Dann können wir dir auch besser helfen.
Bitte Posts vor dem Antworten lesen.
@Lara88:
Unterhalb des Projektmappenverzeichnisses hat jedes Projekt einen eigenen Ordner. Diesen kannst du einfach kopieren und die enthaltende .csproj-Datei öffnen.
Vermutlich Microsoft.Win32.SystemEvents.TimeChanged.
Ein klassischer Fall für's Openbook - Vergleichsoperatorn sind wirklich unterste Grundlagen.
Eher ein Vertipper für Syntaxfehler selbst lösen (Compilerfehlermeldungen)
Entweder - wie mitti schrieb - zyklisch alle Prozesse prüfen oder Reaktion auf das Öffenen eines Programms, aber wie?.
Hast du auch das probiert, was herbivore oben schrieb?
Wenn es sich nur um Polynome handelt, kannst du einfach die Koeffizienten in einem Vektor (double[]) abspeichern.
Aus f(x) = ax² + bx + c wird dann double[] f = new double[] { c, b, a }.
Bei einer geraden Funktion sind dann alle ungeraden Indize 0, bei einer ungeraden Funktion entsprechend alle geraden.
Berechnen mittels Horner-Schema:
public double Calculate( double[] polynom, double x )
{
double y = 0.0;
for ( int i = polynom.Length - 1; i >= 0; i-- )
{
y *= x;
y += polynom[i];
}
return y;
}
Empfehlenswert ist dann natürlich eine eigene Klasse Polynom, welche die Berechnungen als Methoden implementiert.
Zum Zeichnen benutzt du einfach eine PictureBox und setzt das Koordinatensystem mittels Graphics.TranslateTransform und skalierst mittels Graphics.ScaleTransform.
Du könntest über die WinAPI dem Button einen neuen Text zuweisen.
Allerdings
Wegen des Textes in einem Button wäre der Aufwand denke ich nicht gerechtfertigt.
Zumal sich die Bedeutung des Buttons nicht ändert.
Da du die externe Anwendung ja sicherlich per Process startest, wäre es naheliegend gewesen, dort auch zu suchen => Process.ExitCode
Paint .NET ist doch Open Source => Code.
Ich hab in einem Programm ... das Gefühl, dass float nicht genau genug ist
Nur ein Gefühl oder Gewissheit? PointF wird ja nur bei der Ausgabe verwendet. Und wozu du dort mehr als 53Bit Genauigkeit brauchst ist mir etwas schleierhaft.
Du konvertierst erst nach der Division in einen float. Das bringt dann aber nichts mehr. Konvertiere vor der Division.
Wenn du alle structs jeweils mit LayoutKind.Explicit definierst, sollte es eigentlich gehen.
Dann ist offensichtlich das klassische Startmenü eingestellt.
Aber warten wir es einfach ab, ich vermute, Sp666dy wird uns an Kreativität überraschen.
@herbivore:
Da bringt doch nichts. Jetzt kommt gleich die Antwort, dass es im Startmenü kein Einstellungen gibt, da Sp666dy Windows XP und nicht wie du 2000 bnutzt...
Du musst sie ja nicht komplett einlesen. Es ist jedoch das flexibelste, wenn du an beliebiger Stelle Zeilen einfügen willst.
Ich frage mich nur gerade, ob es wirklich sinnvoll ist bei Daten, die in der Steinzeit liegen (so ca. 10000 Jahre her), über Monat und Tag zu reden...
Gerade mathematische Berechnungen mit single oder double sollten aber nicht durchgeführt werden, da diese auf die FPU ausgelagert werden und der Thread während der Bearbeitung blockiert wird.
Ansonsten kannst du doch einfach eine while-Schleife benutzen, die eine boolesche Variable testet. Dann brauchst du diese bloß auf false setzen und der Spuk hat ein Ende...
Für solche Fälle nicht den Timer aus System.Windows.Forms sondern den aus System.Threading verwenden. Der läuft unabhängig vom GUI (weil nicht über die MessageLoop).
WMI, Klasse Win32_Service, Property StartMode
Und wer soll dann entscheiden, wann welcher Wert zu verwenden ist?
Kurz gesagt: Nein.
da muss ich allerdings aufpassen dass die nutzdaten nie größer als 256 bytes sind
Wie kommst du denn darauf? Diese Einschränkung hat der Code nicht.
Aber du hast insofern Recht, als dass das Array sehr unübersichtlich ist.
Daher könntest du auch eine Liste verwenden, in der die erlaubten Zeichen eingetragen sind.
Allerdings muss dann bei jedem Zeichen (Byte) die Liste durchsucht werden, was die Laufzeit deutlich erhöht.
Und um ein derartiges Array von bool zu erstellen, kannst du dir ja eine eigene kleine Hilfsmethode schreiben. Es hat ja niemand verlangt, dass du das von Hand machst.
Du könntest mit den FileWatcher schauen wann auf die msn.exe zugeriffen wird.
Ein Lesezugriff bedeutet aber nicht, dass sie auch gestartet wird (Virenscanner, Dateieigenschaften u.v.a.). Daher hilft das nur bedingt.
@Sp666dy:
Es hilft nun mal alles nichts. Entweder gibst du dir mehr Mühe oder du machst weiter wie bisher und hoffst, dass sich immer welche finden, die dir Code anbieten. Ich würde mich nicht drauf verlassen.
Du hast jetzt zwei Lösungswege vorgestellt bekommen. Entweder kontrollierst du regelmäßig alle Prozesse oder du lässt Windows den Start loggen und rufst das Log ab. Der einfachere Weg ist sicherlich der erste. Daher: setz deinen A... in Bewegung und versuch das auf die Beine zu stellen. Letztendlich ist es ja bloß eine Schleife in einem Timerhandler.
Nein, die ProcessStartInfo sind wirklich nur Framework intern zum Starten gedacht, d.h. sie reflektieren keine Eigenschaften existierender Prozesse.
Daher: WMI, Klasse: root\CIMV2\Win32_Process, Property: CommandLine
Hau doch mal alle Daten der CDs auf eine DVD. Direkt jede CD-Root in die DVD-Root. Zumindest getrennt sollte es bei den beiden Installations- und den drei Doku-CDs gehen.