Seite 1 von 2

ListIconGadget 2-stufig sortieren ?

Verfasst: 08.10.2007 22:17
von scholly
moin, moin...

Ich sortiere mein LIG mit PureLVSort.
Spalten: ID, Titel, Genre, Jahr,.......

Gibt es irgendeine Möglichkeit, die ich Dussel mal wieder nicht finde, daß beim sortieren nach einer anderen Spalte als Titel (z.B. Genre oder Jahr)
die Spalte Titel innerhal des Genres/Jahres auch sortiert bleibt/wird ?

War das verständlich genug ?

TIA... scholly

Verfasst: 09.10.2007 13:45
von Schlingel
Du willst zwei Spalten sortieren ?

Hmm..

Normal kann man doch nur 1 Spalte sortieren bzw. jede Spalte für sich...
Wenn du was anderes meinst dann verstehe ich das nicht.

Verfasst: 09.10.2007 14:02
von Fluid Byte
Heißt das im Klartext das wenn du nach "Genre" oder "Jahr" sortierst die Spalte "Titel" unverändert bleibt?

Verfasst: 09.10.2007 14:26
von gekkonier
Ich glaube eher, dass er zwei oder mehr Sortierkriterien verwenden können will, ca. so:

Code: Alles auswählen

vorher:

spalte A | spalte B
 1       |  B
 3       |  B
 2       |  A
 3       |  A
 1       |  A
 
danach (Sortierkriterium 1: Spalte A, 2: Spalte B:

spalte A | spalte B
 1       |  A
 1       |  B
 2       |  A
 3       |  A
 3       |  B
Wenn das nicht passt, Beispiel bitte wie du das meinst :D

Verfasst: 09.10.2007 14:30
von Fluid Byte
Nein, was du da schliderst ist normales Sortieren. Das sich die restlichen Spalten nach der zu sortierenden richten ist ja wohl selbstverständlich.

Verfasst: 09.10.2007 18:01
von Ligatur
Hallo,

So selbstverständlich ist das nicht. Wenn in der zu sortierenden Spalte mehrere gleiche Werte vorkommen kann man sich ja wünschen, das dann nach einen zweiten Kriterium sortiert wird.
Wenn es nicht funktioniert, erst nach dem Nebenkriterium zu sortieren und dann nach dem Hauptkriterium gibt es keine Anfängergeeignete Lösung. Du müsstest dann den Listicongadget eine Message #LVM_Sortitems schicken und als lParam eine selbstgeschriebene Sortierfunktion angeben, die du dann wohl so schreiben könntest das sie eine Nebenbedingung überprüft. Näheres dazu im MSDN.

Gruß,
Ligatur

Verfasst: 09.10.2007 18:45
von Fluid Byte

Code: Alles auswählen

; ***********************************************
; *                                             *
; *      'List-View Item Sorting'               *
; *                                             *
; * Author:  Christian Kemna (Fluid Byte)       *
; * Created: October 09, 2007                   *
; * Updated: n.a                                *
; * Version: PureBasic V4.10b4                  *
; *                                             *
; * Web: http://codedreality.purearea.net/	    *
; * eMail: ckemna@t-online.de                   *
; *                                             *
; ***********************************************

;-Declare Functions
Declare WindowCallback(hWnd,uMsg,wParam,lParam)
Declare CompareFunc(*Item1.LONG,*Item2.LONG,lParamSort) 

;-Define Varibales
#LST_Filelist = 101

Global *hwndListView
Global Sortmode, LastCol

;-Application Window
OpenWindow(0,0,0,500,400,"untitled",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ListIconGadget(#LST_Filelist,0,0,0,0,"Name",200)

AddGadgetColumn(#LST_Filelist,1,"Size",70)
AddGadgetColumn(#LST_Filelist,2,"Type",190)

*hwndListView = GadgetID(#LST_Filelist)

SetWindowCallback(@WindowCallback())

;-Examine Directory
Filepath$ = "C:\WINDOWS\"

ExamineDirectory(0,Filepath$,"*.*")

While NextDirectoryEntry(0)	
	Filename$ = DirectoryEntryName(0)
	
	SHGetFileInfo_(Filepath$ + Filename$,0,shi.SHFILEINFO,SizeOf(SHFILEINFO),#SHGFI_TYPENAME)

	If DirectoryEntryType(0) = #PB_DirectoryEntry_File
		ItemText$ = Filename$ + Chr(10) 
		ItemText$ + StrF(DirectoryEntrySize(0)/1024,1) + " KB" + Chr(10)
		ItemText$ + PeekS(@shi\szTypeName)
	
 		AddGadgetItem(#LST_Filelist,-1,ItemText$)
	EndIf
	
	If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory And Filename$ > ".."
 		AddGadgetItem(#LST_Filelist,-1,Filename$ + Chr(10) + Chr(10) + "Folder")
	EndIf	
Wend

;-Update Item lParam
ItemsNUM = CountGadgetItems(#LST_Filelist) - 1

For i = 0 To ItemsNUM
	SetGadgetItemData(#LST_Filelist,i,i) 
Next 

; ------------------------------------------------------------------------------------------------------
; MAIN LOOP
; ------------------------------------------------------------------------------------------------------

Repeat
	EventID = WaitWindowEvent()

	If EventID = #PB_Event_SizeWindow
		ResizeGadget(#LST_Filelist,5,5,WindowWidth(0)-10,WindowHeight(0)-10)
	EndIf
Until EventID = #WM_CLOSE

; ------------------------------------------------------------------------------------------------------
; FUNCTIONS
; ------------------------------------------------------------------------------------------------------

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
	Protected *pnmh.NMHDR, *pnmv.NM_LISTVIEW, ItemsNUM, i
	
	Select uMsg
		Case #WM_NOTIFY
		*pnmh = lParam
		
		Select *pnmh\code
			Case #LVN_COLUMNCLICK
			*pnmv = lParam
			
			If LastCol <> *pnmv\iSubItem : Sortmode = 0 : EndIf
			
			SendMessage_(*hwndListView,#LVM_SORTITEMS,*pnmv\iSubItem,@CompareFunc())
			LastCol = *pnmv\iSubItem
			Sortmode = 1-Sortmode
			
			; * Update Item lParam
			ItemsNUM = CountGadgetItems(#LST_Filelist) - 1
			
			For i = 0 To ItemsNUM
				SetGadgetItemData(#LST_Filelist,i,i) 
			Next 
		EndSelect
	EndSelect
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

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

Procedure CompareFunc(*Item1.LONG,*Item2.LONG,lParamSort) 
	Protected lvi.LV_ITEM, Buffer1$ = Space(255), Buffer2$ = Space(255), Result
	
	lvi\iSubItem = lParamSort & $FFFF
	lvi\cchTextMax = 255
	
	lvi\pszText = @Buffer1$
	SendMessage_(*hwndListView,#LVM_GETITEMTEXT,*Item1\l,lvi)
	
	lvi\pszText = @Buffer2$
	SendMessage_(*hwndListView,#LVM_GETITEMTEXT,*Item2\l,lvi)		

	If Sortmode
		Result = lstrcmpi_(Buffer2$,Buffer1$)
	Else
		Result = lstrcmpi_(Buffer1$,Buffer2$)
	EndIf
	
	ProcedureReturn Result
EndProcedure

Verfasst: 09.10.2007 20:19
von scholly
Danke für den Code, Fluid, er zeigt genau, wie ich mir das vorstelle.

Meine Frage zielte aber nicht auf eine "selbstständige Lösung", sondern darauf, ob ich bei meiner "Suchschwäche" etwas in der Doku zu PureLVSORT übersehen habe, das das Gleiche erreicht.

Da weder von gnozal noch anderen, die erfahrungsgemäß seine Libs recht gut kennen, ein solcher Hinweis gekommen ist, lasse ichs wohl dabei bewenden.

bis denne... scholly

Verfasst: 09.10.2007 20:28
von Fluid Byte
Tja, solange du aber nicht weisst wie oder zur Erkenntniss kommst das es generell nicht geht kann ich dir das Snippet nur ans Herz legen. Außerdem warum fragst du hier im deutschen Forum danach? Wende dich doch lieber an Gonzal direkt.

Verfasst: 09.10.2007 21:28
von scholly
Fluid Byte hat geschrieben: Außerdem warum fragst du hier im deutschen Forum danach?
Weil mir hier bisher immer freundlich geholfen wurde, auch wenn ich zu doof war, an der richtigen Stelle zu suchen.
Wende dich doch lieber an Gonzal direkt.
Nö, von dem hätte ich keine Antwort bekommen ;).
Und wenn das in so einem Fall (Suchschwäche) jeder machen würde, käme gnozal nicht mehr dazu, so produktiv für die PB-Community zu schaffen.

'nen Anschiß, weil ich mal wieder an der falschen Stelle gesucht habe oder den entsprechenden Vermerk in der englischen Doku nicht verstanden habe, hätte ich ja verstanden - aber daß ich hier gefragt habe ???

Ich hab mich lieb für Deinen Code, den ich zwar nicht verstehe, der aber genau das zeigt, was ich meinte, bedankt, weil mir klar ist, daß er anderen weiterhelfen kann.
Was willst Du mehr ?
Den hier: :praise: ?
Kannste haben.

Aber ob ich dazu in der Lage bin, Deinen Code zu verstehen und einzubauen, mußt Du schon mir überlassen; darüber brauchste nicht eingeschnappt zu sein und als PB-Experte 'nen Anfänger anzumachen.

bis denne... scholli