Seite 1 von 1

Navigieren in einem ListIcongadget mit diesem Tool

Verfasst: 11.07.2019 17:44
von hjbremer
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

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
PS: wer mag darf es benutzen und verändern wie er will