Laden...

[gelöst] COMException bei prozessübergreifendem Drag N Drop

Erstellt von tonka vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.397 Views
tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren
[gelöst] COMException bei prozessübergreifendem Drag N Drop

Hy@all,

ich habe ein interessantes Problem mit Drag N Drop. Ich habe in meinem Programm Drag N Drop realisiert. Man kann in zwei (oder beliebig viele) Fenster (gleiche Klasse) Dateien laden (das Programm ist eine Art Viewer) und dann das eine Fenster auf das andere droppen. Wenn die Fenster-Instanzen innerhalb einer Programm-Instanzen laufen scheint es zu funktionieren. Start ich jedoch zweimal die exe und Droppe das eine Fenster auf das andere, so bekomme ich folgende Exception> Fehlermeldung:

COMException wurde nicht von Benutzercode behandelt
Ungültige tymed (Ausnahme von HRESULT: 0x80040069 (DV_E_TYMED))

Und hier ist meine Implimentierung:


private void LDV_DragOver(object sender, DragEventArgs e)
        {
            if (!e.Data.GetDataPresent(typeof(Matrix2D)))
            {
                e.Effects = DragDropEffects.None;
                //e.Handled = true;
            }

        }

private void LDV_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(LightMatrix2D)))
            {
                Matrix2D DroppedMatrix = e.Data.GetData(typeof(Matrix2D)) as Matrix2D; // hier kommt die Exception
                if (DroppedMatrix == null)
                {
                    MessageBox.Show("Could not recive dropped matrix");
                    return;
                }
                if (DroppedMatrix == this.LDV.Matrix)
                {
                    return;
                }
                _DroppedMatrix = DroppedMatrix;
                CMOperations.IsOpen = true;
            }
        }

Weiß jemand warum das passiert?

MfG
Tonka

731 Beiträge seit 2006
vor 13 Jahren

Hast Du die Exception denn schonmal abgefangen?

Mfg
wax

tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

Nein, was soll das ändern??

731 Beiträge seit 2006
vor 13 Jahren
tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

Naja, bin mir nicht sicher ob mir das weiterhilft. Vielleicht muss ich das Object COM-fähig machen, damit ich das tun kann!?

731 Beiträge seit 2006
vor 13 Jahren

Also was ich nach dem Überfliegen der Texte sagen würde: deine Matrix2D - Klasse sollte wohl IDataObject implementieren.

MfG
wax

tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

Das habe ich mir auch schon gedacht. Das werde ich in den nächste Tagen einmal in einer Testapplikation testen.

5.299 Beiträge seit 2008
vor 13 Jahren

wie startest du denn das dragging?

und mir fällt auf, dass du mal "Matrix2D" benennst, mal "LightMatrix2D".

Der frühe Apfel fängt den Wurm.

tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

und mir fällt auf, dass du mal "Matrix2D" benennst, mal "LightMatrix2D".

Mein Fehler, Matrix2D ist die Basisklasse - habs korrigiert, ändert aber nichts!

wie startest du denn das dragging?


        private Point RightMouseButtonDownLastPosition;

        private void UserControl_MouseMove(object sender, MouseEventArgs e)
        {
            if (!IsActive)
            {
                return;
            }
            if (e.LeftButton != MouseButtonState.Pressed || e.RightButton != MouseButtonState.Pressed )
            {
                return;
            }
            Vector diff = RightMouseButtonDownLastPosition - e.GetPosition(null);
            if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
                Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
            {
                DataObject dragData = new DataObject(typeof(Matrix2D), Matrix);
                DragDrop.DoDragDrop(this, dragData, DragDropEffects.Move);
            }

            
        }

        private void UserControl_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            RightMouseButtonDownLastPosition = e.GetPosition(null);
        }

MfG

5.299 Beiträge seit 2008
vor 13 Jahren

sieht mir voll korrekt aus. ausser dassich diese Abfrage

    if (e.LeftButton != MouseButtonState.Pressed || e.RightButton != MouseButtonState.Pressed )
            {
                return;
            }

dahingehend verstehe, dass du das dragging nur startest, wenn beide maustasten gehalten werden?

Also was ich nach dem Überfliegen der Texte sagen würde: deine Matrix2D - Klasse sollte wohl IDataObject implementieren.

dem stimme ich nicht zu.
Du verwendest ja schon ein DataObject, und das implementiert ja IDataObject sicherlich korrekt. IDataObject soll ermöglichen, Daten aufzunehmen, die Daten selbst müssen nichts implementieren.

Aber ich habe eine andere Idee: Ist deine Matrix2D eine Referenz-Klasse? Dann nimmt das DataObject einen Verweis auf die Matrix2D auf, und das funzt vmtl. nicht, wenn der Verweis dann auf eine Matrix2D verweist, die in einer anderen Anwendung instanziert ist.

Du müsstest also die Werte deiner Matrix mw in ein (2dim?)Array schreiben, das Array verschicken, und bei Empfang daraus eine neue Matrix instanzieren.
Kannst natürlich auch was mit Serialisierung machen, k.a., was einfacher ist.
Array ist übrigens auch ein VerweisTyp, aber ich glaub, das kann DataObject handeln (sicher binnichnich).

gugge evtl Wert- und Verweistypen

Der frühe Apfel fängt den Wurm.

tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

dahingehend verstehe, dass du das dragging nur startest, wenn beide maustasten gehalten werden?

Das ist richtig. Die linke Maustaste brauch ich schon für was anderes. Wollte ursprünglich nur die rechte Maustaste dafür benutzten, jedoch funktioniert das scheinbar in WPF nicht!

Du müsstest also die Werte deiner Matrix mw in ein (2dim?)Array schreiben, das Array verschicken, und bei Empfang daraus eine neue Matrix instanzieren.

Die Matrix ist keine einfache Wertematrix, diese beinhaltet viele andere Matrizen und Referenzinformation => somit werd ich es mal mit einer Serialisierung versuchen.

MfG

tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

Problem gelöst 😄

Man kann es so schreiben wie ich es von Anfang-an gemacht habe, jedoch muss die Klasse die man Draged als Serialisierbar markiert sein.

Danke für die Hilfe.

MfG
Tonka