Seite 2 von 4

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 10:49
von dige
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..

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 10:55
von edel
Warum geht die Lib eigentlich nicht mehr? Bekommst du eine Fehlermeldung?

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 10:59
von dige
Beim compilieren kommt die Fehlermeldung:

POLINK: error: Unresolved external symbol '_SYS_CopyString'.
POLINK: fatal error: 1 unresolved external(s).

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 11:03
von RSBasic
Du kannst stattdessen...

Code: Alles auswählen

Var = SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @DeineCallbackProzedur()
...verwenden. Ist unabhängig, musst nicht deine Standard-AllinOne-WindowsCallback-Funktion anpassen und kannst mehrere erstellen.

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 11:15
von dige
Jippiiii! Danke!!

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 11:18
von dige
Ä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 :oops: 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...

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 11:40
von Bisonte
Hier ein Beispiel für so eine CallBackgeschichte ....

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
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" ;)

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 12:12
von edel
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...)

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?

Verfasst: 21.10.2015 12:19
von dige
Klasse :D so gehts! Vielen Dank @Bisonte

@Edel: Danke auch! Das wäre also der neuere Weg und zukunftssicherer?

Re: Nutzt jemand die PureLVSort Lib?

Verfasst: 21.10.2015 12:25
von edel
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