Seite 1 von 1

ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 22:10
von marcelx
Hallo,

ich verwende ListIconGadget mit dem Flag #PB_ListIcon_HeaderDragDrop
Frage:
Wie kann ich die Reihenfolge der Spalten Auslesen ?

Vielen Dank schon mal im Voraus

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 22:17
von c4s
Ich habe folgendes in meinem Code-Archiv gefunden:

Code: Alles auswählen

; Retrieves order/position of specified list column 'Index'.
; @param ColumnCount - Number of columns, '0' to try retrieving it automatically
; @return Position, '-1' if an error occurred
Procedure ListColumnIndexOrderGet(GadgetNr, Index, ColumnCount=0)
	Protected HeaderID
	Protected Column
	Protected Result = -1

	HeaderID = SendMessage_(GadgetID(GadgetNr), #LVM_GETHEADER, 0, 0)

	If ColumnCount < 1
		ColumnCount = SendMessage_(HeaderID, #LVM_GETITEMCOUNT, 0, 0)
		If ColumnCount < 1 : ProcedureReturn Result : EndIf
	EndIf

	Dim ColumnOrder(ColumnCount - 1)

	If SendMessage_(HeaderID, #HDM_GETORDERARRAY, ColumnCount, @ColumnOrder())
		For Column = 0 To ColumnCount - 1
			If Index = ColumnOrder(Column)
				Result = Column
				Break
			EndIf
		Next
	EndIf

	ProcedureReturn Result
EndProcedure
...Im Array ColumnOrder() steht dann die Reihenfolge. Die Procedure müsstest du also eventuell noch deinen Bedürfnissen anpassen.

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 22:19
von Kiffi
ich hätte spontan geschrieben "mit GetGadgetItemText()".

Allerdings wird hierbei die Reihenfolge ignoriert. Ein Bug?

Code: Alles auswählen

OpenWindow(0, 10, 10, 400, 400, "")

ListIconGadget(0, 10, 10, 300, 300, "col1", 100, #PB_ListIcon_HeaderDragDrop)
AddGadgetColumn(0, 1, "col2", 100)

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

Debug GetGadgetItemText(0, -1, 0)
Debug GetGadgetItemText(0, -1, 1)
Grüße ... Peter

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 22:20
von RSBasic
Wenn es darum geht, deine Daten in den einzelnen Spalten hinzuzufügen, ist es egal. PB merkt sich das:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1, 0, 0, WindowWidth(0), WindowHeight(0)-40, "Spalte 1", 100, #PB_ListIcon_HeaderDragDrop)
  AddGadgetColumn(1, 1, "Spalte 2", 100)
  AddGadgetColumn(1, 2, "Spalte 3", 100)
  AddGadgetColumn(1, 3, "Spalte 4", 100)
  
  ButtonGadget(2, WindowWidth(0)-110, WindowHeight(0)-30, 100, 20, "Hinzufügen", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 2
            AddGadgetItem(1, -1, "Text 1" + Chr(10) + "Text 2" + Chr(10) + "Text 3" + Chr(10) + "Text 4", 0, 0)
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Wenn du einige Spalten verschiebst und anschließend einen weiteren Datensatz hinzufügst, werden die neuen Daten ebenfalls in der ursprünglichen Reihenfolge angezeigt.
Oder gibt es einen anderen Grund, warum du die Reihenfolge auslesen möchtest? Oder möchtest du die Reihenfolge der Spalten als Einstellung speichern, damit der Benutzer die Spalten nicht erneut verschieben muss?

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 22:35
von marcelx
@Kifi
ich hätte spontan geschrieben "mit GetGadgetItemText()"
die Reihefolge ist immer gleich.

@c4s
Mit deine Code bekomme ich immer -1 zurück

@RSBasic
Oder möchtest du die Reihenfolge der Spalten als Einstellung speichern, damit der Benutzer die Spalten nicht erneut verschieben muss?
Ja, genau das

Gruß
MarcelX

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 23:29
von RSBasic
Dafür gibt es #LVM_GETCOLUMNORDERARRAY und #LVM_SETCOLUMNORDERARRAY.
Diese beiden Windows Messages kannst du mit SendMessage_() sowohl die Reihenfolge der Spalten ermitteln als auch setzen.
Beispielcode:

Code: Alles auswählen

EnableExplicit

Define a
Define LV_ColumnTotal

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1, 0, 0, WindowWidth(0), WindowHeight(0)-40, "Spalte 1", 100, #PB_ListIcon_HeaderDragDrop)
  AddGadgetColumn(1, 1, "Spalte 2", 100)
  AddGadgetColumn(1, 2, "Spalte 3", 100)
  AddGadgetColumn(1, 3, "Spalte 4", 100)
  
  ButtonGadget(2, WindowWidth(0)-210, WindowHeight(0)-30, 200, 20, "Spaltenreihenfolge ermitteln", 0)
  
  LV_ColumnTotal = SendMessage_(SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0), #HDM_GETITEMCOUNT, 0, 0)
  Dim LV_Columns(LV_ColumnTotal-1)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 2
            SendMessage_(GadgetID(1), #LVM_GETCOLUMNORDERARRAY, LV_ColumnTotal, LV_Columns())
            For a = 1 To LV_ColumnTotal
              Debug GetGadgetItemText(1, -1, LV_Columns(a-1))
            Next
            Debug "--------------------------------------------------"
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Wenn du die Reihenfolge gespeichert hast, kannst du diese auch jederzeit wiederherstellen:

Code: Alles auswählen

EnableExplicit

Define LV_ColumnTotal

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1, 0, 0, WindowWidth(0), WindowHeight(0)-40, "Spalte 1", 100, #PB_ListIcon_HeaderDragDrop)
  AddGadgetColumn(1, 1, "Spalte 2", 100)
  AddGadgetColumn(1, 2, "Spalte 3", 100)
  AddGadgetColumn(1, 3, "Spalte 4", 100)
  
  ButtonGadget(2, WindowWidth(0)-210, WindowHeight(0)-30, 200, 20, "Spaltenreihenfolge wiederherstellen", 0)
  
  LV_ColumnTotal = SendMessage_(SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0), #HDM_GETITEMCOUNT, 0, 0)
  Dim LV_Columns(LV_ColumnTotal-1)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 2
            LV_Columns(0) = 3
            LV_Columns(1) = 2
            LV_Columns(2) = 1
            LV_Columns(3) = 0
            SendMessage_(GadgetID(1), #LVM_SETCOLUMNORDERARRAY, LV_ColumnTotal, LV_Columns())
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 23:36
von marcelx
Danke, genau Das brauche ich.

Wenn ich dabei bin, ich möchte die Breite der Colomn bestimmen, mit

Code: Alles auswählen

GetGadgetItemAttribute(0, #PB_Ignore, #PB_ListIcon_ColumnWidth, 1)
bekomme ich die Breite, allerding nicht die die ich mit ziehen geändert habe, sondern welche ich mit AddGadgetColumn() festgelegt habe.

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 28.01.2015 23:41
von RSBasic
Kann ich nicht bestätigen. Ermittelst du vielleicht die falsche Spalte? Die Spaltennummer fängt immer mit 0 für die erste Spalte an.
Wenn ich dein Code ausführe und ich verändere die Breite der zweiten Spalte, dann erhalte ich auch die von mir geänderte Breite.
Oder möchtest du die Breite der zweiten Spalte, die vorher in einer anderen Position war, ermitteln? Dann musst du das Array mit berücksichtigen.

Re: ListIconGadget Reihenfolge auslesen

Verfasst: 29.01.2015 13:19
von marcelx
ok, ich hatte die falsche Spaltennummer verwendet