none
TaskDialog funktioniert in untergeordneter Klasse nicht. RRS feed

  • Frage

  • Hallo Leute,

    ich habe hier ein merkwürdiges Problem: siehe Titel.

    So ganz einfach ist das aber nicht. Erstmal: Im Hauptformular läuft der TaskDialog einwandfei, da ich gemäß Hinzberg (http://www.hinzberg.net/api7/api7/taskdiag.html) die Manifest-Datei vervollständigt habe. Im Backgroundworker in der Unterklasse "Subklasse" allerdings funktioniert's nicht. Im Debug-Modus gibt's immer 'ne Esception. Allerdings gibt's in dieser Klasse noch eine zweite Methode "Methode1", die vor dem BGW durchlaufen wird, danach zur MainForm zurückkehrt woraufhin der BackgroundWorker gestartet wird und mit dem TaskDialog in der Unterklasse läuft, was dann eine Exception erzeugt.

    Und jetzt das Merkwürdige: Auch die Methode "Methode1" enthält einen TaskDialog. Wird der (variablenabhängig) aufgerufen, gibt's mit dem TaskDialog im BackgroundWorker keine Probleme. Ich vermute, dass die Manifest-Erweiterung nur im Hauptformular berücksichtigt wird. Was also kann ich tun, damit der TaskDialog überall problemlos läuft?

    Am Programmcode ist nichts Besonderes, das Prinzip:

    1: |  class Hauptformular
    2: |  {
    3: |     using (TaskDialog td = new TaskDialog
    4: |     {
    5: |        // die Einstellungen haben auf das Fehlverhalten keinen Einfluss
    6: |     })
    7: |        TaskDialogResult tdr = td.Show();
    8: | 
    9: |     if (tdr = TaskDialogResult.OK)
    10: |    {
    11: |        BGW.DoWork += Subklasse.DoWork;
    12: |        BGW.RunWorkerAsync(...);
    13: |     }
    14: |  } // Ende class Hauptformular
    15: | 
    16: |  class Subklasse
    17: |  {
    18: |     public static void Methode1
    19: |     {
    20: |        if (bool)
    21: |        {
    22: |           using (TaskDialog...){...};
    23: |           xy;
    24: |           return;
    25: |        }
    26: |     }
    27: |  
    28: |     void DoWork(...)
    29: |     {
    30: |        using (TaskDialog...){...};
    31: |        yz;
    32: |        e.Result = 123;
    33: |     }
    34: |  }// Ende Subklasse
    Ah, ich sehe gerade, dass der TaskDialog in den static-Subklassen gut läuft, in den anderen nicht. Was noch nicht das merkwürdige Verhalten im BGW - geht nur, wenn TD in der static-Klasse mal gestartet wurde - erklärt.


    heute mal ohne Signatur...








    • Bearbeitet MoaByter Donnerstag, 1. Oktober 2020 13:48 Verbesserung der Lesbarkeit
    Mittwoch, 30. September 2020 19:00

Antworten

  • Ah - hihihi - ich vergaß die Fehlermeldung:

    -> System.NotSupportedException: "TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory."
    Im Link zu hinzberg.net ist die Korrektur der Manifest-Datei zu sehen, übrigens auch die Fehlermeldung. Seit dieser Korrektur funktioniert es wenigstens beim "normalen" Ausführen.

    Ich habe jetzt mal Zeilennummern hinzugefügt.
    Meinst du die schließende, geschweifte Klammer in Zeile 6? Die schließt nur die Einstellungen ab, was an der runden Klammer und dem fehlenden Semikolon danach zu sehen ist, danach kommt dann das "td.Show()", das hier nur nicht in geschweiften Klammern steht, da es nur eine Zeile ist.

    Ich verwende VisualStudioExpress, das hätte mir einen solchen Fehler gemeldet.

    Ich habe den TaskDialog jetzt in eine eigene Methode in der Hauptklasse gepackt, da gehört er eigentlich nicht hin, funktioniert aber auch im Debug-Modus.


    heute mal ohne Signatur...



    Donnerstag, 1. Oktober 2020 13:40

Alle Antworten

  • Hi,
    in deinem dargestellten Codeausschnitt ist das Objekt, auf welches td verweist, bereits Disposed, weil mit der schleißenden geschweiften Klammer ein Dispose ausgeführt wird. Die Show-Methode bringt da natürlich Fehler.

    Auch solltest du mal die Fehlernachricht kundtun.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 1. Oktober 2020 05:02
  • Ah - hihihi - ich vergaß die Fehlermeldung:

    -> System.NotSupportedException: "TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory."
    Im Link zu hinzberg.net ist die Korrektur der Manifest-Datei zu sehen, übrigens auch die Fehlermeldung. Seit dieser Korrektur funktioniert es wenigstens beim "normalen" Ausführen.

    Ich habe jetzt mal Zeilennummern hinzugefügt.
    Meinst du die schließende, geschweifte Klammer in Zeile 6? Die schließt nur die Einstellungen ab, was an der runden Klammer und dem fehlenden Semikolon danach zu sehen ist, danach kommt dann das "td.Show()", das hier nur nicht in geschweiften Klammern steht, da es nur eine Zeile ist.

    Ich verwende VisualStudioExpress, das hätte mir einen solchen Fehler gemeldet.

    Ich habe den TaskDialog jetzt in eine eigene Methode in der Hauptklasse gepackt, da gehört er eigentlich nicht hin, funktioniert aber auch im Debug-Modus.


    heute mal ohne Signatur...



    Donnerstag, 1. Oktober 2020 13:40