ListIconGadget 2-stufig sortieren ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

ListIconGadget 2-stufig sortieren ?

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Schlingel
Beiträge: 30
Registriert: 28.06.2007 20:06

Beitrag 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.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Heißt das im Klartext das wenn du nach "Genre" oder "Jahr" sortierst die Spalte "Titel" unverändert bleibt?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten