Wie Abhakfelder in ListIconGadget() ausgrauen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Wie Abhakfelder in ListIconGadget() ausgrauen?

Beitrag von WPö »

Hallo beieinander!

Habe ein ListIconGadget() mit #PB_ListIcon_Checked. Während nun die in der Liste eingetragenen Dateien in einer Procedure() abgearbeitet werden, die mit CreateThread() vom Hauptprogramm unabhängig operiert, will ich dem Benutzer die Gelegenheit entziehen, die Haken zu verändern. Es darf nicht die gesamte Liste ausgegraut werden! Dies ist die schnellste und einfachste Weise und dazu elegant. Es erspart mir ausufernde Berücksichtigung der Veränderungen an den Abhakfeldern, was ja auch an meine Prozedur übermittelt werden müßte.

Sollte das aus irgendwelchen Gründen nicht möglich sein, muß ich in der Lage sein, allein bei der Veränderung eines Hakens eine Meldung von Windoof zu bekommen. Soviel ich auch probierte, es will nicht klappen.

Signalverarbeitung für das ListIconGadget():

Code: Alles auswählen

          blabla
          Case #Liste
            Debug "LeftClick="+Str(#PB_EventType_LeftClick)
            Debug "LeftDoubleClick="+Str(#PB_EventType_LeftDoubleClick)
            Debug "RightClick="+Str(#PB_EventType_RightClick)
            Debug "RightDoubleClick="+Str(#PB_EventType_RightDoubleClick)
            Debug "Change="+Str(#PB_EventType_Change)
            Debug "DragStart="+Str(#PB_EventType_DragStart)
            Debug EventType()
            If EventType() = #PB_EventType_Change Or EventType() = #PB_EventType_LeftClick
              Debug GetGadgetState(#Liste)
              Debug GetGadgetItemState(#Liste, GetGadgetState(#Liste))
            EndIf
            Debug " "
          Case blabla...
Ich bekomme zwar die Ereignisse _Change und _LeftClick, aber GetGadgetState() liefert mir nur die Nummer des selektierten Eintrags (oder -1, wenn noch nichts selektiert wurde), nicht die Nummer des gerade an-/abgehakten Eintrags. Selbst, wenn ich diese erhielte, könnte ich mit dem darauffolgenden GetGadgetItemState() nur den aktuellen Wert für das Abhaken auslesen. An die Veränderung käme ich erst, wenn ich noch einen alten Zustand, z.B. mit SetGadgetItemData(), zwischenspeicherte und vergleichen würde. Das ist mir alles zuviel Aufwand, wo ich doch schon genügend andere Kriegsschauplätze in meinem Programm habe.

Schließlich gibt es noch die Möglichkeit, wie Häns sie ganz unten in http://www.purebasic.fr/german/viewtopi ... icongadget anriß, alle Einträge immerfort zu testen. Das scheidet für mich aus, denn in meiner Testumgebung zu dem Programm, um das es geht, habe ich 2326 Einträge!

API will ich nicht nutzen, aber es sollte doch wohl möglich sein, die Abhakfelder separat lahmzulegen. Weiß jemand, wie?

Grüße - WPo
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

WPo hat geschrieben: ...
Ich bekomme zwar die Ereignisse _Change und _LeftClick, aber GetGadgetState() liefert mir nur die Nummer des selektierten Eintrags (oder -1, wenn noch nichts selektiert wurde), nicht die Nummer des gerade an-/abgehakten Eintrags. Selbst, wenn ich diese erhielte, könnte ich mit dem darauffolgenden GetGadgetItemState() nur den aktuellen Wert für das Abhaken auslesen. An die Veränderung käme ich erst, wenn ich noch einen alten Zustand, z.B. mit SetGadgetItemData(), zwischenspeicherte und vergleichen würde. Das ist mir alles zuviel Aufwand, wo ich doch schon genügend andere Kriegsschauplätze in meinem Programm habe.
...
API will ich nicht nutzen, aber es sollte doch wohl möglich sein, die Abhakfelder separat lahmzulegen.
...
Du kannst dich entscheiden: API-Dokumentation durchwühlen oder bei Change-Event den alten, gespeicherten Wert des aktuellen Eintrags auf Änderung prüfen und bei Bedarf zurückstellen, dann kann der Anwender zwar keinen Wert ändern (weil du ihn immer sofort wieder zurückstellst), aber die Einträge werden nicht grau.
Im ListIconGadget kannst du in PB keine einzelnen Einträge enablen/disablen, dafür gibt es die API.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Beitrag von WPö »

Ja, danke, Rokur!

Darauf wird es wohl hinauslaufen - also alle Benutzereingaben rückgängigmachen. Nur leider kriege ich das nicht mit, weil mich bei einem Klick auf das Abhakfeld keine Information erreicht, welche Zeile erwischt wurde. U.U. Tausende von Einträgen abzuklappern ist ja nicht drin.

Noch eine Idee?

Grüße - WPo
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Selbst bei "tausenden" von Einträgen sollte das nicht so lange dauern, wenn du trotzdem nur den Eintrag prüfen willst, der gerade geändert wurde, dann könntest du beim Change-Event den gerade markierten Eintrag prüfen, da der beim Klick auf die Checkbox doch markiert wird.

Wielange dauert denn deine Prozedur, während der die Eingabe gesperrt sein soll? Wenn das nicht zu lange dauert oder der Benutzer während dessen nicht unbedingt in der Liste blättern können muss, dann würde ich die eben komplett sperren.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

WPo hat geschrieben:Ja, danke, Rokur!

Nur leider kriege ich das nicht mit, weil mich bei einem Klick auf das Abhakfeld keine Information erreicht, welche Zeile erwischt wurde. U.U. Tausende von Einträgen abzuklappern ist ja nicht drin.

Noch eine Idee?

Grüße - WPo
http://www.purebasic.fr/german/viewtopi ... 536ed95ca4
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Beitrag von WPö »

Wie gehabt, Kai: Möglichst kein API. Wenn ich mein Programm auf Linux ausführe, ist die nämlich nicht so prickelnd. Muß nur mit PB-eigenen Befehlen erkennen, an welchem Eintrag der Haken an- oder abgewählt wurde. Will dabei aber nicht sämtliche evtl. 17 Zillionen Einträge abklappern müssen, weil das viel zu lange dauern würde.

Sehr seltsam - es wird doch wohl möglich sein, so eine Info zu bekommen, wenn nur der Haken angeklickt wurde! Will mir wirklich jemand erklären, daß ich nicht an derart grundlegende Infos komme?

Hat noch jemand eine Idee? Trotzdem danke an Kai und Rokur.

Grüße - WPo
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Ich sollte halt aufmerksamer lesen :mrgreen:
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Beitrag von WPö »

Hoppla, Rokus, habe über Deinen Beitrag drübergelesen.

Tja, das Verhalten meines Programms ist hochgradig dynamisch. Es handelt sich um ein Vergleichsprogramm für Dateien. Die Menge der Listeneinträge kann ich vorher nicht wissen. Da können genausogut 12 Einträge vorkommen wie 1000 oder 100.000e.

Während der Abarbeitung im Thread können dabei Sekundenbruchteile wie etliche Stunden vergehen. Der Benutzer soll den Verlauf der Arbeit (es werden in eine Spalte Testergebnisse eingetragen) mitverfolgen können, also auch im ListIconGadget() scrollen können. Die Haken in der ersten Spalte aber soll der Benutzer nach Anlauf des Prüfroutine nicht mehr ändern können.

Ich weiß, solche Vergleichsprogramme gibt es schon wie Sand am Meer. Sie sind allerdings recht gute Übungsobjekte für das Erlernen einer neuen Sprache. Wenn das mit dem Haken partout nicht geht, ist das doch schon fast ein ko-Kriterium für PureBasic! Ich fände es schade.

Grüße - WPo
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Da die Entwickler zur Zeit scheinbar mehr Wert auf die Windows-Version legen kann ich es verstehen, wenn sie nicht für jede Kleinigkeit die mit der Win-API gelöst werden kann einen PB-Befehl schreiben, aber vielleicht kommt das ja noch.

Aber um dein Problem zu lösen:
Versuche es mal wie in meinem letzten Beitrag beschrieben. Falls das nichts wird, wie wäre es dann die Liste unsichtbar zu machen und an der selben Stelle eine zweite Liste ohne Checkboxen anzuzeigen, in denen nur die zu Anfangs ausgewählen Einträge zu sehen sind? Da kannst du dann den Status in jeder Zeile mit eintragen. Wenn alles fertig ist zeigst du wieder die ursprüngliche Liste an.

Ich bezweifle ausserdem das es Anwender gibt die in einer Liste aus vielen tausend Einträgen irgendwas manuell suchen und auswählen wollen. :D
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Beitrag von WPö »

Ok, Rokur. Deine Idee mit der zweiten Liste gefällt mir. Sie ist zwar nicht gerade die optimale Lösung für das Problem, weil schon wieder nur an Symptomen 'rumgedoktert wird, statt die Ursache anzugehen, aber ich werde das 'mal probieren. Das mache ich zuhause, wird also 'ne Weile dauern.

So, nochmals großen Dank an alle, bei denen ich mich ausweinen durfte.

Grüße - WPo
Antworten