Nutzt jemand die PureLVSort Lib?
Re: Nutzt jemand die PureLVSort Lib?
Danke RSBasic, den letzten Link hatte ich mir zwischenzeitlich auch schon angeschaut und das scheint der Sache am nächsten zu kommen.
Ich brauche die Sortierung von verschiedenen Datentypen und die Windows typischen Icon für den Header..
Die Funktion zum ermitteln der angeklickten Zelle, konnte ich schon nachbauen. Problematisch ist für mich der WindowsCallback(), weil ich den meist schon selbst verwende und die Sortierung gern unabhängig davon integrieren möchte..
Ich brauche die Sortierung von verschiedenen Datentypen und die Windows typischen Icon für den Header..
Die Funktion zum ermitteln der angeklickten Zelle, konnte ich schon nachbauen. Problematisch ist für mich der WindowsCallback(), weil ich den meist schon selbst verwende und die Sortierung gern unabhängig davon integrieren möchte..
"Papa, ich laufe schneller - dann ist es nicht so weit."
Re: Nutzt jemand die PureLVSort Lib?
Warum geht die Lib eigentlich nicht mehr? Bekommst du eine Fehlermeldung?
Re: Nutzt jemand die PureLVSort Lib?
Beim compilieren kommt die Fehlermeldung:
POLINK: error: Unresolved external symbol '_SYS_CopyString'.
POLINK: fatal error: 1 unresolved external(s).
POLINK: error: Unresolved external symbol '_SYS_CopyString'.
POLINK: fatal error: 1 unresolved external(s).
"Papa, ich laufe schneller - dann ist es nicht so weit."
Re: Nutzt jemand die PureLVSort Lib?
Du kannst stattdessen...
...verwenden. Ist unabhängig, musst nicht deine Standard-AllinOne-WindowsCallback-Funktion anpassen und kannst mehrere erstellen.
Code: Alles auswählen
Var = SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @DeineCallbackProzedur()Re: Nutzt jemand die PureLVSort Lib?
Jippiiii! Danke!!
"Papa, ich laufe schneller - dann ist es nicht so weit."
Re: Nutzt jemand die PureLVSort Lib?
Ähm, noch nicht ganz. Wie muss die Callback Procedure aussehen?
Procedure MyWindowCallback(WindowID, message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
;
; Debug "MyWindowCallback(WindowID, message, wParam, lParam)"
;
ProcedureReturn Result
EndProcedure
Wenn ich die so baue, wie für SetWindowCallback() werden keine
Events über PB mehr verarbeitet..
1. EDIT:
Jetzt gehts. Setze den Callback statt aufs Fenster direkt auf die GadgetID..
2. EDIT:
Nee
geht doch nicht. Wenn das Beispiel http://www.purebasic.fr/english/viewtop ... 12&t=55085
von SetWindowCallback() auf SetWindowLongPtr_(GadgetID, #GWL_WNDPROC, @ColumnClickCallback())
abwandelt, funktioniert es nicht...
Procedure MyWindowCallback(WindowID, message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
;
; Debug "MyWindowCallback(WindowID, message, wParam, lParam)"
;
ProcedureReturn Result
EndProcedure
Wenn ich die so baue, wie für SetWindowCallback() werden keine
Events über PB mehr verarbeitet..
1. EDIT:
Jetzt gehts. Setze den Callback statt aufs Fenster direkt auf die GadgetID..
2. EDIT:
Nee
von SetWindowCallback() auf SetWindowLongPtr_(GadgetID, #GWL_WNDPROC, @ColumnClickCallback())
abwandelt, funktioniert es nicht...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Re: Nutzt jemand die PureLVSort Lib?
Hier ein Beispiel für so eine CallBackgeschichte ....
Und es ist unerheblich ob es ein Callback für ein Window oder ein Gadget ist.
Bei Gadgets muss man dann anstelle von WindowID halt GadgetID einsetzen.
Für Windows sind alles "nur Fenster"
Code: Alles auswählen
Procedure MyWindowCallBack(hWnd, uMsg, wParam, lParam)
Window = GetProp_(hWnd, "WINNR")
OldProc = GetProp_(hWnd, "OLDPROC")
If Not IsWindow(Window) : ProcedureReturn 0 : EndIf
If Not OldProc : ProcedureReturn 0 : EndIf
Select uMsg
Case #WM_DESTROY
;: Was wir angehängt haben, muss auch wieder weg
RemoveProp_(hWnd, "WINNR")
RemoveProp_(hWnd, "OLDPROC")
Debug "Destroy"
Case #WM_EXITSIZEMOVE
Debug "Resizing beendet"
EndSelect
If OldProc
;: Den "originalen" Callback aufrufen ... den CB der in der Callbackliste von Windows an
;: der stelle vor unserem ist
ProcedureReturn CallWindowProc_(OldProc, hWnd, uMsg, wParam, lParam)
Else
;: ansonsten soll nichts passieren
ProcedureReturn #Null
EndIf
EndProcedure
Window = 10 ; Nur damit man die API Befehle evt. besser lesen kann
OpenWindow(Window, 0, 0, 200, 100, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
;: Setzen des CallBacks
OldProc = SetWindowLongPtr_(WindowID(Window), #GWLP_WNDPROC, @MyWindowCallBack())
;: Anhängen von Variablen die im Callback gebraucht werden
;: Man sollte versuchen, so wenig wie möglich an daten anzuhängen.
SetProp_(WindowID(Window), "WINNR", Window)
SetProp_(WindowID(Window), "OLDPROC", OldProc)
;: Ein Gadget zum zeigen, das Events von PB noch funktionieren
ButtonGadget(1, 10, 10, 100, 20, "Hallo")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Debug EventGadget()
EndIf
Until Event = #PB_Event_CloseWindow
Bei Gadgets muss man dann anstelle von WindowID halt GadgetID einsetzen.
Für Windows sind alles "nur Fenster"
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Nutzt jemand die PureLVSort Lib?
Wenn du mehr als ein Callback setzen moechtest, wuerde ich eher zu "SetWindowSubclass" raten, es ist einfacher zu benutzen und gibt es seit windows XP. (Natuerlich nicht in PB...)
Beispiel :
Code: Alles auswählen
Import ""
GetProcAddress(hmod, s.p-ascii)
EndImport
Prototype pSetWindowSubclass(hWnd, *Proc, *Id, *RefData)
Prototype pDefSubclassProc(hWnd, Msg, wparam, lParam)
Prototype pRemoveWindowSubclass(hWnd, *Proc, *Id)
Prototype pGetWindowSubclass(hWnd, *Proc, *Id, *RefData)
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb776430(v=vs.85).aspx
Procedure SetWindowSubclass(hWnd, *Proc, *Id, *RefData)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pSetWindowSubclass = GetProcAddress(Comctl32, "SetWindowSubclass")
ProcedureReturn func(hWnd, *Proc, *Id, *RefData)
EndProcedure
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb776403(v=vs.85).aspx
Procedure DefSubclassProc(hWnd, Msg, wparam, lParam)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pDefSubclassProc = GetProcAddress(Comctl32, "DefSubclassProc")
ProcedureReturn func(hWnd, Msg, wparam, lParam)
EndProcedure
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb762094(v=vs.85).aspx
Procedure RemoveWindowSubclass(hWnd, *Proc, *Id)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pRemoveWindowSubclass = GetProcAddress(Comctl32, "RemoveWindowSubclass")
ProcedureReturn func(hWnd, *Proc, *Id)
EndProcedure
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb776430(v=vs.85).aspx
Procedure GetWindowSubclass(hWnd, *Proc, *Id, *RefData)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pGetWindowSubclass = GetProcAddress(Comctl32, "GetWindowSubclass")
ProcedureReturn func(hWnd, *Proc, *Id, *RefData)
EndProcedure
Beispiel :
Code: Alles auswählen
Procedure Proc1(hWnd, Msg, wparam, lParam, id, *refData)
Debug "Proc1 ID : " + id + " refData : " + *refData
; DefSubclassProc sorgt dafur das der naechste Callback aufgerufen wird.
ProcedureReturn DefSubclassProc(hWnd, Msg, wparam, lParam)
EndProcedure
Procedure Proc2(hWnd, Msg, wParam, lParam, id, *refData)
Debug "Proc2 ID : " + id + " refData : " + *refData
; DefSubclassProc sorgt dafur das der naechste Callback aufgerufen wird.
ProcedureReturn DefSubclassProc(hWnd, Msg, wParam, lParam)
EndProcedure
Procedure Main()
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 500, 500, "")
ButtonGadget(0, 10, 10, 100, 100, "Klick")
;Setzen des Callbacks.
;Setzt man mehrere Callbacks auf ein Fenster, kann man eine ID
;angeben, um zu unterscheiden.
SetWindowSubclass(WindowID(0), @Proc1(), 0, 0)
SetWindowSubclass(WindowID(0), @Proc1(), 1, 45334)
SetWindowSubclass(WindowID(0), @Proc2(), 2, 0)
SetWindowSubclass(GadgetID(0), @Proc2(), 1, 1)
SetWindowSubclass(GadgetID(0), @Proc2(), 2, 2)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure: End Main()
Re: Nutzt jemand die PureLVSort Lib?
Klasse
so gehts! Vielen Dank @Bisonte
@Edel: Danke auch! Das wäre also der neuere Weg und zukunftssicherer?
@Edel: Danke auch! Das wäre also der neuere Weg und zukunftssicherer?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Re: Nutzt jemand die PureLVSort Lib?
Was du am Ende benutzt bleibt dir uberlassen, hier kannst du aber nachlesen warum man SetWindowSubclass statt SetWindowLong benutzen sollte.
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Z.B. entfaellt das ganze hantieren mit den Variablen usw.
__________________________________________________
MSDN-Link angepasst
21.10.2015
RSBasic
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Z.B. entfaellt das ganze hantieren mit den Variablen usw.
__________________________________________________
MSDN-Link angepasst
21.10.2015
RSBasic

