Keyboard Shortcuts - Suche in einem Tree Gadget
Keyboard Shortcuts - Suche in einem Tree Gadget
Gegeben sei ein TreeGadget, gefüllt mit Items, sowie ein StringGadget für einen zu suchenden Text und Keyboard Shortcuts, die an das Window
angefügt wurden.Sowie noch zwei Buttons, um hoch oder runter zu suchen.
Ich möchte den Text in dem StringGadget im Text aller Items des TreeGadgets suchen.Das gefundene Item wird mittels SetGadgetState(Tree_0,Item)
ausgewählt.Damit das Item auch als ausgewählt angezeigt wird ( blau hinterlegt), muß ich SetActiveGadget(Tree_0) verwenden.
Über die Buttons funktioniert das erstmal wie gewünscht.Zur Vereinfachung möchte ich die Suche auch über die Keyboard Shortcuts steuern,
aber da ich zwei solche StringGadgets als Suchboxen habe, muß ich irgendwie das jeweils aktive StringGadget ermitteln.Bisher mache ich
das über GetActiveGadget(), aber da ich das TreeGadget active setzen muß, damit es das selektierte Item blau unterlegt anzeigt, funktioniert
das so nicht mehr, da ja dann das TreeGadget das aktive Gadget ist und keines der StringGadgets, wo ich dann z.B. Enter drücke.
Wenn ich das TreeGadget mit dem Flag #PB_Tree_AlwaysShowSelection erstelle, funktioniert es fast gewünscht, allerdings wird dann das
selektierte Item nur grau statt blau hinterlegt markiert.Außerdem kann ich dieses Flag über den integrierten FormDesigner auch nicht setzen.
Obwohl es nicht dokumentiert ist, habe ich rausgefunden, dass
SetGadgetAttribute(Tree_0, #PB_Tree_AlwaysShowSelection, 1 )
trotzdem funktioniert, womit ich zumindest das FormDesigner Problem umgehen kann.
Wer hat noch eine Idee, wie man das aktive StringGadget für die KeyBoardShortcuts ermitteln kann und trotzdem
das selektierte Item im TreeGadget blau hinterlegen kann ( also dann vermutlich ohne die Verwendung von
SetActiveGadget(Tree_0) ...).
Der Code funktioniert wie erwartet, das ist also kein Fehler, mehr eine Frage des Designs ( und das man
Keyboard Shortcuts eben nur an ein Window und nicht an ein Gadget binden kann - zumindest ist das
mein Stand).
Ich habe schon überlegt, mir evtl. das StringGadget zu merken, wo zuletzt ein Text eingetippt wurde
und dann die Annahme tätige, dieses ist das Suchfeld, wo die Shortcust angewendet werden sollen
( also z.B. Enter für nächstes / weitersuchen in meinem Fall).
Aber vielleicht gibts ja noch bessere Lösungen, evtl. über WinAPI ?
Vielen Dank im voraus schonmal...
TWELVE
angefügt wurden.Sowie noch zwei Buttons, um hoch oder runter zu suchen.
Ich möchte den Text in dem StringGadget im Text aller Items des TreeGadgets suchen.Das gefundene Item wird mittels SetGadgetState(Tree_0,Item)
ausgewählt.Damit das Item auch als ausgewählt angezeigt wird ( blau hinterlegt), muß ich SetActiveGadget(Tree_0) verwenden.
Über die Buttons funktioniert das erstmal wie gewünscht.Zur Vereinfachung möchte ich die Suche auch über die Keyboard Shortcuts steuern,
aber da ich zwei solche StringGadgets als Suchboxen habe, muß ich irgendwie das jeweils aktive StringGadget ermitteln.Bisher mache ich
das über GetActiveGadget(), aber da ich das TreeGadget active setzen muß, damit es das selektierte Item blau unterlegt anzeigt, funktioniert
das so nicht mehr, da ja dann das TreeGadget das aktive Gadget ist und keines der StringGadgets, wo ich dann z.B. Enter drücke.
Wenn ich das TreeGadget mit dem Flag #PB_Tree_AlwaysShowSelection erstelle, funktioniert es fast gewünscht, allerdings wird dann das
selektierte Item nur grau statt blau hinterlegt markiert.Außerdem kann ich dieses Flag über den integrierten FormDesigner auch nicht setzen.
Obwohl es nicht dokumentiert ist, habe ich rausgefunden, dass
SetGadgetAttribute(Tree_0, #PB_Tree_AlwaysShowSelection, 1 )
trotzdem funktioniert, womit ich zumindest das FormDesigner Problem umgehen kann.
Wer hat noch eine Idee, wie man das aktive StringGadget für die KeyBoardShortcuts ermitteln kann und trotzdem
das selektierte Item im TreeGadget blau hinterlegen kann ( also dann vermutlich ohne die Verwendung von
SetActiveGadget(Tree_0) ...).
Der Code funktioniert wie erwartet, das ist also kein Fehler, mehr eine Frage des Designs ( und das man
Keyboard Shortcuts eben nur an ein Window und nicht an ein Gadget binden kann - zumindest ist das
mein Stand).
Ich habe schon überlegt, mir evtl. das StringGadget zu merken, wo zuletzt ein Text eingetippt wurde
und dann die Annahme tätige, dieses ist das Suchfeld, wo die Shortcust angewendet werden sollen
( also z.B. Enter für nächstes / weitersuchen in meinem Fall).
Aber vielleicht gibts ja noch bessere Lösungen, evtl. über WinAPI ?
Vielen Dank im voraus schonmal...
TWELVE
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Keyboard Shortcuts - Suche in einem Tree Gadget
Shortcut bei #PB_EventType_Focus Event() setzen und bei #PB_EventType_LostFocus wieder löschen!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Keyboard Shortcuts - Suche in einem Tree Gadget
Was soll das genau bringen ? Die Shortcuts füge ich zum Window hinzu, die gelten also fürs Window und nichtts-soft hat geschrieben:Shortcut bei #PB_EventType_Focus Event() setzen und bei #PB_EventType_LostFocus wieder löschen!
für ein bestimmtes Gadget, warum sollte man die je nach Focus hinzufügen und wieder entfernen ?
Es geht ja letzlich nur darum, bei der Verarbeitung der KB Shortcuts das aktive StringGadget zu ermitteln.
GetActiveGadget() funktioniert wie oben beschrieben nicht mehr, weil ich das TreeGadget active setzen muß,
damit der selektierte Eintrag blau unterlegt wird.
Außerdem wird das Tree bei jedem Suchlauf active gesetzt, das StringGadget darf also keinen Focus erhalten,
weil sonst der Tree wieder den Fokus verliert ( dann wechselt die blaue Hinterlegung in die graue, die ich nicht will).
Ich überlege gerade, ob ich nicht beim Reinklicken in ein StringGadget dieses als "active" irgendwo abspeichere und
damit dann die KB Shortcuts steuere.
Um es nochmal klarzumachen: die Auswertung der KB Shortcut Events ist das Problem, nicht die KB Shortcuts selber.
Cleverer wärs aber eigentlich, wenn man irgendwie das TreeGadget dazu bringen könnte, das selektierte Item blau
zu hinterlegen obwohl das Tree nicht das aktive Gadget ist.
- NicTheQuick
- Ein Admin
- Beiträge: 8820
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Keyboard Shortcuts - Suche in einem Tree Gadget
Wie wäre es mit '#PB_Tree_AlwaysShowSelection'? Steht alles in der Hilfe.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Keyboard Shortcuts - Suche in einem Tree Gadget
Ich dachte, Du willst den Shortcuts dem Gadget hinzufügen und nicht dem Window. Dafür mein Code-Beispiel. Jetzt blicke ich aber garnicht mehr durch und halte mich wieder raus.TWELVE hat geschrieben:Was soll das genau bringen ? Die Shortcuts füge ich zum Window hinzu, die gelten also fürs Window und nicht für ein bestimmtes Gadget, warum sollte man die je nach Focus hinzufügen und wieder entfernen ?
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Keyboard Shortcuts - Suche in einem Tree Gadget
NicTheQuick hat geschrieben:Wie wäre es mit '#PB_Tree_AlwaysShowSelection'? Steht alles in der Hilfe.
TWELVE hat geschrieben:Wenn ich das TreeGadget mit dem Flag #PB_Tree_AlwaysShowSelection erstelle, funktioniert es fast gewünscht, allerdings wird dann das
selektierte Item nur grau statt blau hinterlegt markiert.
Dann ist es grau, ich wollte es aber blau, so als wenn man es anklickt.
Re: Keyboard Shortcuts - Suche in einem Tree Gadget
Ich habe jetzt eine funktionierende Lösung gebastelt, basierend auf der Idee, mir das zuletzt aktivierte StringGadget als Data ( 1 für "active", 0 für "inactive")
im StringGadget zu merken.Funktioniert wie gewünscht.Die Shortcuts gelten also immer für das StringGadget, in das zuletzt reingeklickt wurde.Das hat auch
den Vorteil, dass nerviges wieder-Reinklicken in das String entfällt, wenn ein anderes Gadget mal den Fokus gekriegt hat.
Bin aber trotzdem noch an anderen / besseren Lösungen interessiert !
ts-soft: kannst Du Deinen Vorschlag nochmal etwas näher beschreiben ?
im StringGadget zu merken.Funktioniert wie gewünscht.Die Shortcuts gelten also immer für das StringGadget, in das zuletzt reingeklickt wurde.Das hat auch
den Vorteil, dass nerviges wieder-Reinklicken in das String entfällt, wenn ein anderes Gadget mal den Fokus gekriegt hat.
Code: Alles auswählen
...
AddKeyboardShortcut(Window,#PB_Shortcut_Return, 100)
...
Select event
Case #PB_Event_Menu
Select EventMenu()
Case 100 ; Enter
If GetGadgetData(String_0)
search text in String_0
EndIf
If GetGadgetData(String_1)
search text in String_1
EndIf
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case String_0
Select EventType()
Case #PB_EventType_Focus
SetGadgetData(String_0, 1) ; set String_0 "active"
SetGadgetData(String_1, 0) ; set String_1 "inactive"
Case #PB_EventType_LostFocus
EndSelect
Case String_1
Select EventType()
Case #PB_EventType_Focus
SetGadgetData(String_1, 1) ; set String_1 "active"
SetGadgetData(String_0, 0) ; set String_0 "inactive"
Case #PB_EventType_LostFocus
EndSelect
EndSelect
EndSelect
ts-soft: kannst Du Deinen Vorschlag nochmal etwas näher beschreiben ?
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Keyboard Shortcuts - Suche in einem Tree Gadget
Code: Alles auswählen
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "bla", #PB_Tree_AlwaysShowSelection)
TreeGadget(0, 5, 5, 630, 400)
StringGadget(1, 5, 410, 630, 30, "Hallo")
StringGadget(2, 5, 445, 630, 30, "Holla")
AddGadgetItem(0, -1, "Item 0", 0, 0)
AddGadgetItem(0, -1, "Sub-Item 1", 0, 1)
AddGadgetItem(0, -1, "Sub-Item 2", 0, 1)
AddGadgetItem(0, -1, "Sub-Item 3", 0, 1)
AddGadgetItem(0, -1, "Sub-Item 4", 0, 1)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Select EventType()
Case #PB_EventType_Focus
AddKeyboardShortcut(0, #PB_Shortcut_Return, 100)
Case #PB_EventType_LostFocus
RemoveKeyboardShortcut(0, #PB_Shortcut_Return)
EndSelect
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 100
Debug "Aber Hallo, StringGadget 1 hat den Focus"
EndSelect
EndSelect
ForEverPureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Keyboard Shortcuts - Suche in einem Tree Gadget
@ts-soft
Danke für Deinen Code !
Was passiert in Deinem Eventhandling, wenn das andere String Gadget den Focus hat ?
Du wertest ja nur die ID 100 des KB Shortcuts aus, auch wenn Du den Shortcut hinzugefügt hast, als StringGadget 1 den Focus hatte, er gilt für das
Window und damit für jedes Gadget.
Ob Du den KB Shortcut dynamisch hinzufügst und entfernst, je nachdem, welches Gadget den Focus hat, spielt keine Rolle, da
er eben für das ganze Window gilt und nicht für ein einzelnes Gadget.
Daher muß der Trick im Eventhandler stattfinden....
Abgesehen davon hat mind. eines meiner StringGadgets nach einer Suche des Textes nie den Fokus, weil ich den Fokus
dem TreeGadget geben muß, damit es das gefundene und selektierte Item blau unterlegen kann.
Daher würde Dein Code selbst dann nicht funktionieren, wenn er ansonsten richtig wäre.
Am simpelsten wäre #PB_Tree_AlwaysShowSelection, wenn es die selektierten Items dann nicht grau statt blau unterlegen würde.
Mir gefällt grau aus dem Grunde nicht, weil es sich von einem Left-Click auf das Item optisch unterscheidet und außerdem
grau zu unauffällig ist.
Wenn sonst niemand einen tollen WinAPI Trick dafür hat, bleibe ich bei meinem Code oben, da er genauso funktioniert, wie ich
ich es haben will ( ich mag es nur nicht, für relativ simple Funktionen relativ viel Code ein/umzubauen, wenn es dafür auch
einen simpleren Weg gibt).
Danke für Deinen Code !
Was passiert in Deinem Eventhandling, wenn das andere String Gadget den Focus hat ?
Code: Alles auswählen
Case #PB_Event_Menu
Select EventMenu()
Case 100
Debug "Aber Hallo, StringGadget 1 hat den Focus"
EndSelect
EndSelectWindow und damit für jedes Gadget.
Ob Du den KB Shortcut dynamisch hinzufügst und entfernst, je nachdem, welches Gadget den Focus hat, spielt keine Rolle, da
er eben für das ganze Window gilt und nicht für ein einzelnes Gadget.
Daher muß der Trick im Eventhandler stattfinden....
Abgesehen davon hat mind. eines meiner StringGadgets nach einer Suche des Textes nie den Fokus, weil ich den Fokus
dem TreeGadget geben muß, damit es das gefundene und selektierte Item blau unterlegen kann.
Daher würde Dein Code selbst dann nicht funktionieren, wenn er ansonsten richtig wäre.
Am simpelsten wäre #PB_Tree_AlwaysShowSelection, wenn es die selektierten Items dann nicht grau statt blau unterlegen würde.
Mir gefällt grau aus dem Grunde nicht, weil es sich von einem Left-Click auf das Item optisch unterscheidet und außerdem
grau zu unauffällig ist.
Wenn sonst niemand einen tollen WinAPI Trick dafür hat, bleibe ich bei meinem Code oben, da er genauso funktioniert, wie ich
ich es haben will ( ich mag es nur nicht, für relativ simple Funktionen relativ viel Code ein/umzubauen, wenn es dafür auch
einen simpleren Weg gibt).