ListViewGadget Text mit StrigGadget auswählen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

ListViewGadget Text mit StrigGadget auswählen

Beitrag von Pure_Beginner »

Hallo zusammen,

habe ein Anfänger Problem.

Möchte während der Eingabe in ein StringGadget das der Text in einen ListViewGadget selektiert wird und beim erreichen des richtigen Eintrags durch drücken der Tab Taste übernommen wird, andere Eingaben als die im ListViewGadget sollen nicht erlaubt sei.

Ganz schön viel auf einmal.

für Eure Hilfe wäre ich dankbar.

wenn es möglich wäre könntet ihr bitte das Ganze mit Kommentaren versehen, möchte gerne verstehen was da steht und aufarbeiten.

Grüße
Pure_Beginner
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: ListViewGadget Text mit StrigGadget auswählen

Beitrag von Andesdaf »

Code: Alles auswählen

; | --------------------- |
; |  SIMPLE AUTOCOMPLETE  |
; |                       |
; | Author: Andesdaf (de) |
; |                       |
; | --------------------- |

; Last change: 2012-03-01
; PB 4.60 B1

EnableExplicit

Enumeration       ; Zuweisung Fenster
  #WIN_MAIN
EndEnumeration

Enumeration       ; Zuweisung Gadgets
  #STR_EINGABE
  #LIV_AUSWAHL
EndEnumeration

Enumeration       ; Zuweisung Menüereignisse
  #VMI_TAB
EndEnumeration

Procedure AddElements()
  ; Elemente am Ende (-1) zum ListView hinzufügen 
  
  AddGadgetItem(#LIV_AUSWAHL, -1, "Hund")
  AddGadgetItem(#LIV_AUSWAHL, -1, "Katze")
  AddGadgetItem(#LIV_AUSWAHL, -1, "Maus")
  AddGadgetItem(#LIV_AUSWAHL, -1, "Pferd")
  AddGadgetItem(#LIV_AUSWAHL, -1, "Schildkröte")
EndProcedure

Procedure ShowResults()
  ; Text in String und ListView vergleichen und Eintrag markieren
  
  Protected i.i               =  0 ; zum Hochzählen
  Protected iResultPosition.i = -1 ; gefundene Position im ListView
  Protected sItem.s           = "" ; Text an Position im ListView
  Protected sString.s         = "" ; Text im String
  
  SetGadgetState(#LIV_AUSWAHL, -1) ; ListView-Markierung aufheben
  
  sString = GetGadgetText(#STR_EINGABE) ; Inhalt des Strings einlesen
  
  For i = 0 To CountGadgetItems(#LIV_AUSWAHL) ; alle Einträge im ListView durchgehen
    sItem = GetGadgetItemText(#LIV_AUSWAHL, i) ; Item-Text zuweisen
    If sString = sItem        ; Vergleich, ob Text im String = Text im Item
      iResultPosition = i     ; Wenn ja, Zuweisung der Position im ListView
    EndIf
  Next i
  
  If iResultPosition <> -1    ; Wenn gefunden
    SetGadgetState(#LIV_AUSWAHL, iResultPosition) ; Status des ListViews auf gefundene Position setzen
  EndIf
  
EndProcedure

Procedure MainWindow()
  Protected iEvent.i = 0

  ; Hauptfunktion
  If OpenWindow(#WIN_MAIN, 0,0, 150, 185, "Auswahl", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    StringGadget(#STR_EINGABE, 5,5, 140, 20, "")
    ListViewGadget(#LIV_AUSWAHL, 5, 30, 140, 150)
        
    AddElements() ; Elemente zum ListView hinzufügen
    
    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Tab, #VMI_TAB) ; Tastatur-Shortcut erstellen
    
    Repeat
       iEvent = WaitWindowEvent()
       
       Select iEvent
       
         Case #PB_Event_Gadget
           Select EventGadget()
           
             Case #STR_EINGABE   ; wen Aktion im String
               ShowResults()     ; Vergleichsfunktion aufrufen
             
           EndSelect
         
         Case #PB_Event_Menu
           Select EventMenu()
             
             Case #VMI_TAB  ; wenn Shortcut betätigt
               If GetGadgetText(#LIV_AUSWAHL) <> ""  ; prüfen ob Inhalt im String
                 Debug GetGadgetText(#LIV_AUSWAHL)   ; wenn ja, Ausgabe des Inhaltes im ListView
               Else
                 Debug "Nichts ausgewählt"  ; wenn nein, Hinweis
               EndIf
            
           EndSelect
       
       EndSelect
     Until iEvent = #PB_Event_CloseWindow
    
  EndIf
EndProcedure

MainWindow() ; Aufruf der Hauptfunktion
Win11 x64 | PB 6.20
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: ListViewGadget Text mit StrigGadget auswählen

Beitrag von Pure_Beginner »

Hallo zusammen,

Andesdaf Ansatz ist schon super und geht in die richtige Richtung,
Was ich suche ist aber noch etwas verzwickter.
beim Eintippen des Textes in das StringGadget soll der Text im Listview bereits beim Eintippen des ersten Buchstaben nur noch die entsprechenden Einträge anbieten und selektieren welche man dann mit der Tab Taste übernehmen kann.

Hoffentlich habe ich mich verständlich ausgedrückt.

Besten Dank für Eurere Unterstützung .
Und dir Andesdaf für die gute Kommentierung des Textes und deine Mühe. :allright:
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: ListViewGadget Text mit StrigGadget auswählen

Beitrag von Andesdaf »

Gesucht wird der Einfachheit halber im gesamten String.

[UPDATE] - ich habe den Code noch einmal erweitert, jetzt ist es möglich, mit den Pfeiltasten
im ListView zu navigieren. Die Suche erfolgt jetzt unabhängig von Groß- oder Kleinschreibung.

[UPDATE 2] - wenn nichts im String steht, wird auch nichts mehr im ListView markiert.

Code: Alles auswählen

; | --------------------- |
; |  SIMPLE AUTOCOMPLETE  |
; |                       |
; | Author: Andesdaf (de) |
; |                       |
; | --------------------- |

; Last change: 2012-03-01
; PB 4.60 B1

EnableExplicit

Enumeration       ; Zuweisung Fenster
  #WIN_MAIN
EndEnumeration

Enumeration       ; Zuweisung Gadgets
  #STR_EINGABE
  #LIV_AUSWAHL
EndEnumeration

Enumeration       ; Zuweisung Menüereignisse
  #VMI_TAB
  #VMI_UP
  #VMI_DOWN
EndEnumeration

Global NewList Eintraege.s() ; Erstellen einer neuen LinkedList

Procedure AddElements()
  ; Elemente zur LinkedList hinzufügen

  AddElement(Eintraege()) ; Element zur Liste hinzufügen
  Eintraege() = "Hund"    ; Bezeichnung des Elements
  
  AddElement(Eintraege())
  Eintraege() = "Hase"
  
  AddElement(Eintraege())
  Eintraege() = "Hundeleine"
  
  AddElement(Eintraege())
  Eintraege() = "Hasenkäfig"
  
  AddElement(Eintraege())
  Eintraege() = "Hasenfutter"
  
  SortList(Eintraege(), #PB_Sort_NoCase | #PB_Sort_Ascending) ; Liste sortieren
  
EndProcedure

Procedure AddElementsToListView()
  ; Elemente aus der LinkedList in das ListView übertragen
  ForEach Eintraege()
    AddGadgetItem(#LIV_AUSWAHL, -1, Eintraege()) ; für jedes Element in der Liste Eintrag erstellen
  Next
EndProcedure

Procedure ShowResults()
  ; Suchergebnisse anzeigen
  
  ClearGadgetItems(#LIV_AUSWAHL)  ; ListView leeren
  ResetList(Eintraege())          ; LinkedList auf Anfang setzen
  While NextElement(Eintraege())  ; Jedes Element der LinkedList durchgehen
    If FindString(LCase(Eintraege()), LCase(GetGadgetText(#STR_EINGABE))) <> 0 ; Nach in String eingegebener Kombination suchen, egal ob Groß/Kleinschreibung (LowerCase)
      AddGadgetItem(#LIV_AUSWAHL, -1, Eintraege()) ; wenn ja, Eintrag zur Liste hinzufügen
    EndIf
  Wend
  
  If GetGadgetText(#STR_EINGABE) = "" ; prüfen, ob etwas im String steht
    AddElementsToListView()  ; wenn nein, die Standardelemente zum ListView hinzufügen
  Else
    SetGadgetState(#LIV_AUSWAHL, 0) ; ListView auf den ersten Eintrag stellen
  EndIf
  
EndProcedure

Procedure MainWindow()
  Protected iEvent.i = 0

  ; Hauptfunktion
  If OpenWindow(#WIN_MAIN, 0,0, 150, 185, "Auswahl", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    StringGadget(#STR_EINGABE, 5,5, 140, 20, "")
    ListViewGadget(#LIV_AUSWAHL, 5, 30, 140, 150)
       
    AddElements() ; Elemente zur Liste hinzufügen
    AddElementsToListView() ; Listenelemente zum ListView hinzufügen
   
    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Tab , #VMI_TAB )  ; Tastatur-Shortcut erstellen
    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Up  , #VMI_UP  )  ; für Navigation im ListView
    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Down, #VMI_DOWN)  ; für Navigation im ListView
   
    Repeat
       iEvent = WaitWindowEvent()
       
       Select iEvent
       
         Case #PB_Event_Gadget
           Select EventGadget()
           
             Case #STR_EINGABE   ; wen Aktion im String
               ShowResults()     ; Vergleichsfunktion aufrufen
             
           EndSelect
         
         Case #PB_Event_Menu
           Select EventMenu()
             
             Case #VMI_TAB  ; wenn Shortcut betätigt
               If GetGadgetText(#LIV_AUSWAHL) <> ""  ; prüfen ob Inhalt im String
                 Debug GetGadgetText(#LIV_AUSWAHL)   ; wenn ja, Ausgabe des Inhaltes im ListView
               Else
                 Debug "Nichts ausgewählt"  ; wenn nein, Hinweis
               EndIf
               
             Case #VMI_UP
               If GetGadgetState(#LIV_AUSWAHL) > 0  ; prüfen, ob mindestens oberster Eintrag im ListView markiert ist
                 SetGadgetState(#LIV_AUSWAHL,GetGadgetState(#LIV_AUSWAHL) - 1) ; wenn nicht, Markierung um 1 nach oben verschieben
               EndIf
               
             Case #VMI_DOWN
               SetGadgetState(#LIV_AUSWAHL,GetGadgetState(#LIV_AUSWAHL) + 1) ; Markierung um 1 nach unten verschieben
               
           EndSelect
       
       EndSelect
     Until iEvent = #PB_Event_CloseWindow
   
  EndIf
EndProcedure

MainWindow() ; Aufruf der Hauptfunktion
Win11 x64 | PB 6.20
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: ListViewGadget Text mit StrigGadget auswählen

Beitrag von Bisonte »

Pure_Beginner hat geschrieben:... Und dir Andesdaf für die gute Kommentierung des Textes und deine Mühe. :allright:
Wollt ich grade sagen... das is ja mal sowas von vorbildlich :allright:

sorry für OT.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: ListViewGadget Text mit StrigGadget auswählen

Beitrag von Andesdaf »

danke, ich habe den Code oben noch leicht verbessert.
Win11 x64 | PB 6.20
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ListViewGadget Text mit StrigGadget auswählen

Beitrag von mk-soft »

Habe es mal mit diesen Code erweitert. Aber nach Remove TAB geht die Taste TAB nicht mehr?

Code: Alles auswählen

Case #STR_EINGABE   ; wen Aktion im String
               Select EventType()
                 Case #PB_EventType_Change
                   ShowResults()     ; Vergleichsfunktion aufrufen
                   
                 Case #PB_EventType_Focus
                   Debug "Add..."
                    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Tab , #VMI_TAB )  ; Tastatur-Shortcut erstellen
                    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Up  , #VMI_UP  )  ; für Navigation im ListView
                    AddKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Down, #VMI_DOWN)  ; für Navigation im ListView
                   
                  Case #PB_EventType_LostFocus
                    Debug "Remove..."
                    RemoveKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Tab)  ; Tastatur-Shortcut erstellen
                    RemoveKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Up)  ; für Navigation im ListView
                    RemoveKeyboardShortcut(#WIN_MAIN, #PB_Shortcut_Down)  ; für Navigation im ListView
             

Code: Alles auswählen

Case #VMI_TAB  ; wenn Shortcut betätigt
               If GetGadgetText(#LIV_AUSWAHL) <> ""  ; prüfen ob Inhalt im String
                 Debug GetGadgetText(#LIV_AUSWAHL)   ; wenn ja, Ausgabe des Inhaltes im ListView
               Else
                 Debug "Nichts ausgewählt"  ; wenn nein, Hinweis
               EndIf
               SetActiveGadget(GetActiveGadget() +1)
              
:(
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten