Navigieren in einem ListIcongadget mit diesem Tool
Verfasst: 11.07.2019 17:44
Wer ständig mit einer größeren Liste arbeitet muß andauernd mit dem Scrollbalken hantieren.
Via Tastendruck kann man zu einem bestimmten Namen springen, aber nur wenn dieser in Spalte null ist.
Mit diesem kleinen Tool kann man die Maus nehmen und der Name kann auch in Spalte 1 oder 2 oder ... sein
Meine Liste hat knapp 5000 Einträge und das Ganze ist schnell. Schätze bis 10000 sicher ok. Aber das Tool ist ja auch noch ausbaufähig.
Ärgerlich ist das schwache PopUpMenu Handling von PB. Ohne Callback, so wie hier, muß die MenuItem Nummern im Auge haben.
Linke Maustaste = zum Buchstaben springen, rechte Taste = PopUpMenu mit Auswahl
PS: wer mag darf es benutzen und verändern wie er will
Via Tastendruck kann man zu einem bestimmten Namen springen, aber nur wenn dieser in Spalte null ist.
Mit diesem kleinen Tool kann man die Maus nehmen und der Name kann auch in Spalte 1 oder 2 oder ... sein
Meine Liste hat knapp 5000 Einträge und das Ganze ist schnell. Schätze bis 10000 sicher ok. Aber das Tool ist ja auch noch ausbaufähig.
Ärgerlich ist das schwache PopUpMenu Handling von PB. Ohne Callback, so wie hier, muß die MenuItem Nummern im Auge haben.
Linke Maustaste = zum Buchstaben springen, rechte Taste = PopUpMenu mit Auswahl
Code: Alles auswählen
DeclareModule AZListe
;HJBremer ab PB 5.41 x86 + x64 07.2019 V.1.01
Declare.i AZ_SetParameter(firstitem, colitems=4, charanzahl=3)
Declare.i AZ_Liste(pbnr, x, y, br, hh, col)
; pbnr = zu durchsuchende Liste
; x y = Position der AZ Liste
; br = ca 25 - 30 je nach Font
; hh = Höhe der AZ-Liste gleich datenliste, es müssen alle Buchstaben sichtbar sein
; col = Spalte in der die Daten sich befinden von der zu durchsuchenden Liste
EndDeclareModule
Module AZListe
EnableExplicit
;Variablen
Global datenliste, datencolumn, azliste
Global popupMenu
Global popupFirstitem = 1100 ;Menuitem Startnr
Global popupLastitem
Global popupColitems = 4 ;Anzahl Items pro MenuSpalte untereinander
Global popupCharNumber = 3 ;im Menu angezeigte Zeichen pro Eintrag, sinnvoll 2-6
#azlisteBackcolor = $D2FAFA
#azlisteFrontcolor = #Blue
Procedure.i ScrollCenter(id, item, pos=-1)
;id = GadgetID einer Liste
;item = welche Zeile soll bewegt werden
;pos = wenn >= 0, wohin scrollen
;pos = wenn -1 in die Mitte scrollen oder höher je nach Teiler (3 oder 2)
Protected r.rect
SendMessage_(id, #LVM_GETITEMRECT, 0, r)
Protected listitemhh = r\bottom - r\top
Protected listmitte = SendMessage_(id, #LVM_GETCOUNTPERPAGE, 0, 0) / 3 ;2
Protected listtop = SendMessage_(id, #LVM_GETTOPINDEX, 0, 0)
If pos > -1: listmitte = pos: EndIf ;in diese Zeile scrollen
Protected listabstand2 = listitemhh * item
Protected listabstand1 = listitemhh * (listtop + listmitte)
Protected listdiff = listabstand2 - listabstand1
SendMessage_(id, #LVM_SCROLL, 0, listdiff)
EndProcedure
Procedure.i AZ_SetParameter(firstitem, colitems=4, charanzahl=3)
popupFirstitem = firstitem
popupColitems = colitems
popupCharNumber = charanzahl
EndProcedure
Procedure.i AZ_Search(pbnr, char, col)
;durchsucht Datenliste in einer bestimmten column
;wenn char = dem 1.Zeichen ist, diese Zeile markieren
;und die ZeilenNr zurückgeben
Protected anz, j, k, a$
anz = CountGadgetItems(pbnr) - 1 ;zu durchsuchende Liste
For j = 0 To anz
a$ = GetGadgetItemText(pbnr, j, col) ;hole Text
k = Asc(a$) ;Wert 1.Zeichen
If k = char ;ist es gleich dem gesuchten Zeichen
SetGadgetState(pbnr, j) ;wenn ja, markiere Listenzeile
ScrollCenter(GadgetID(pbnr), j, char-65) ;scrolle zum gesuchten Zeichen in AZ-Liste
SetActiveGadget(pbnr)
Break
ElseIf k > char ;char gibt es nicht
SetGadgetState(pbnr, j)
ScrollCenter(GadgetID(pbnr), j, char-65)
SetActiveGadget(pbnr)
Break
EndIf
Next
ProcedureReturn j
EndProcedure
Procedure AZ_SearchNext(pbnr, char, col, item)
;wird nach AZ_Search() aufgerufen mit den gleichen Parametern
;und durchsucht eine Liste ab item
;und schreibt die jeweils 1. unterschiedlichen Zeichen in ein Menu
;wie lang ein Menueintrag ist wird in charanz festgelegt
popupMenu = CreatePopupMenu(#PB_Any)
Protected colitem
Protected menuitemnr = popupFirstitem
Protected MenuInfo.MENUITEMINFO ;für Zugriff auf DataBereich eines MenuItems
Protected a$, x$ = ""
Protected anz, j, aa, x, y
anz = CountGadgetItems(pbnr) - 1
For j = item To anz
a$ = GetGadgetItemText(pbnr, j, col) ;:Debug a$
a$ = Left(a$, popupCharNumber) ;wird zum Menueintrag
aa = Asc(a$)
If aa <> char
Break
Else
If x$ <> a$
x$ = a$
menuitemnr + 1 ;
If colitem < popupColitems
MenuItem(menuitemnr, a$)
Else
AppendMenu_(MenuID(popupMenu), #MF_MENUBREAK, menuitemnr, a$)
colitem = 0
EndIf
colitem + 1
MenuInfo\cbSize = SizeOf(MENUITEMINFO)
MenuInfo\fMask = #MIIM_DATA
MenuInfo\dwItemData = j ;Zeilennr in Menuitem Data schreiben
SetMenuItemInfo_(MenuID(popupMenu), menuitemnr, 0, @MenuInfo)
EndIf
EndIf
Next
popupLastitem = menuitemnr
x = DesktopMouseX() + 10
y = DesktopMouseY() + 5
;DisplaypopupMenu(popupMenu, UseGadgetList(0))
;oder ???
DisplayPopupMenu(popupMenu, GetForegroundWindow_(), x, y)
EndProcedure
Procedure.i AZ_Event()
Protected MenuInfo.MENUITEMINFO ;für Zugriff auf DataBereich eines MenuItems
Protected item, txt$, char, menueItem
Select Event()
Case #PB_Event_Gadget
Select EventType()
Case #PB_EventType_LeftClick
item = GetGadgetState(azliste)
txt$ = GetGadgetItemText(azliste, item)
char = Asc(txt$)
item = AZ_Search(datenliste, char, datencolumn)
Case #PB_EventType_RightClick
item = GetGadgetState(azliste)
txt$ = GetGadgetItemText(azliste, item)
char = Asc(txt$)
item = AZ_Search(datenliste, char, datencolumn)
AZ_SearchNext(datenliste, char, datencolumn, item)
EndSelect
Case #PB_Event_Menu
menueItem = EventMenu() ;:Debug menueItem
Select menueItem
Case popupFirstitem To popupLastitem
MenuInfo\cbSize = SizeOf(MENUITEMINFO) ;Data ist die ZeilenNr in Liste
MenuInfo\fMask = #MIIM_DATA
GetMenuItemInfo_(MenuID(popupMenu), menueItem, 0, @MenuInfo)
char = Asc(GetMenuItemText(popupMenu, menueItem)) - 65
SetGadgetState(datenliste, menuinfo\dwItemData)
ScrollCenter(GadgetID(datenliste), menuinfo\dwItemData, char)
SetActiveGadget(datenliste)
EndSelect
EndSelect
EndProcedure
Procedure.i AZ_Liste(pbnr, x, y, br, hh, column)
Protected j
datenliste = pbnr ;zu durchsuchende Liste
datencolumn = column ;durchsuchende Spalte
azliste = ListIconGadget(#PB_Any, x, y, br, hh, "?", br-4, #LVS_NOCOLUMNHEADER| #PB_ListIcon_FullRowSelect)
SetGadgetColor(azliste, #PB_Gadget_BackColor, #azlisteBackcolor)
SetGadgetColor(azliste, #PB_Gadget_FrontColor, #azlisteFrontcolor)
SetWindowTheme_(GadgetID(azliste), @"Explorer", 0)
AddGadgetItem(azliste, 0, Chr(32))
For j = 1 To 26
AddGadgetItem(azliste, j, Chr(j+65-1))
Next
AddGadgetItem(azliste, j, "[]")
BindGadgetEvent(azliste, @AZ_Event(), #PB_EventType_LeftClick)
BindGadgetEvent(azliste, @AZ_Event(), #PB_EventType_RightClick)
BindEvent(#PB_Event_Menu, @AZ_Event())
ProcedureReturn azliste
EndProcedure
EndModule
UseModule AZListe
; -----------------------------------------------------------------------
LoadFont(1, "Arial", 10)
OpenWindow(1, 450, 100, 655, 640, "Test", #PB_Window_SystemMenu)
flag = #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection
ListIconGadget(2, 64, 14, 500, 600, "Sp 0", 50, flag)
AddGadgetColumn(2, 1, "Sp 1", 180)
AddGadgetColumn(2, 2, "Sp 2", 180)
AddGadgetColumn(2, 3, "Sp 3", 65)
laz = AZ_Liste(2, 35, 14, 28, 600, 1) ;laz ist die pbnr des Gadgets
SetGadgetFont(2, FontID(1))
SetGadgetFont(laz, FontID(1))
AZ_SetParameter(2000,4,5)
HideGadget(2,1)
Repeat
Read.s a$
If a$ = "end" : Break : EndIf
anz + 1
AddGadgetItem(2, -1, Str(anz) + #LF$ + a$)
ForEver
HideGadget(2,0)
Repeat: event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
DataSection
Data.s "1000 Wandertouren", "Abbi Glines", "Adler Olsen", "Akif Pirincci", "Alex Thomas", "Alida Leimbach", "Andrea Camilleri"
Data.s "Andreas Eschbach", "Andreas Föhr", "Andreas Hoppert", "Andreas Winkelmann", "Andy Weir", "Angorakaninchen", "Ann Cleeves"
Data.s "Anna Johannsen", "Anna Todd", "Anne Hertz", "Annelie Wendeberg", "Anton Leiss-Huber", "Arne Dahl", "Arto Paasilinna"
Data.s "Audrey Carlan", "Barbara Wendelken", "Belinda Bauer", "Ben Kryst Tomasson", "Bernard Cornwell", "Bernard Cornwell", "Bernard Cornwell"
Data.s "Bernard Cornwell", "Bettina Belitz", "Bob Anderson", "Brenda Bowen", "Brigitte Kanitz", "Camilla Läckberg", "Carsten Sebastian Henn"
Data.s "Catherine Simon", "Cecelia Ahern", "Charlotte Link", "Chimamanda Ngozi Adichie", "Christa Bernuth", "Christian von Ditfurth", "Christiane Fux"
Data.s "Christine Cazon", "Christine Feehan", "Christine Feehan", "Christine Kabus", "Christopher Ride", "Claudia Rusch", "Clive Cussler"
Data.s "Clive Cussler", "Clive Cussler", "Colin Cotterill", "Conn Iggulden", "Corina Bomann", "Cornelia Leymann", "Cynthia Hand"
Data.s "Dan Brown", "Daniel Silva", "Daniel Silva", "Das TTL-Kochbuch", "David Baldacci", "David Gemmell", "David Weber"
Data.s "David Weber", "Denise Mina", "Derek Meister", "Diana Gabaldon", "Die Mundorgel", "Dinah Marte Golch", "Don Winslow"
Data.s "Don Winslow", "Dora Heldt", "Dr. Stefan Woinoff", "E L James", "Edward Lee & John Pelan", "Elin Hilderbrand", "Elizabeth Chandler"
Data.s "Ella Danz", "Ellen Berg", "Emelie Schepp", "Eric Berg", "Erin Watt", "Es geschah in Berlin 1930", "Ethan Cross"
Data.s "Eva Almstädt", "Eva Ehley", "F. Paul Wilson", "Ferdinand von Schirach", "Frank Schätzing", "Fredrik Backman", "Gabriella Engelmann"
Data.s "Gail Honeyman", "Geneva Lee", "George R.Martin", "Gil Ribeiro", "Gisa Pauly", "Gisa Pauly", "Guillaume Musso"
Data.s "Hagen Rudolph", "Hannah O'Brien", "Hannes Nygaard", "Hannes Nygaard", "Hanni Münzer", "Hans Rath", "Harlan Coben"
Data.s "Harper Lee", "Haruki Murakami", "Heidi Hohner", "Heinrich Riedl", "Helen Fielding", "Hendrik Falkenberg", "Hildegard Burri-Bayer"
Data.s "Horst Evers", "Ildiko von Kürthy", "Inge Löhnig", "Iny Lorentz", "Iny Lorentz", "Irvin D. Yalom", "J. Kenner"
Data.s "Jacky Drappeldrey", "James Lee Burke", "James Rollins", "James Rollins", "Jan Guillou", "Jan Kowalsky", "Janet Evanovich"
Data.s "Jaye Ford", "Jean Luc Bannalec", "Jeaniene Frost", "Jeff Kinney", "Jeff Kinney", "Jeffrey Archer", "Jeffrey Archer"
Data.s "Jennifer Estep", "Jenny Erpenbeck", "Jesper Juul", "Jessica Sorensen", "Jo Nesbo", "Jo Nesbo", "Joachim Rangnick"
Data.s "Jodi Picoult", "Johan Theorin", "John Katzenbach", "John Sandford", "Jojo Moyes", "Jonas Wolf", "Joël Dicker"
Data.s "Julia Stagg", "Jutta Profijt", "Jörg Maurer", "Jürgen Rath", "K. Kathrin Hanke", "Karen Rose", "Karin Fossum"
Data.s "Karin Wahlberg", "Katharina Peters", "Kathrin Lange", "Katie MacAlister", "Kazuaki Takano", "Kerstin Gier", "Kevin O'Brien"
Data.s "Kira Brück", "Klara Holm", "Klaus-Peter Wolf", "Klaus-Peter Wolf", "Krischan Koch", "Kristina Ohlsson", "Lara Adrian"
Data.s "Laura Dave", "Leah Bach", "Lee Child", "Lee Child", "Lena Johannson", "Lilly Lindner", "Linda Howard"
Data.s "Lisa Jackson", "Loretta Stern", "Lou Paget", "Lucinda Riley", "Lucy Clarke", "Lynsay Sands", "Madeline Hunter"
Data.s "Manuela Kuck", "Marc Uwe Kling", "Maria Dries", "Marie Kondo", "Marion Griffiths-Karger", "Mark Roderick", "Markus Heitz"
Data.s "Martin Schleske", "Mary Higgins Clark", "Mary Kay Andrews", "Matthew J. Arlidge", "Max Bentow", "Mechthild Lanfermann", "Melissa Schwermer"
Data.s "Mergus Aquarien Atlas 2", "Mia Löw", "Michael Connelly", "Michael Höveler-Müller", "Michael Koglin", "Michael Robotham", "Michel Bussi"
Data.s "Mini-Bücher", "Mona Kasten", "Moritz Matthies", "Nalini Singh", "Nancy Atherton", "Nancy Atherton", "Nele Neuhaus"
Data.s "Nele Neuhaus", "Nicholas Sparks", "Nicola Marni", "Nina Ohlandt", "Nora Roberts", "Nora Roberts", "Nora Roberts"
Data.s "Nora Roberts", "Nora Roberts", "Nora Roberts", "Nora Roberts", "Olen Steinhauer", "Otfried Preußler", "P.C. und Kristin Cast"
Data.s "Patricia Cornwell", "Paul Bokowski", "Paul Grote", "Paula Hawkins", "Peter Gerdes", "Peter V. Brett", "Petra Hammesfahr"
Data.s "Pierre Jarawan", "Pixi Bücher", "Poppy J. Anderson", "R.A.Salvatore", "Rainer Löffler", "Rebecca Gable", "Reinhard Pelte"
Data.s "Resident Evil", "Richard Morgan", "Richard Stark", "Rita Falk", "Robert B. Parker", "Robert Jordan", "Robert Ludlum"
Data.s "Robin Jarvis", "Rowan Coleman", "Ruth Ware", "Sabine Ebert", "Sadie Matthews", "Samantha Young", "Sandra Dünschede"
Data.s "Sandra Lüpkes", "Sandra Regnier", "Sarah Lark", "Saul Black", "Sebastian Fitzek", "Sebastian Fitzek", "Sergej Lochthofen"
Data.s "Silke Neumayer", "Simon R. Green", "Simon Scarrow", "Simone Elkeles", "Sophie Hannah", "Stefan Bauer", "Stella Bettermann"
Data.s "Stephanie Linnhe", "Steve Berry", "Steve Biddulph", "Steven Erikson", "Susan Abulhawa", "Susanne Gerdom", "Susanne Mischke"
Data.s "Sven Koch", "Sylvia Day", "Tad Williams", "Tana French", "Tatjana Kruse", "Terry Pratchett", "Terry Pratchett"
Data.s "Thomas Bogenberger", "Thomas Thiemeyer", "Tim Erzberg", "Tobias O. Meißner", "Tom Hillenbrand", "Tommy Jaud", "Tony Hillerman"
Data.s "Ule Hansen", "Ulrike Schweikert", "Ursula Poznanski", "Val McDermid", "Veit Heinichen", "Vincent Kliesch", "Viveca Sten"
Data.s "Volker Kutscher", "W.E.B. Griffin", "Walter von Lucadou", "Warhammer", "Weight Watchers", "Wendy Wax", "Will Jordan"
Data.s "Wladimir Kaminer", "Wolfgang Burger", "Wolfgang Herrndorf", "Wolfgang Schorlau", "Yasmine Galenorn", "Yvonne Winkler", "cd QUEEN - Jazz"
Data.s "end"
EndDataSection