Vor ein paar Tagen trat der Fehlercode bei mir auf, weil der Pfad/die Datei nicht existierte. Prüfe das einmal nach, ob auf dem Server diese wirklich existiert.
@Coffeebean:
Kann Path.Combine auch / statt \ kombinieren? Wenn bei einem Linux-FTP das Backslash verwendet wird, kommt es da nicht "erst recht" zum Fehler?
A) Du musst dir die Variable i merken, möglicherweise über eine eigens angelegte Eigenschaft in der Form. Gib ihr aber einen schöneren Namen. Vielleicht soetwas, wie "ResultCount".
B) Im Click-Event des Buttons erstellst du nun 10 mal eine Schleife durchlaufen. Das geht am schönsten mit der FOR-Schleife. Wenn du aber die while-Schleife verwenden willst: Geht auch. [i = 0; while(i < 10)]. Nun prüfst du noch vorher, ob ResultCount < 100 ist. Wenn nicht, dann soll die Schleife nicht ausgeführt werden.
Hallo, das sollte man eigentlich beim Erlernen der Grundlagen wissen.
Ich gebe dir trotzdem einen Hinweis:
Bitte erstelle nicht für jedes Szenario eine If-Else-Struktur. Das führt schnell zu Fehlern und ist weder schön noch wartbar.
Erstelle eine Klasse Auto. Dieser Klasse schenkst du noch ein paar Properties, wie z.B. Länge, Farbe (am Besten machst du hierfür eine
List<String>
mit verfügbaren Farben), Preis...
Dann benutzt du den XML-Serializer, um ausgefüllte Auto-Objekte abzuspeichern und bei Programmneustart wieder in das Programm zu laden. Mit dem XML-Serializer kannst du auch eine Liste verarbeiten.
So kannst du dann ganz einfach während dem Programmlauf ein Fenster öffnen, bei dem du ein neues Auto-Objekt aus den Daten eines Dialogs füllst und der Liste hinzufügst.
Bitte mache dich zunächst mit den Grundlagen vertraut. Sollte es wirklich hirgendwo haken, werden wir dir sicher weiterhelfen.
Vielleicht ist das BrowsableAttribute das, was du suchst. Dann wird es im PropertyGrid nicht mehr angezeigt.
Anschließend könntest du die Size-Eigenschaft überschreiben und bei dem get-Accessor einen statischen Wert übergeben lassen.
In etwa so:
public override Size Size {
get {
return new Size(100, 100);
}
set {
// Do nothing
}
}
[Edit]Es ist natürlich richtig, was herbivore schreibt. Ganz klar! Habe nicht dran gedacht, nachzuforschen, welches die tiefste Ebene der Size-Setzung ist. Diese sollte man natürlich überschreiben![/Edit]
a) Konzept überdenken
a,1) Threading verwenden a,2) Nur wirklich die GUI aktualisieren, wenn neue Daten vorhanden.
a,3) Vielleicht könntest du die Nachrichten als JSON oder XML übertragen.
a,3) Online_Liste.ForeColor = Color.ForestGreen in einer for-Schleife ist unglücklich; Einmal vorher reicht.
b) Schimpfwortfilter: Regex.Replace mit Option IgnoreCase verwenden. Das Word fUCk würde bei dir nicht gefiltert werden.
b,2) Natürlich in eine Methode auslagern.
b,3) Besser: Schimpfwortfilter Serverseitig einbinden
Ich arbeite derzeit an einer Bibliothek, die einen Pool zur sequenziellen Abarbeitung von gleichen Folgen anbietet. Der Pool wird alle Aktionen hintereinander ausführen, sobald Run(); aufgerufen wurde.
Eine Parallelisierung soll demnächst folgen.
Vorgehensweise zum Verstehen des Projekts:
Man erstellt ein Objekt "BackgroundAction<TParam, TResult>". TParam ist dabei der Typ, der als Übergabeparameter an die Methode übergeben wird. TResult ist der Typ, der die Methode zurückgibt.
So kann man z.B. eine Massenverarbeitung von Bildern (Thumbnail-Creating) einfach in einen anderen Thread ausgelagert werden.
Jede Aktion triggert ein Event, das das Resultat (return) der Methode besitzt. Das ermöglicht, die Thumbnails z.B. in einer Form direkt anzuzeigen.
Beispiel zu einer Abfolge, die true oder false ausgibt:
Kann zum Beispiel verwendet werden, um eine Datenbank zu installieren, mehrere Dateien aus dem Internet herunterzuladen, usw.
False soll ausgegeben werden, wenn die Aktion eine Exception geworfen hat. Diese kann dann im OnDone-Event verarbeitet werden. Achtung: Nicht im Beispiel implementiert.
Assert.IsNotTrue(e.Success == true);
class VariousActionWithResult : BackgroundTask.BackgroundAction<Action, bool> {
/* Standard-Konstruktoren */
}
class ActionSuccessPool : BackgroundTask.BackgroundActionPool<Action, bool> {
}
private IEnumerable<VariousActionWithResult> CollectThingsToDo() {
List<VariousActionWithResult> ret = new List<VariousActionWithResult>();
// generate actions
var openDb = new VariousActionWithResult(Do, DummyAction)
{
StatusText = "Opening database"
};
/* ... */
ret.AddRange(new List<VariousActionWithResult>()
{
openDb,
/* ... */
});
return ret;
}
// Beispielcode
ActionSuccessPool pool = new ActionSuccessPool();
foreach (var actionToDo in CollectThingsToDo()) {
actionToDo.OnDone += actionToDo_OnDone;
pool.Add(actionToDo, actionToDo.StatusText);
} // foreach end
pool.OnNextProgress += pool_OnNextProgress;
pool.OnAllDone += pool_OnAllDone;
pool.Run();
WaitAllDone.WaitOne();
Ich bin mir bewusst, dass das .Net Framework 4.0 ebenfalls eine Möglichkeit bietet, solche Algorithmen zu lösen. Doch ich wollte einen Pool haben, der weiter ausgebaut werden soll.
ich lasse eine Datei von A nach B senden. Dabei möchte ich die Datei in kleine Parts schicken können. Das muss aber in Parts geschehen, da es ja die berüchtigte 65535 gibt.
Hierzu habe ich eine Klasse geschrieben, die Part, Parts und Data enthält. Alle Parts zusammen und hintereinander sollen dann eine gültige Datei ergeben.
Zum Senden wird die Klasse serialisiert. Empfangen wird dann folgendes: (Das ist der Encoding.Default.GetString( ) - Output)
Dies steht dann hintereinander in einem byte[].
Nun möchte ich, dass ich an jedes einzelne <SecureMessage>..</SecureMessage> herankomme, um dieses anschließend deserialisieren zu können. Als Idee zum Patternsearching hatte ich ein START_OF_PACKET und END_OF_PACKET, die hier nun ########## sind. Aber damit bin ich leider überhaupt gar nicht weitergekommen.
Frage: Wie kann ich ein byte-Array "exploden/splitten"?
Du kannst in der Program.cs vor Application.Run die Application.ThreadException abonnieren und dann loggen.
Ist nicht das schönste, aber so kommt man oft einfach an den StackTrace von unbekannten fehlerhaften Codestellen (, die nicht vorkommen sollten :)).
ich möchte einen Ball in einem 2 Dimensionalen Koordinatensystem von Punkt A (Start) nach Punkt B (End) bewegen.
Dafür habe ich eine Klasse geschrieben, die eine lineare Liste von Punkten zwischen Start und End berechnen soll.
Derzeit lasse ich jeden Punkt soweit inkrementieren/dekrementieren gehen, bis End.X und End.Y erreicht sind. Das ist natürlich nicht linear.
Nun, ich könnte eine Funktion aus 2 Punkten finden. Dazu benötige ich aber ein lineares Gleichungssystem, das ich programmatisch "solven" müsste.
Leider bieten mir Bibliotheken wie MathNet/MathLib usw. unzureichende Dokumentationen und Tutorials zu diesem Thema.
Könntet Ihr mir vielleicht ein wenig auf die Sprünge helfen?
Ich verstehe kein Wort...
Du möchtest eine Webseite auslesen, die erst Zutretbar ist, wenn man sich dort vorher angemeldet hat?
Hier eine Idee, die möglicherweise illegal ist. Das musst du auf der Webseite nachlesen, ob das Anmelden und verwenden der Seite via Crawlern, Bots, etc. erlaubt ist. Wenn du Glück hast, gibt es eine API.
Du sendest einen HTTP-POST-Request an die Anmeldeseite (möglicherweise login.php). Als POST-Parameter sendet du alle erforderlichen Anmeldedaten.
Anschließend erhälst du von der Seite Cookies, darunter auch die PHPSESSID.
Anhand der in diesem Cookie abgespeicherten Sitzungs-Nummer wird ein angemeldeter Benutzer erkannt.
Anschließend kannst du einen HTTP-Request mit der PHPSESSID senden und solltest statt eine "Zugriff verweigert"-Seite die gewünschte Seite sehen.
Okay... Ich denke, dass du dann einen PDF-Reader für .NET brauchst, der die Bilder herausfiltert.
Diese Bilder kannst du dann, unabhängig vom PDF "Text-Erkennen lassen".
Zum ersten kann ich dir keinen Tipp geben.
Am besten ist, wenn du dir für die OCR-Library selbst ein Bild machst:
ich platze ja ungern in die Programmier-Künste, um eine Festplatte am laufen zu halten, aber du solltest unter den Energieoptionen (erweitert) folgendes Fenster mit diesem Eintrag finden:
Weil die Anzeige von Fehlern im Browser abgeschaltet ist, während es im .NET-Control standardmäßig eingeschaltet ist.
Du kannst es einfach abschalten.
Zum Wrapper: Du kannst ja testen, ob es die selben Elemente sind, indem du einen Rechtsklick machst. Da siehst du in beiden Fällen ein identisches Menü.
Nettes Tool. Daraus lässt sich sicher auch ein eigenes Archivformat machen.
Die Source ist relativ übersichtlich. Vielleicht sollte man noch so etwas, wie das Speichern eines "ExeJoiner"-Projekts zum nachträglichen Bearbeiten von ExeJoiner-Dateien...
Schau mal im Task-Manager, ob zu dem Zeitpunkt der Fehlermeldung deine ${Output}.(vshost.)exe zu finden ist.
Da wird wahrscheinlich das Problem liegen.
Es ist aber Möglich, dass es eine andere Datei ist, auf welche das Programm zugreifen möchte.
Dass er die Datei neuschreiben will, wenn du einen Code änderst - ist klar... Und wenn die Datei noch läuft und dies dann nicht geht - ist ebenfalls klar.
Wenn du F5 drückst und nach dem letzten Debugging kein Code verändert wurde, wird auch nicht neu kompiliert.
Wenn ein Objekt mit einer bestimmten ID bei ungeladenen Inhalten "NULL" oder halt leer ist, könntest du in einem Extra-Thread mit einer Schleife prüfen und dann ein Event (invoked) auslösen, wenn der Inhalt verändert wurde.
So würde ich es, denke ich, lösen. Vielleicht gibt es aber auch noch eine schönere Variante.
Mach mal lieber einen Screenshot vom nicht-Erfolg der Installation... Was genau hindert dich an der Installation? Geht der "Weiter"-Button nicht? Gib uns mal mehr Input!
Okay... source.Count<TElement>() als 2. Parameter in new Random sollte eh iCount werden - aber das tut ja nichts zur Sache. 2 sind's trotzdem :D
// Edit
Schwierige Sache. Ich habe eine 2. Idee gehabt: Erst OrderBy Random (1 Durchlauf) - und dann das erste Element [0] durch ToList() returnen. Bei Fehler eben throw Excption - aber ich denke: ToList() läuft die IEnumerable ein zweites Mal durch. Oder?
Würde so aussehen:
public class TElement { public int Index = 0; }
internal class Program {
private static Random m_objRand;
private static void Main () {
List<TElement> source = new List<TElement>();
source.Add(new TElement() { Index = 0 });
source.Add(new TElement() { Index = 1 });
source.Add(new TElement() { Index = 2 });
source.Add(new TElement() { Index = 3 });
source.Add(new TElement() { Index = 4 });
for (int i = 0; i < 2; i++) {
TElement rand = PickRandom(source);
Console.WriteLine(rand.Index);
} // for end
}
public static TElement PickRandom (IEnumerable<TElement> source) {
if (m_objRand == null) m_objRand = new Random();
try {
return source.OrderBy(obj => m_objRand.Next()).First();
} // try end
catch {
throw new Exception();
}
}
}
// Edit 2: Hab die Lösung! Man benötigt nicht "ToList()" - man kann auf die Methode First() zurückgreifen :)
private static Random m_objRand;
public TElement PickRandom (IEnumerable<TElement> source) {
if (m_objRand == null) m_objRand = new Random();
int iCount = source.Count<TElement>();
if (iCount == 0) throw new Exception("COUNT darf nicht 0 sein.");
int iIndex = 0;
int iRandomObjectIndex = m_objRand.Next(0, source.Count<TElement>());
foreach (TElement obj in source) {
if (iIndex == iRandomObjectIndex) {
return obj;
} // if end
iIndex++;
} // foreach end
return null;
}