Hallo herbivore,
danke für deine Antwort. Es scheint ja tatsächlich an dem Control zu liegen.
Ich habe das ganze auch schon mit einem neuen Projekt ausprobiert, was zu genau derselbe Situation führt. Der Fehler ist also reproduzierbar. Ich werde es noch auf anderen PCs bzw. mit anderen Visual Studio Versionen testen.
Mir war noch nicht klar, dass man für manche Exceptions Events abonnieren kann, das werde ich mir mal ansehen. Möglicherweise gibt das ja Aufschluss.
Zur Not ersetze ich die ComboBoxes durch ListViews (bzw. ObjectListViews). Ich habe eh genug Platz auf der Form und hätte den Vorteil, dass man alle Optionen auf den ersten Blick sieht und nicht erst die ComboBox aufklappen muss.
Wenn du die Referenz mit "this" übergibst, ist es keine Kopie, sondern die tatsächliche Referenz. Das muss funktionieren. Arbeitest du auf irgendeine Art mit Strukturen? Die werden nämlich tatsächlich als Kopie übergeben.
Vlt. kannst du ein paar Code-Ausschnitte posten?
Hallo allerseits,
ich möchte mit System.Speech eine Spracherkennung in mein Programm einbauen. Sobald ich eine ComboBox auf die Form ziehe, erscheint beim Start des Programms mehrfach folgende Fehlermeldung in der Ausgabe:> Fehlermeldung:
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.COMException" ist in System.Windows.Forms.dll aufgetreten.
Ohne die ComboBox treten keine Exceptions auf. Bei der ListBox sowie der CheckedListBox tritt dieses Problem übrigens auch auf.
Der debugger hält standardmäßig nicht bei dieser Exception. Ohne Debugger wird das Programm ebenfalls weiter ausgeführt. Allerdings möchte ich gerne ein möglichst fehlerfreies Programm haben, zumal die Exceptions bei anderen von mir getesteten Controls nicht erscheinen.
Wenn ich den Debugger beim Auftreten von System.Interop.COMExceptions halten lasse, stoppt er im Aufruf von Application.Run(..) mit den wenigen Informationen aus der Exception:> Fehlermeldung:
Message: Mitglied nicht gefunden. (Ausnahme von HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
Error Code: -2147352573
Eine InnerException existiert genau so wenig wie ein StackTrace.
Kennt jemand dieses Problem oder weiß, wie man es weiter debuggen oder behandeln kann?
Der Source-Code (auf der Form befindet sich lediglich die ComboBox bzw. andere Steuerelemente zum Testen):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private SpeechRecognizer _sr;
private GrammarBuilder grammarBuilder;
private Grammar commandGrammar;
private Choices _commands;
private void Form1_Load(object sender, EventArgs e)
{
_commands = new Choices();
_commands.Add("blau");
_commands.Add("rot");
_commands.Add("grün");
grammarBuilder = new GrammarBuilder(_commands);
commandGrammar = new Grammar(grammarBuilder);
_sr = new SpeechRecognizer();
_sr.LoadGrammar(commandGrammar);
_sr.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_sr_SpeechRecognized);
_sr.Enabled = true;
}
private void _sr_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
Debug.WriteLine(e.Result.Text);
}
}
Hallo gfoidl,
vielen Dank für die Antwort. Ohne Debugger wird die Exception wie erwartet abgefangen.
Unter Debuggen->Ausnahmen.. war bereits eingestellt, dass der Debugger nicht unterbrechen soll, wenn die entsprechende Ausnahme ausgelöst wird. Erst das entfernen des Hakens in der Spalte "Vom Benutzercode unbehandelt" führte dazu, dass der Debugger nicht anhält.
Ich habe auch probiert, die Exception abzufangen und eine "normale" Exception weiter zu werfen, selbst bei dieser Exception hält der Debugger an.
In der Aufrufliste kann ich sehen, dass zwischendurch externer Code ("[Externer Code]") aufgerufen wird, bei dem es sich um die Methode Deserialize vom XmlSerializer handelt.
Es sieht so aus, als ob die Exception nicht durch diesen externen Code gereicht würde. Gibt es dafür auch eine Einstellung?
Hallo,
ich implementiere die Methode ReadXml des Interfaces IXmlSerializable. Hierdurch soll ein Objekt mit dem XmlSerializer aus einer XML-Datei heraus deserialisiert werden.
Zur Laufzeit auftretende Fehler (z.B. unvollständige XML-Datei) werden allerdings nicht zu XmlSerializer.Deserialize(..) weitergereicht, sondern der Debugger stoppt direkt in der Methode XmlRead, in welcher der Fehler auftritt.
Existiert eine Möglichkeit, die Exceptions weiterzuleiten? Oder wie sieht eine korrekte Implementierung von ReadXml aus?
Methode zum Deserialisieren:
try
{
var xs = new XmlSerializer(typeof (Person));
using (var sr = new StreamReader("person.xml"))
{
_person = (Person) xs.Deserialize(sr);
}
// ...
}
catch(Exception ex)
{
// hier kommt keine Exception aus ReadXml an!
MessageBox.Show(ex.Message);
}
Beispielklasse (irrelevante Methoden entfernt):
public class Person : IXmlSerializable
{
public string Name { get; set; }
public int Age { get; set; }
public void ReadXml(XmlReader reader)
{
reader.MoveToContent();
bool isEmptyElement = reader.IsEmptyElement;
Name = reader.GetAttribute("Name");
// ## wenn das Alter nicht zu parsen ist, stoppt der Debugger in der folgenden Zeile
Age = int.Parse(reader.GetAttribute("Age"));
reader.ReadStartElement();
if (!isEmptyElement)
{
reader.ReadEndElement();
}
}
}
Zunächst ein sehr gutes (leider kommerzielles) Programm: http://www.efsoftware.com/d3/d.htm
Zum Suchen von Elementen in großen Listen gibt es diverse schnelle Suchverfahren wie die Interpolationssuche
Eine Idee wäre noch der Abgleich mit Internetdatenbanken, um Rechtschreibfehler unterbinden zu können, was allerdings sehr lange dauern würde;)
Ich nehme an, dass du nicht das komplette Programm als Konsolenanwendung schreiben möchtest?
Du könntest auch eine Form erstellen, die ein RichTextField oder ein ListView oder dergleichen enthält, um die Funktion der Konsole nachzubilden. Der Vorteil liegt in der Erweiterbarkeit.
Edit:
Die Konsole kann glaube ich auch nicht so viele Sonderzeichen (Unicode)...
Man könnte z.B. für jede "Ansicht" ein UserControl erstellen und das jeweilige in der Form anzeigen bzw. verstecken. Benutzereingaben bleiben so erhalten.
Alternativ gibt es diverse "Wizard"-Controls im Netz, die z.B. so wie der Windows-Installer aussehen könnten.
Hi words_sourcecode,
das Problem hatte ich damals auch mal, allerdings konnte ich es gerade nicht reproduzieren.
Versuche es doch einmal mit einer if-Abfrage (wbBrowser.Document != null) um den switch-case-Teil herum.
Hi Gege, erfolgt der Aufruf der Routinen aus den Tabitems direkt, asynchron (in einem neuen Thread) oder durch den Benutzer?
Warum greifst du nicht direkt auf die Controls zu?