Seite 1 von 1

Klick auf Column Spalten

Verfasst: 28.04.2008 16:08
von Holger01
Hallo,
ich beschäftige michs seit ein paar Tagen mit PB und habe ein Frage an die Experten.
Ich habe hier zwei Gadget "ListIconGadget" und "TextGadget" bei dem ListIconGadget kann ich durch klicken auf die Namen die Column auf-und absteigend sortieren lassen.

Jetzt möchte ich zwei weitere Funktionen einbauen, leider komme ich damit nicht klar.
Ich möchte jetzt durch einen einmaligen klick auf eine Spalte den Inhalt der dazugehörenden Variable (d0.s bis d7.s) in dem TextGadget rechts anzeigen lassen.
Die zweite Sache wäre, wenn ich zweimal auf einen Spalteneintrag klicke, sollte sich ein neues Window mit einem TextGadget öffnen und die dazugehörende Variable (e0.s bis e7.s) anzeigen.

Ich habe schon im Codearchiv geschaut und einiges dazu gefunden, leider komme ich nciht klar wie ich diese drei Routinen zusammen bekommen.

Vielleicht könnte mir jemand ein bischen helfen.

Gruss Holger

Code: Alles auswählen

 ;Test Variablen
 
 a0.s= "Sabine"
 b0.s= "Karinerstrasse 2"
 c0.s= "033-5435434534"
 d0.s= "Rechts 0"
 e0.s= "Window 0-ABC"
  
 a1.s= "Peter"
 b1.s= "Morenstrasse 12"
 c1.s= "030-5435434534"
 d1.s= "Rechts 1"
 e1.s= "Window 1-DEF"
 
 a2.s= "Klaus"
 b2.s= "Rangoffstrasse 422"
 c2.s= "089-34534534534"
 d2.s= "Rechts 2"
 e2.s= "Window 2-GHI"
 
 a3.s= "Dieter"
 b3.s= "Debattenstrasse 242"
 c3.s= "010-3765756642"
 d3.s= "Rechts 3"
 e3.s= "Window 3-JKL"
 
 a4.s= "Stefen"
 b4.s= "Kölnerstrasse 222"
 c4.s= "090-34345435342"
 d4.s= "Rechts 4"
 e4.s= "Window 4-MNO"
 
 a5.s= "Rainer"
 b5.s= "Simmstrasse 232"
 c5.s= "070-342342342"
 d5.s= "Rechts 5"
 e5.s= "Window 5-PQR"
 
 a6.s= "Holger"
 b6.s= "Kalkstrasse 22"
 c6.s= "060-33333332"
 d6.s= "Rechts 6"
 e6.s= "Window 6-STU"
 
 a7.s= "Inge"
 b7.s= "Bongostrasse 22"
 c7.s= "020-3423423423"
 d7.s= "Rechts 7"
 e7.s= "Window 7-VWX"
 
 
 
 
 
 

Structure PB_ListIconItem 
  UserData.l 
EndStructure 

#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54 
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55 
Global ListIconGadget.l, Buffer1.l, Buffer2.l, lvi.LV_ITEM, updown.l, lastcol.l 
Buffer1 = AllocateMemory(128) 
Buffer2 = AllocateMemory(128) 

Procedure CompareFunc(*item1.PB_ListIconItem, *item2.PB_ListIconItem, lParamSort) 
  result = 0 
  lvi\iSubItem = lParamSort 
  lvi\pszText = Buffer1 
  lvi\cchTextMax = 512 
  lvi\Mask = #LVIF_TEXT 
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item1\UserData, @lvi) 
  lvi\pszText = Buffer2 
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item2\UserData, @lvi) 
  Seeker1 = Buffer1 
  Seeker2 = Buffer2 
  done = 0 
  While done=0 
    char1 = Asc(UCase(Chr(PeekB(Seeker1)))) 
    char2 = Asc(UCase(Chr(PeekB(Seeker2)))) 
    result = (char1-char2)*updown 
    If result<>0 Or (Seeker1-Buffer1)>511 
      done = 1 
    EndIf 
    Seeker1+1 
    Seeker2+1 
  Wend 
  ProcedureReturn result 
EndProcedure 

 Procedure UpdatelParam() 
  Protected i.l, lTmp.l, lRecs.l, lvi.LV_ITEM 
  lRecs = SendMessage_(ListIconGadget, #LVM_GETITEMCOUNT, 0, 0) 
  For i = 0 To lRecs - 1 
    SetGadgetItemData(GetDlgCtrlID_(ListIconGadget), i, i) 
  Next 
EndProcedure 

Procedure ColumnClickCallback(hwnd, uMsg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select uMsg 
    Case #WM_NOTIFY 
      *msg.NMHDR = lParam 
      If *msg\hwndFrom = ListIconGadget And *msg\code = #LVN_COLUMNCLICK 
        *pnmv.NM_LISTVIEW = lParam 
        If lastcol<>*pnmv\iSubItem 
          updown = 1 
        EndIf 
        SendMessage_(ListIconGadget, #LVM_SORTITEMS, *pnmv\iSubItem, @CompareFunc()) 
        UpdatelParam() 
        UpdateWindow_(ListIconGadget) 
        lastcol = *pnmv\iSubItem 
        updown = -updown 
      EndIf 
  
  EndSelect 

  ProcedureReturn result 
EndProcedure 
 
If OpenWindow(0, 50, 50,900, 400, "Column Sortierung", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget) 
 
 ;Gadget links
 
  If CreateGadgetList(WindowID(0)) 
    ListIconGadget = ListIconGadget(0, 0, 0, 460, 200, "ID", 50, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect) 
    AddGadgetColumn(0, 1, "Name", 100) 
    AddGadgetColumn(0, 2, "Adresse", 150) 
    AddGadgetColumn(0, 3, "Telefon", 150) 
    
    AddGadgetItem(0, 0, "0"+Chr(10)+a0+Chr(10)+b0+Chr(10)+c0)
    AddGadgetItem(0, 1, "1"+Chr(10)+a1+Chr(10)+b1+Chr(10)+c1)
    AddGadgetItem(0, 2, "2"+Chr(10)+a2+Chr(10)+b2+Chr(10)+c2)
    AddGadgetItem(0, 3, "3"+Chr(10)+a3+Chr(10)+b3+Chr(10)+c3)
    AddGadgetItem(0, 4, "4"+Chr(10)+a4+Chr(10)+b4+Chr(10)+c4)
    AddGadgetItem(0, 5, "5"+Chr(10)+a5+Chr(10)+b5+Chr(10)+c5)
    AddGadgetItem(0, 6, "6"+Chr(10)+a6+Chr(10)+b6+Chr(10)+c6)  
    AddGadgetItem(0, 7, "7"+Chr(10)+a7+Chr(10)+b7+Chr(10)+c7)
 
  updown = 1 
  lastcol = 0 
  UpdatelParam() 
  SetWindowCallback(@ColumnClickCallback()) 
  
  ;Gadget rechts
  
  TextGadget(2, 550, 5, 250, 200, "Rechts 0-7", #PB_Text_Center|#PB_Text_Border)

  Repeat 
    EventID = WaitWindowEvent() 
  Until EventID = #PB_Event_CloseWindow 
EndIf 
 
 EndIf

Verfasst: 05.05.2008 12:08
von Shardik
Holger01 hat geschrieben: Ich möchte jetzt durch einen einmaligen klick auf eine Spalte den Inhalt der dazugehörenden Variable (d0.s bis d7.s) in dem TextGadget rechts anzeigen lassen.
Die zweite Sache wäre, wenn ich zweimal auf einen Spalteneintrag klicke, sollte sich ein neues Window mit einem TextGadget öffnen und die dazugehörende Variable (e0.s bis e7.s) anzeigen.
Der Trick besteht darin, zwei zusätzliche unsichtbare Spalten mit der Länge 0 anzulegen, sodaß die Spalteninhalte der Variablen d0..d7 und e0..e7 nicht angezeigt, aber trotzdem mitsortiert werden. Dann muß in die Repeat...Until-Schleife am Schluß nur noch eine Behandlung von Einfach- und Doppelklick-Ereignissen eingebaut werden, und schon sollten die beiden gewünschten Funktionen funktionieren:

Code: Alles auswählen

;Test Variablen 
  
 a0.s= "Sabine" 
 b0.s= "Karinerstrasse 2" 
 c0.s= "033-5435434534" 
 d0.s= "Rechts 0" 
 e0.s= "Window 0-ABC" 
  
 a1.s= "Peter" 
 b1.s= "Morenstrasse 12" 
 c1.s= "030-5435434534" 
 d1.s= "Rechts 1" 
 e1.s= "Window 1-DEF" 
  
 a2.s= "Klaus" 
 b2.s= "Rangoffstrasse 422" 
 c2.s= "089-34534534534" 
 d2.s= "Rechts 2" 
 e2.s= "Window 2-GHI" 
  
 a3.s= "Dieter" 
 b3.s= "Debattenstrasse 242" 
 c3.s= "010-3765756642" 
 d3.s= "Rechts 3" 
 e3.s= "Window 3-JKL" 
  
 a4.s= "Stefen" 
 b4.s= "Kölnerstrasse 222" 
 c4.s= "090-34345435342" 
 d4.s= "Rechts 4" 
 e4.s= "Window 4-MNO" 
  
 a5.s= "Rainer" 
 b5.s= "Simmstrasse 232" 
 c5.s= "070-342342342" 
 d5.s= "Rechts 5" 
 e5.s= "Window 5-PQR" 
  
 a6.s= "Holger" 
 b6.s= "Kalkstrasse 22" 
 c6.s= "060-33333332" 
 d6.s= "Rechts 6" 
 e6.s= "Window 6-STU" 
  
 a7.s= "Inge" 
 b7.s= "Bongostrasse 22" 
 c7.s= "020-3423423423" 
 d7.s= "Rechts 7" 
 e7.s= "Window 7-VWX" 
  
  
  
  
  
  

Structure PB_ListIconItem 
  UserData.l 
EndStructure 

#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54 
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55 
Global ListIconGadget.l, Buffer1.l, Buffer2.l, lvi.LV_ITEM, updown.l, lastcol.l 
Buffer1 = AllocateMemory(128) 
Buffer2 = AllocateMemory(128) 

Procedure CompareFunc(*item1.PB_ListIconItem, *item2.PB_ListIconItem, lParamSort) 
  result = 0 
  lvi\iSubItem = lParamSort 
  lvi\pszText = Buffer1 
  lvi\cchTextMax = 512 
  lvi\Mask = #LVIF_TEXT 
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item1\UserData, @lvi) 
  lvi\pszText = Buffer2 
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item2\UserData, @lvi) 
  Seeker1 = Buffer1 
  Seeker2 = Buffer2 
  done = 0 
  While done=0 
    char1 = Asc(UCase(Chr(PeekB(Seeker1)))) 
    char2 = Asc(UCase(Chr(PeekB(Seeker2)))) 
    result = (char1-char2)*updown 
    If result<>0 Or (Seeker1-Buffer1)>511 
      done = 1 
    EndIf 
    Seeker1+1 
    Seeker2+1 
  Wend 
  ProcedureReturn result 
EndProcedure 

 Procedure UpdatelParam() 
  Protected i.l, lTmp.l, lRecs.l, lvi.LV_ITEM 
  lRecs = SendMessage_(ListIconGadget, #LVM_GETITEMCOUNT, 0, 0) 
  For i = 0 To lRecs - 1 
    SetGadgetItemData(GetDlgCtrlID_(ListIconGadget), i, i) 
  Next 
EndProcedure 

Procedure ColumnClickCallback(hwnd, uMsg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select uMsg 
    Case #WM_NOTIFY 
      *msg.NMHDR = lParam 
      If *msg\hwndFrom = ListIconGadget And *msg\code = #LVN_COLUMNCLICK 
        *pnmv.NM_LISTVIEW = lParam 
        If lastcol<>*pnmv\iSubItem 
          updown = 1 
        EndIf 
        SendMessage_(ListIconGadget, #LVM_SORTITEMS, *pnmv\iSubItem, @CompareFunc()) 
        UpdatelParam() 
        UpdateWindow_(ListIconGadget) 
        lastcol = *pnmv\iSubItem 
        updown = -updown 
      EndIf 
  
  EndSelect 

  ProcedureReturn result 
EndProcedure 
  
If OpenWindow(0, 50, 50,900, 400, "Column Sortierung", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  
 ;Gadget links 
  
  If CreateGadgetList(WindowID(0)) 
    ListIconGadget = ListIconGadget(0, 0, 0, 460, 200, "ID", 50, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect) 
    AddGadgetColumn(0, 1, "Name", 100) 
    AddGadgetColumn(0, 2, "Adresse", 150) 
    AddGadgetColumn(0, 3, "Telefon", 150) 
    AddGadgetColumn(0, 4, "d", 0) 
    AddGadgetColumn(0, 5, "e", 0) 
    
    AddGadgetItem(0, 0, "0"+Chr(10)+a0+Chr(10)+b0+Chr(10)+c0+Chr(10)+d0+Chr(10)+e0) 
    AddGadgetItem(0, 1, "1"+Chr(10)+a1+Chr(10)+b1+Chr(10)+c1+Chr(10)+d1+Chr(10)+e1) 
    AddGadgetItem(0, 2, "2"+Chr(10)+a2+Chr(10)+b2+Chr(10)+c2+Chr(10)+d2+Chr(10)+e2)
    AddGadgetItem(0, 3, "3"+Chr(10)+a3+Chr(10)+b3+Chr(10)+c3+Chr(10)+d3+Chr(10)+e3)
    AddGadgetItem(0, 4, "4"+Chr(10)+a4+Chr(10)+b4+Chr(10)+c4+Chr(10)+d4+Chr(10)+e4)
    AddGadgetItem(0, 5, "5"+Chr(10)+a5+Chr(10)+b5+Chr(10)+c5+Chr(10)+d5+Chr(10)+e5)
    AddGadgetItem(0, 6, "6"+Chr(10)+a6+Chr(10)+b6+Chr(10)+c6+Chr(10)+d6+Chr(10)+e6)
    AddGadgetItem(0, 7, "7"+Chr(10)+a7+Chr(10)+b7+Chr(10)+c7+Chr(10)+d7+Chr(10)+e7)
  
    updown = 1 
    lastcol = 0 
    UpdatelParam() 
    SetWindowCallback(@ColumnClickCallback()) 
  
    ;Gadget rechts 
  
    TextGadget(2, 550, 5, 250, 200, "Rechts 0-7", #PB_Text_Center|#PB_Text_Border) 

    Repeat
      EventID = WaitWindowEvent()

      If EventGadget() = 0
        Select EventType()
          Case #PB_EventType_LeftClick
            SetGadgetText(2, GetGadgetItemText(0, GetGadgetState(0), 4))
          Case #PB_EventType_LeftDoubleClick
            OpenWindow(1, 0, 0, 200, 35, "e", #PB_Window_SystemMenu|#PB_Window_ScreenCentered, WindowID(0))
            CreateGadgetList(WindowID(1))
            TextGadget(3, 10, 10, 80, 15, "")
            SetGadgetText(3, GetGadgetItemText(0, GetGadgetState(0), 5))
            While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
            CloseWindow(1)
        EndSelect
      EndIf
    Until EventID = #PB_Event_CloseWindow 
  EndIf
EndIf
Die Ermittlung der angeklickten Zeilennummer in einem ListIconGadget ist mit GetGadgetState() sehr einfach. Falls Du auch die angeklickte Spaltennummer benötigst, wird es etwas komplizierter. Dafür muß dann die ColumnClickCallback-Funktion angepaßt werden, weil PureBASIC dafür (noch) keine native Funktion mitbringt. Melde Dich einfach noch einmal, wenn Du vielleicht in einem späteren Stadium Deines Programms die angeklickte Spaltennummer auch noch benötigst... :wink: