wNim Version 0.11.2 und Treeview

  • Ich habe da ein Problem mit der neuen Version (0.11.2) von wNim.

    Mit der alten Version (0.11.0) funktioniert das folgende Beispiel einwandfrei:

    Wenn ich jetzt aber die Version 0.11.2 installiere und das Programm compiliere und starte (soweit funktioniert das noch)

    und dann ein Item anklicke oder eines aufklappen will, dann erscheint das hier:


    Im changelog zur neuen Version schreibt der Autor, dass er das Event-System geändert hat:

    Zitat

    Slightly modify the event system. wNim now uses the new wEventRegister() macro to define all the event.
    A newly-defined event don't need to use const wEvent_MyNewEvent = wEvent_App + 1 anymore.
    The constructor of wEvent Event() can return the corresponding object of the subclass that registered
    by wEventRegister. All of this means that the GUI controls and their event can be designd as plugin
    module more easily (Breaking Change).


    Aber ich verstehe nicht, wie ich das jetzt auf das neue System umstellen soll.

    Hat jemand eine Idee?

  • Aber ich verstehe nicht, wie ich das jetzt auf das neue System umstellen soll.

    Hat jemand eine Idee?

    Im Bsp. wHyperlink.nim ist das recht gut gezeigt.


  • Im Bsp. wHyperlink.nim ist das recht gut gezeigt.

    Irgendwie will das bei mir nicht funktionieren oder ich bin zu blöd dafür.

    Wenn ich das so ändere, passiert beim anklicken der Items gar nichts:

  • Irgendwie will das bei mir nicht funktionieren oder ich bin zu blöd dafür.

    Wenn ich das so ändere, passiert beim anklicken der Items gar nichts:

    Ich hatte das bisher nur theoretisch betrachtet, da ich noch bei wNim v0.10.2 bin.

    Wollte gerade updaten, um das Bsp. mal selbst zu erstellen - aber ich kann (warum auch immer) nicht updaten:

    nimble update wnim  --->  Error: Package list with the specified name not found.

    Muss ich erst mal auf Fehlersuche gehen. X/


    EDIT:

    Habe die Version jetzt einfach mit der Git-Adresse installiert. Nun mach ich mich mal an die Events.

  • Habe mal getestet. Also ich bekomme auch nicht ein einziges Event mehr zum reagieren.


    Was ich im Bsp. wHyperlink erst übersehen hatte ist folgendes:

    Code
    if self.mIsMouseHover and isPressed:
    if self.mUrl.len != 0:
    # provide a chance let the user to veto the action.
    let event = Event(window=self, msg=wEvent_OpenUrl)
    if not self.processEvent(event) or event.isAllowed:
    ShellExecute(0, "open", self.mUrl, nil, nil, SW_SHOW)
    self.mIsVisited = true

    Mit Event() und Übergabe der Msg wird eine Variable instanziert. Aber deren Anwendung ist mir schleierhaft.


    Wenn man wenigstens einen Sinn in diesem neuen EventManagement erkennen könnte. Der Satz aus dem changelog.md:

    Zitat


    All dies bedeutet, dass die GUI-Controls und ihr Ereignis leichter als Plugin-Modul entworfen werden können

    klingt momentan für mich etwas höhnisch.

    Momentan bin ich beim Status: "Event Verarbeitung ist nicht mehr möglich".

  • Erste Resultate:


    - Das neue EventManagement ist nur relevant für selbst definierte Events. Hier also nicht von Interesse, da StandardEvents Verwendung finden.

    - Die Events funktionieren tadellos.

    - Das Problem ist deine Prozedur getTree(). An irgendeiner Stelle tritt ein Fehler mit möglichem nil auf. M.M. nach ist der Parameter item der Verursacher. Bisher konnte ich die Prozedur noch nicht ans Laufen bringen - aber ich probiere weiter.


    EDIT:

    Verursacher ist: tree. Beim Aufruf von tree.getRootItem crasht die Funktion, weil tree nil ist.

    Demzufolge ist bereits der Aufruf von tvItem.getTreeCtrl innerhalb der Events nicht erfolgreich. Deshalb sah es auch so aus, als seien diese die Schuldigen.

  • EDIT:

    Verursacher ist: tree. Beim Aufruf von tree.getRootItem crasht die Funktion, weil tree nil ist.

    Demzufolge ist bereits der Aufruf von tvItem.getTreeCtrl innerhalb der Events nicht erfolgreich. Deshalb sah es auch so aus, als seien diese die Schuldigen.

    Ja, insofern gebe ich Dir recht. Mein getTree crasht, wegen dem nil.

    Das Problem liegt aber an "event.getItem". Die Prozedur "getItem" liefert nicht mehr das Item zurück, sondern immer nil.

    Mit der Version 0.11.0 funktionierte das einwandfrei. Dort wurde das angeklickte Item zuruückgegeben.

    Meine Frage ist also, wie komme ich in der neuen Version an das Item?

  • Hmm, hab mal nachgesehen, die Methode gibt es in den Events nicht mehr.

    Ich habe mich auch gerade mal durchgewühlt. Die beiden Methoden sind auskommentiert (in wTreeEvent.nim):

    Code
    # method getItem*(self: wTreeEvent): wTreeItem {.property, inline.} =
    # ## Returns the item.
    # result.mTreeCtrl = self.mTreeCtrl
    # result.mHandle = self.mHandle
    # method getOldItem*(self: wTreeEvent): wTreeItem {.property, inline.} =
    # ## Returns the old item (valid for wEvent_TreeSelChanging, wEvent_TreeSelChanged,
    # ## and wEvent_TreeEndDrag events).
    # result.mTreeCtrl = self.mTreeCtrl
    # result.mHandle = self.mOldHandle

    Und nachdem ich mich etwas in wTreeCtrl.nim eingelesen habe, konnte ich zumindest ein Workaround erstellen:

    So funktioniert zumindest wieder das auslesen des Items.

  • Und nachdem ich mich etwas in wTreeCtrl.nim eingelesen habe, konnte ich zumindest ein Workaround erstellen:

    So, mit der neuen Version (v0.11.3) von wNim ist der Workaround nicht mehr nötig.

    Hier mal die Änderungen:

    Zitat

    Version 0.11.3


    wImageList: Fix incorrect index in getBitmap() and getIcon() (#64, thanks to BugFix).

    wTreeEvent: Fix getItem() and getOldItem(). Remove the mistake comment.

    Ja, auch der Bug bei der ImageList wurde gefixt. :thumbup: