Nutzt jemand die PureLVSort Lib?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dige
Beiträge: 1246
Registriert: 08.09.2004 08:53

Re: Nutzt jemand die PureLVSort Lib?

Beitrag 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..
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Nutzt jemand die PureLVSort Lib?

Beitrag von edel »

Warum geht die Lib eigentlich nicht mehr? Bekommst du eine Fehlermeldung?
Benutzeravatar
dige
Beiträge: 1246
Registriert: 08.09.2004 08:53

Re: Nutzt jemand die PureLVSort Lib?

Beitrag von dige »

Beim compilieren kommt die Fehlermeldung:

POLINK: error: Unresolved external symbol '_SYS_CopyString'.
POLINK: fatal error: 1 unresolved external(s).
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Nutzt jemand die PureLVSort Lib?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
dige
Beiträge: 1246
Registriert: 08.09.2004 08:53

Re: Nutzt jemand die PureLVSort Lib?

Beitrag von dige »

Jippiiii! Danke!!
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
dige
Beiträge: 1246
Registriert: 08.09.2004 08:53

Re: Nutzt jemand die PureLVSort Lib?

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: Nutzt jemand die PureLVSort Lib?

Beitrag 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" ;)
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​​
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Nutzt jemand die PureLVSort Lib?

Beitrag 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()
Benutzeravatar
dige
Beiträge: 1246
Registriert: 08.09.2004 08:53

Re: Nutzt jemand die PureLVSort Lib?

Beitrag von dige »

Klasse :D so gehts! Vielen Dank @Bisonte

@Edel: Danke auch! Das wäre also der neuere Weg und zukunftssicherer?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Nutzt jemand die PureLVSort Lib?

Beitrag 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
Antworten