Seite 5 von 6

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 24.02.2015 09:25
von ThoPie
Zunächst mal ein großes Lob für diese tolle Modul.
Ich habe es in mein Projekt eingebaut und es leistet mir tolle Dienste.

Nun habe ich mal noch 2 Fragen zu folgenden Realisierungsmöglichkeiten.

1. Ist es möglich beim Klick auf den Spaltenkopf die Sortierung (Aufsteigend - Absteigend - Aufsteigend usw.) umzusetzen.
2. Ist es möglich im Spaltenkopf durch Anzeige eines Symbols (Pfeil oder +/-) die aktuelle Sortierung anzuzeigen.

Vielen Dank.

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 22.03.2015 11:26
von Cebu-Uli
Auch von mir ein Lob für dein Modul. Sehr brauchbar. Doch leider bin ich bei der Benutzung auf einen Fehler gestoßen und möchte dich bitten, dir das mal anzusehen. Zur Demonstration habe ich dein Programmbeispiel etwas abgeändert:

Code: Alles auswählen

CompilerIf #PB_Compiler_IsMainFile
  #Window = 0
  #List   = 1
  #Font_Arial10B = 2
  #Font_Arial9I  = 3
  
  LoadFont(#Font_Arial10B,"Arial",10,#PB_Font_Bold)
  LoadFont(#Font_Arial9I,"Arial",9,#PB_Font_Italic)
  
  If OpenWindow(#Window,0,0,360,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ListIconGadget(#List,10,10,340,230,"Column 0",80,#PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_CheckBoxes)
    AddGadgetColumn(#List,1,"Column 1",80)
    AddGadgetColumn(#List,2,"Column 2",80)
    AddGadgetColumn(#List,3,"Number",54)
    AddGadgetColumn(#List,4,"Hide",40)
    UseModule ListIcon
      AddListItem(#List, -1, "Left"  +#LF$+ "Center"+#LF$+"Right"+#LF$+"2.66")
      AddListItem(#List, -1, "Alpha" +#LF$+ "Gamma" +#LF$+"Beta" +#LF$+"1.33")
      AddListItem(#List, -1, "Ärmel" +#LF$+ "Esel"  +#LF$+"Öfen" +#LF$+"2.33")
      AddListItem(#List, -1, "Besen" +#LF$+ "Gans"  +#LF$+"Quark" +#LF$+"10.33")
      AddListItem(#List, -1, "Faden" +#LF$+ "Affe"  +#LF$+"Zebra" +#LF$+"2.33")
      SetColumnFlag(#List, 1, #NoSort|#NoResize)
      SetColumnFlag(#List, 2, #NoEdit)
      SetColumnFlag(#List, 3, #Float) 
      ;SetColumnFlag(#List, 4, #Hide) ; Hide Column 4
    UnuseModule ListIcon
    
    CompilerIf #PB_OS_Windows
      UseModule ListIcon
      DefineListCallback(#List, #Edit|#NoResize)
      JustifyColumn(#List, 1, #Center)
      JustifyColumn(#List, 3, #Right)
      SetFont(#List, FontID(#Font_Arial10B), FontID(#Font_Arial9I))
      UnuseModule ListIcon
      Debug ListIcon::CountColumns(#List)
    CompilerEndIf
    
    ;MessageRequester("ListIcon Test","Sort ListIcon Items")
    ListIcon::SortListItems(#List, 0, ListIcon::#Descending)
    
    ;*************************************************                      FEHLER
    SetGadgetItemState(#List, 0, #PB_ListIcon_Checked); <====== Haken wird nach Einfügen der Spalte gelöscht!
    SetGadgetItemState(#List, 3, #PB_ListIcon_Checked); <====== Haken wird nach Einfügen der Spalte gelöscht!
    MessageRequester("ListIcon Test","Remove Column 1")
    ListIcon::RemoveListColumn(#List, 1)              ; <====== Spalte gelöscht
    MessageRequester("ListIcon Test","Add new Column 1")
    ListIcon::AddListColumn(#List, 1, "Column 1", 80) ; <====== Spalte eingefügt, danach fehlen die Haken und diverse Einträge
                                                              ; und die Daten werden in den Spalten teilweise nach rechts
                                                              ; verschoben. Es erscheinen sogar vorher gelöschte Werte wieder!
    ;*************************************************************************************************************************
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
CompilerEndIf
Wie schon in den Kommentaren geschrieben. Wenn man nach dem Löschen einer Spalte wieder eine neue Spalte einfügt, so werden die Haken aus den Checkboxen gelöscht, Daten zum Teil nach rechts in die leere Spalte verschoben und es erscheinen sogar wieder Daten, die durch das Löschen der Spalte vorher nicht mehr existieren sollten.
Ich würde mich freuen, wenn du diesen Fehler beseitigen könntest.

Gruss
Ulrich

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 24.03.2015 16:12
von Thorsten1867
- Erstes Problem (Löschen von Spalten) gelöst.
- Verzichte probeweise auf das Neuschreiben der Tabelleninhalte nach dem Einfügen der Spalte. Somit sollten eigentlich die Haken erhalten bleiben.

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 29.03.2015 13:06
von Cebu-Uli
Hallo Thorsten,

Dein AddListColumn() funktioniert leider auch nicht. Du möchtest Spalten nach einer anzugebenden Spalte einfügen (Add columns afterward). Du fügst jedoch nicht dahinter, sondern an Stelle der Spalte ein. Das funktioniert bei Spalte 0 aber überhaupt nicht, wie das folgende Beispiel zeigt:

Code: Alles auswählen

CompilerIf #PB_Compiler_IsMainFile
  #Window = 0
  #List   = 1
  #Font_Arial10B = 2
  #Font_Arial9I  = 3
  
  LoadFont(#Font_Arial10B,"Arial",10,#PB_Font_Bold)
  LoadFont(#Font_Arial9I,"Arial",9,#PB_Font_Italic)
  
  If OpenWindow(#Window,0,0,360,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ListIconGadget(#List,10,10,340,230,"Column 0",80,#PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_CheckBoxes)
    AddGadgetColumn(#List,1,"Column 1",80)
    AddGadgetColumn(#List,2,"Column 2",80)
    AddGadgetColumn(#List,3,"Number",54)
    AddGadgetColumn(#List,4,"Hide",40)
    UseModule ListIcon
      AddListItem(#List, -1, "Left"  +#LF$+ "Center"+#LF$+"Right"+#LF$+"2.66")
      AddListItem(#List, -1, "Alpha" +#LF$+ "Gamma" +#LF$+"Beta" +#LF$+"1.33")
      AddListItem(#List, -1, "Ärmel" +#LF$+ "Esel"  +#LF$+"Öfen" +#LF$+"2.33")
      AddListItem(#List, -1, "Besen" +#LF$+ "Gans"  +#LF$+"Quark" +#LF$+"10.33")
      AddListItem(#List, -1, "Faden" +#LF$+ "Affe"  +#LF$+"Zebra" +#LF$+"2.33")
      SetColumnFlag(#List, 1, #NoSort|#NoResize)
      SetColumnFlag(#List, 2, #NoEdit)
      SetColumnFlag(#List, 3, #Float) 
      ;SetColumnFlag(#List, 4, #Hide) ; Hide Column 4
    UnuseModule ListIcon
    
    CompilerIf #PB_OS_Windows
      UseModule ListIcon
      DefineListCallback(#List, #Edit|#NoResize)
      JustifyColumn(#List, 1, #Center)
      JustifyColumn(#List, 3, #Right)
      SetFont(#List, FontID(#Font_Arial10B), FontID(#Font_Arial9I))
      UnuseModule ListIcon
    CompilerEndIf
    
    ;MessageRequester("ListIcon Test","Sort ListIcon Items")
    ListIcon::SortListItems(#List, 0, ListIcon::#Descending)
    
   ;*************************************************           FEHLER
    MessageRequester("ListIcon Test","Remove Column 0")
    ListIcon::RemoveListColumn(#List, 0)              ; <====== Spalte 0 gelöscht
    MessageRequester("ListIcon Test","Add new Column hinter 0")
    ListIcon::AddListColumn(#List, 0, "Hinter 0", 80) ; <====== Neue Spalte hinter 0 eingefügt
                                                      ; Die Spalte wird jedoch nicht hinter 0, sondern als 0 eingefügt
                                                      ; Klickst du auf den Header, um zu sortieren, so ist alles weg!
    ;*****************************************************************************************************************
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
 
CompilerEndIf
Ich habe die fehlerhaften Prozeduren (die 2. hast du ja schon selber korriegiert eingestellt) selber auch neu geschrieben, so dass es jetzt hoffentlich funktioniert:

Code: Alles auswählen

  Procedure AddListColumn(GadgetID.i, Column.i, Titel.s, Width.i) ; Add columns afterward - Neue Version von Cebu-Uli
    Protected GID.s = Str(GadgetID), col.i, ColPos.i = 0, Text$
    AddGadgetColumn(GadgetID, Column+1, Titel, Width)
    ForEach ListIcon(GID)\Item()
      col = 0     
      While col <= CountColumns(GadgetID)-1
        If col = Column+1
          Text$ = Text$ + #LF$ + StringField(ListIcon(GID)\Item()\Text, col+1, #LF$) + #LF$
        Else
          Text$ = Text$ + StringField(ListIcon(GID)\Item()\Text, col+1, #LF$) + #LF$
        EndIf
        col+1
      Wend
      ListIcon(GID)\Item()\Text = Text$
      Text$ = ""       
    Next
  EndProcedure 
  
  Procedure RemoveListColumn(GadgetID.i, Column.i); Neue Version von Cebu-Uli
    Protected GID.s = Str(GadgetID), col.i, Text$
    RemoveGadgetColumn(GadgetID, Column) 
    ForEach ListIcon(GID)\Item()
      col = 0
      While col <= CountColumns(GadgetID)-1
        If col <> Column
          Text$ = Text$ + StringField(ListIcon(GID)\Item()\Text, col+1, #LF$) + #LF$
        EndIf
        col+1
      Wend
      ListIcon(GID)\Item()\Text = Text$
      Text$ = ""
    Next    
  EndProcedure
Gruss
Uli

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 30.03.2015 11:43
von Thorsten1867
Cebu-Uli hat geschrieben:Hallo Thorsten,
Dein AddListColumn() funktioniert leider auch nicht. Du möchtest Spalten nach einer anzugebenden Spalte einfügen (Add columns afterward). Du fügst jedoch nicht dahinter, sondern an Stelle der Spalte ein. Das funktioniert bei Spalte 0 aber überhaupt nicht, wie das folgende Beispiel zeigt:
Der Ort zum Einfügen stimmt (siehe Hilfe). Es war nur der Kommentar falsch.
Das Problem mit Spalte 0 ist ziemlich sicher nicht meine Schuld, da ich den Orginalbefehl von PB zum Einfügen nutze. Möglicherweise ein Bug?

Ich habe nun ein ReFill-Flag eingefügt, das den Inhalt der Tabelle nach dem Einfügen der Spalte neu befüllt, womit wieder alles an Ort und Stelle ist.
Allerdings dürften somit die Häkchen wieder verschwinden, solange Refill nicht auf #False gesetzt wird.

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 16.04.2015 12:05
von Cebu-Uli
Leider habe ich schon wieder mehrere Probleme mit deinem Modul. :cry:
Mal abgesehen davon, dass bei AddListColumn() weiterhin bestehende Häkchen aus den Checkboxen verschwinden, so geschieht dasselbe auch, wenn man zum Sortieren auf den Header einer Spalte klickt. Dazu habe ich SortListItems() mal etwas ergänzt:

Code: Alles auswählen

 Procedure SortListItems(GadgetID.i, SortCol.i, Flags.l=#False)
    ; Flags: #UserSort / #Descending / #Ascending / #CaseSensitive / #CaseInSensitive
    ; SortCol: #Default (if #UserSort)
    Protected Row.i, GID.s = Str(GadgetID), ColumnFlag = ListIcon(GID)\Column(Str(SortCol))
    
    ; --------------------------------------------------------- Eingefügt vonCebu-Uli ------------------------------
    ;bewirkt, dass beim Sortieren oder Klick auf den Header einer Tabellenspalte die Checkbox-Inhalte nicht verloren gehen
    Protected.i i
    
    For i = 0 To CountGadgetItems(GadgetID)-1
      If GetGadgetItemState(GadgetID, i) = #PB_ListIcon_Checked
        SetListItemData(GadgetID, i, 1)
      Else
        SetListItemData(GadgetID, i, 0)
      EndIf
    Next i
    ; ------------------------------------------------------------------------------------------------------------------    
    
    If ListSize(ListIcon(GID)\Item())
      If ColumnFlag & #Integer   ;{ Sort Integer
        SetSortOrderInteger(GadgetID, Flags, SortCol)
        If Flags & #Descending
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Descending, OffsetOf(ListItemStructure\SortInteger), TypeOf(ListItemStructure\SortInteger))
        Else
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Ascending, OffsetOf(ListItemStructure\SortInteger), TypeOf(ListItemStructure\SortInteger))
        EndIf ;}
      ElseIf ColumnFlag & #Float ;{ Sort Float
        SetSortOrderFloat(GadgetID, Flags, SortCol)
        If Flags & #Descending
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Descending, OffsetOf(ListItemStructure\SortFloat), TypeOf(ListItemStructure\SortFloat))
        Else
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Ascending, OffsetOf(ListItemStructure\SortFloat), TypeOf(ListItemStructure\SortFloat))
        EndIf ;}
      ElseIf ColumnFlag & #UserSort ;{ Sort User
        SetSortUserOrder(GadgetID, Flags, SortCol)
        If Flags & #Descending
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Descending, OffsetOf(ListItemStructure\Sort), TypeOf(ListItemStructure\Sort))
        Else
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Ascending, OffsetOf(ListItemStructure\Sort), TypeOf(ListItemStructure\Sort))
        EndIf
      Else                       ;{ Sort String
        If Flags & #UserSort
          SetSortUserOrder(GadgetID, Flags, SortCol)
        Else
          SetSortOrder(GadgetID, Flags, SortCol)
        EndIf
        If Flags & #Descending
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Descending, OffsetOf(ListItemStructure\Sort), TypeOf(ListItemStructure\Sort))
        Else
          SortStructuredList(ListIcon(GID)\Item(), #PB_Sort_Ascending, OffsetOf(ListItemStructure\Sort), TypeOf(ListItemStructure\Sort))
        EndIf ;}
      EndIf
      ClearGadgetItems(GadgetID) 
      ForEach ListIcon(GID)\Item()
        AddGadgetItem(GadgetID, Row, ListIcon(GID)\Item()\Text)
        SetGadgetItemData(GadgetID, Row, ListIcon(GID)\Item()\ItemData)
        Row + 1
      Next
      
    ; --------------------------------------------------------- Eingefügt von Cebu-Uli ------------------------------
    ;bewirkt, dass beim Sortieren oder Klick auf den Header einer Tabellenspalte die Checkbox-Inhalte nicht verloren gehen 
      
      For i = 0 To CountGadgetItems(GadgetID)-1
        If GetListItemData(GadgetID, i) = 1
          SetGadgetItemState(GadgetID, i, #PB_ListIcon_Checked)
        EndIf
      Next i
    ; ------------------------------------------------------------------------------------------------------------------      
      
    EndIf
  EndProcedure
Wenn man im ListIcon rechts noch Platz neben der letzten Spalte hat und man klickt in diesen Bereich mit Doppelklick, so crasht das Modul in ListIconCallback(), weil dort width > 32767 wird. Das habe ich mit der folgenden Zeile einfach abgefangen:

Code: Alles auswählen

If width > 32767 : width = 32767 : EndIf
Das nächste Problem betrifft ebenfalls diese Prozedur. Nach DefineListCallback() funktioniert SetColumnFlag() mit dem Parameter #Hide nicht mehr, ebensowenig wie der Original-PB-Befehl SetGadgetItemAttribute().
Dazu habe ich ebenfalls Änderungen in ListIconCallback() vorgenommen. Deshalb hier die komplette Procedure:

Code: Alles auswählen

Procedure.i ListIcon_CallBack(hWnd, Message, wParam, lParam)
        Protected.i Column, x, y, width, height, i
        Protected *ListEdit.ListEditStructure = GetWindowLongPtr_(hWnd, #GWL_USERDATA)
        Protected *Header.HD_NOTIFY, *nm.NMHDR, *nmhdr.NMHEADER, MouseClick.LVHITTESTINFO, rect.rect
        Protected HDItem.HD_ITEM, ColsCount.i = SendMessage_(*ListEdit\HeaderHnd, #HDM_GETITEMCOUNT, 0, 0)
        Protected GID.s=Str(*ListEdit\GadgetID), SortDirection.l, Flags.l = ListIcon(GID)\Flags
        Protected Result.i = CallWindowProc_(*ListEdit\CallBack, hWnd, Message, wParam, lParam)
        Select Message
          Case #WM_NOTIFY            ;{ ListIcon
            If Flags & #Edit         ;{ Edit
              *nm = lParam
              If *nm\hWndFrom = *ListEdit\HeaderHnd
                StopListEdit(*ListEdit)
              EndIf
            EndIf ;}
            *nmhdr = lParam          ;{ Column NoResize/Hide
            If *nmhdr\hdr\code = #HDN_ITEMCHANGING
              Column = *nmhdr\iItem
              ;==========================================================================
              ;Original
              ;If ListIcon(GID)\Column(Str(Column)) & #NoResize Or ListIcon(GID)\Column(Str(Column)) & #Hide Or Flags & #NoResize
              ;  Result=#True
              ;EndIf
              
              ;Änderung durch Cebu-Uli
              If ListIcon(GID)\Column(Str(Column)) & #NoResize Or Flags & #NoResize
                Result=#True
              EndIf
              If ListIcon(GID)\Column(Str(Column)) & #Hide
                Result=#False
              EndIf
            ;===========================================================================  
            EndIf ;}
            *Header = lParam         ;{ Header Click 
            If *Header\hdr\code=#HDN_ITEMCLICK
              Column = *Header\iItem
              If Not ListIcon(GID)\Column(Str(Column)) & #NoSort
                HDItem\mask = #HDI_FORMAT
                For i = 0 To ColsCount - 1
                  If i <> column   
                    SendMessage_(*ListEdit\HeaderHnd, #HDM_GETITEM, i, HDItem)
                    HDItem\fmt & ~ (#HDF_SORTDOWN | #HDF_SORTUP)
                    SendMessage_(*ListEdit\HeaderHnd, #HDM_SETITEM, i, HDItem)
                  EndIf
                Next
                SendMessage_(*ListEdit\HeaderHnd, #HDM_GETITEM, Column, HDItem)
                If HDItem\fmt & #HDF_SORTDOWN                             
                  HDItem\fmt & ~ #HDF_SORTDOWN
                  HDItem\fmt | #HDF_SORTUP
                  SortDirection = #Descending
                Else
                  HDItem\fmt & ~ #HDF_SORTUP
                  HDItem\fmt | #HDF_SORTDOWN
                  SortDirection = #Ascending
                EndIf
                Flags & ~ (#Ascending|#Descending)
                SendMessage_(*ListEdit\HeaderHnd, #HDM_SETITEM, Column, HDItem)
                SortListItems(*ListEdit\GadgetID, Column, Flags|SortDirection)
              EndIf
            EndIf ;}
                  ;}
          Case #WM_MOUSEMOVE         ;{ Mouse position
            If *ListEdit\EditFlag = #False
              *ListEdit\lParam = lParam
            EndIf ;}
          Case #WM_VSCROLL, #WM_HSCROLL, #WM_RBUTTONDOWN, #WM_LBUTTONDOWN ;{
            StopListEdit(*ListEdit)
            ;}
          Case #WM_LBUTTONDBLCLK     ;{ Left mouse button   
            If Flags & #Edit
              StopListEdit(*ListEdit)
              MouseClick\pt\x = *ListEdit\points\x  ; \points <- #WM_MOUSEMOVE
              MouseClick\pt\y = *ListEdit\points\y 
              SendMessage_(hWnd, #LVM_SUBITEMHITTEST, 0, MouseClick)           
              *ListEdit\Row    = MouseClick\iitem
              *ListEdit\Column = MouseClick\iSubItem
              If Not ListIcon(GID)\Column(Str(MouseClick\iSubItem)) & #NoEdit  
                rect\top    = *ListEdit\Column         
                rect\left   = #LVIR_LABEL
                SendMessage_(hWnd, #LVM_GETSUBITEMRECT, *ListEdit\Row, rect)               
                *ListEdit\CellText = GetGadgetItemText(*ListEdit\GadgetID, *ListEdit\Row, *ListEdit\Column)               
                x = rect\left + 1
                y = rect\top  + 0
                width  = rect\right  - rect\left - 1
                If width > 32767 : width = 32767 : EndIf; <======= Eingefügt von Cebu-Uli, da es bei width > 32767 beim ResizeGadget zum Crash kommt ========
                height = rect\bottom - rect\top  - 0
                ResizeGadget(*ListEdit\StrgID, x, y, width, height)
                SetGadgetText(*ListEdit\StrgID, *ListEdit\CellText)
                HideGadget(*ListEdit\StrgID, 0)
                SetActiveGadget(*ListEdit\StrgID)
                *ListEdit\EditFlag = #True
              EndIf
            EndIf
            ;}
        EndSelect
        ProcedureReturn Result
      EndProcedure
Das sind natürlich nur meine Lösungsvorschläge. Hat bei mir erst einmal funktioniert, ist aber sicherlich noch nicht genug getestet. Du darfst es gerne besser machen! Ist schließlich dein Modul.

Viele Grüße

Uli

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 14.05.2015 19:45
von Thorsten1867
Bugfixes in Bezug auf Hinzufügen und Entfernen von Spalten.

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 13.06.2015 15:24
von chrischan
Top Modul :allright:

Ist es vorgesehen, dass Images hinzugefügt werden können (setgadgetitemimage()) weil die verschwinden beim Sortieren automatisch?

Gruß
Chrischan

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 14.06.2015 13:41
von Thorsten1867
Update:
- Changed: AddListItem(GadgetID.i, Position.i, Text.s, UserSort.s="", ImageID.i=#False)
- Add: SetListItemImage(GadgetID.i, Position.i, ImageID.i)

Re: Module: ListIcon Plus - Edit & Sort (deu.)

Verfasst: 14.06.2015 14:34
von ts-soft
Ein paar Fehlermeldungen zu Linux:
Zeile 336: ListIconID nicht definiert
Zeile 381: Structure field not found: ImageID

Gruß
Thomas