FindText Dialog mag Taste TAB nicht

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

FindText Dialog mag Taste TAB nicht

Beitrag von hjbremer »

Help !!!!!!!!!

Bin gerade dabei den nichtmodalen FindText Dialog auszuprobieren

Funktioniert auch alles soweit, bis auf eine Kleinigkeit
Die Dialogbox mag keine Tab Taste und wenn der Focus auf "weiter" steht kein Return

Was habe ich vergessen ?????

Code: Alles auswählen

Enumeration
 #win
 #db1
EndEnumeration

; ----------------------------------------------

Procedure LvGetCols(id)

Protected head = SendMessage_(id, #LVM_GETHEADER, 0, 0)
Protected cols = SendMessage_(head, #HDM_GETITEMCOUNT, 0, 0)

ProcedureReturn cols
EndProcedure

Procedure.s LvGetItem(pbnr, item, cols)

Protected j, x$ = ""

For j = 0 To cols
   x$ + GetGadgetItemText(pbnr, item, j) + #LF$
Next
   
ProcedureReturn x$
EndProcedure

; ----------------------------------------------
               
Procedure.i LvSuchenStart(hDlg, *p)

Static lvposi
Protected *fr.FINDREPLACE = *p
Protected ok, lvnr, cols, found
Protected such$, satz$
 
ok = GetDlgItemText_(hDlg, 1152, *fr\lpstrFindWhat, *fr\wFindWhatLen)

If ok   
   such$ = PeekS(*fr\lpstrFindWhat)     
   lvnr  = *fr\lCustData                
   cols  = LvGetCols(GadgetID(lvnr))    
   found = -1
   
   For j = lvposi To CountGadgetItems(lvnr) 
      satz$ = LvGetItem(lvnr, j, cols)       
      If FindString(satz$, such$, 0)  ;:Debug satz$      
         found = j                    ;:Debug found
         Break
      EndIf
   Next
   
   If found > -1
      SetGadgetState(lvnr, found)
      SendMessage_(GadgetID(lvnr), #LVM_ENSUREVISIBLE, found, 1)
      lvposi = found + 1      
   Else   
      lvposi = 0
      MessageRequester("", "nix gefunden")
   EndIf
               
EndIf 

EndProcedure

Procedure.i LvSuchenCB(hDlg, message, wparam, lparam)

Static *fr.FINDREPLACE 
Protected button 

Select message
   Case #WM_INITDIALOG
      *fr = lparam 
      SetWindowPos_(hDlg, 0, 200, 400, 0,0,#SWP_NOSIZE) 
      ShowWindow_(hDlg,1)
      
   Case #WM_COMMAND
      
      button = wparam & $ffff
      
      Select button
         Case 1:    ;Debug "weitersuchen"
                    LvSuchenStart(hDlg, *fr)               
         
;          Case 2:    Debug "abbrechen"
;          Case 1152: Debug "Stringgadget"  ;$480
;          Case 1040: Debug "ganzes Wort"
;          Case 1041: Debug "Groß Klein"
;          Case 1056: Debug "oben"
;          Case 1057: Debug "unten"
      
      EndSelect   
      
;  Default: DebugL(message)

EndSelect

ProcedureReturn 0
EndProcedure

Procedure.i LvSuchen(hwnd, lvnr)

Static fr.FINDREPLACE   ;muß static sein !!!!!!

szFindWhat.s{80}        ;buffer receiving string

szFindWhat = "Bremer"   ;vorgabe
 
fr\lStructSize = SizeOf(FINDREPLACE)
fr\hwndOwner = hwnd
fr\lpstrFindWhat = @szFindWhat
fr\wFindWhatLen = SizeOf(szFindWhat) 
fr\Flags = #FR_HIDEUPDOWN|#FR_HIDEWHOLEWORD|#FR_ENABLEHOOK
fr\lpfnHook = @LvSuchenCB()
fr\lCustData = lvnr

hdlg = FindText_(fr)    

EndProcedure

;Debug RegisterWindowMessage_("FINDMSGSTRING")

Dim subitem$(3,2)
Restore LvItemsData
For j = 0 To 3: Read.s subitem$(j,0): Next   
For j = 0 To 3: Read.s subitem$(j,1): Next   
For j = 0 To 3: Read.s subitem$(j,2): Next   

hwnd = OpenWindow(#win, 50, 100, 555, 340, "Test", #PB_Window_SystemMenu) 

ButtonGadget(#db1, 22, 300, 111, 33, "Dialog Suchen")

flag = #PB_ListIcon_GridLines
flag | #PB_ListIcon_FullRowSelect
flag | #PB_ListIcon_AlwaysShowSelection
lvnr = ListIconGadget(#PB_Any, 10, 10, 535, 280, "Sp 0", 50, flag)
       AddGadgetColumn(lvnr, 1, "Sp 1", 200)
       AddGadgetColumn(lvnr, 2, "Sp 2", 200)
       AddGadgetColumn(lvnr, 3, "Sp 3", 200)
       For j = 0 To 39
          a$ = Str(j) + #LF$
          a$ + subitem$(Random(3), 0) + #LF$
          a$ + subitem$(Random(3), 1) + #LF$
          a$ + subitem$(Random(3), 2) + #LF$
          AddGadgetItem(lvnr, -1, a$)
       Next

Repeat: event = WaitWindowEvent() 
   
   If event = #PB_Event_Gadget Or event = #PB_Event_Menu 
                  
      wB = EventGadget()        
      Select wB
            Case #db1: LvSuchen(hwnd, lvnr)
      EndSelect

   EndIf
    
Until event = #PB_Event_CloseWindow

End 

DataSection
LvItemsData:
Data.s "Bremer", "Meier", "Schulze", "Müller"
Data.s "Hamburg", "Berlin", "München", "Bremen"
Data.s "83", "67", "74", "92"
EndDataSection

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: FindText Dialog mag Taste TAB nicht

Beitrag von Josh »

ich weiß mom nicht, ob es das gleiche betrifft. aber ich hab in meiner eventschleife einen workaround einbauen müssen, damit der tab an das scintilla gadget weitergereicht wird. vieleicht hilft dir das:

Code: Alles auswählen

 ;Workaround, damit Tabtaste an Scintilla weitergereicht wird
  If Event = #WM_KEYDOWN
    If EventwParam() = #TAB
      If GetActiveGadget() = SciGadNr
        SendMessage_(GadgetID(SciGadNr), #WM_KEYDOWN, EventwParam(), EventlParam())
      EndIf
    EndIf
  EndIf
generell weiterreichen ist schlecht. ich hab mir das auch schon mal überlegt. aber das hat einen bestimmten grund, warum pb die tabtaste verschluckt. nur weiß ich es dank meiner ausgeprägten alzheimer nicht mehr :D
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: FindText Dialog mag Taste TAB nicht

Beitrag von Josh »

auch wenn ich bis jetzt nicht weiß, was da abgeht, ich finds cool. :allright:
wenn ich zeit dafür hab, werd ich meinen suchen/ersetzen dialog mal suchen und ersetzen :)

im unicode modus schmiert dein programm ab :mrgreen:
Antworten