ListIconGadget Reihenfolge auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

ListIconGadget Reihenfolge auslesen

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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.
Zuletzt geändert von c4s am 28.01.2015 22:20, insgesamt 1-mal geändert.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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
a²+b²=mc²
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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.
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ListIconGadget Reihenfolge auslesen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: ListIconGadget Reihenfolge auslesen

Beitrag von marcelx »

ok, ich hatte die falsche Spaltennummer verwendet
Win-10, PB 5.31 (Windows - x86)
Antworten