Klick auf Spaltenkopf abfragen

Anfängerfragen zum Programmieren mit PureBasic.
DeltaG
Beiträge: 112
Registriert: 10.09.2004 18:15

Klick auf Spaltenkopf abfragen

Beitrag von DeltaG »

Hi @all!

Wie kann man in dem angefügten Beispiel abfragen, welcher Spaltenkopf mit der Maus angeklickt wurde?

Code: Alles auswählen

Structure LibEntry
  Nr.l
  Name.s
  Adr.l
EndStructure

Global Dim Lib.LibEntry(0)


Procedure LibraryEinlesen()

Titel$="Library auswählen"
Pattern$="Library|*.dll|Alle Dateien|*.*"
StandardDatei$="C:\Windows\System32\"
PatternPosition=0
ok=1
DateiPfad$ = OpenFileRequester(Titel$, StandardDatei$, Pattern$ , PatternPosition )
Datei$ = GetFilePart(DateiPfad$)
If Datei$
  LibNr=OpenLibrary(#PB_Any, DateiPfad$)
  LibraryID=LibraryID(LibNr)
  If LibNr
    If ExamineLibraryFunctions(LibNr)
      AnzLibFunktionen = CountLibraryFunctions(LibNr)
      ReDim Lib.LibEntry(AnzLibFunktionen)
      If AnzLibFunktionen
        count = 1
          While NextLibraryFunction()
            LibFunctionName.s = LibraryFunctionName()
            LibFunctionAddr.l = LibraryFunctionAddress()
            Lib(count)\Nr     = count
            Lib(count)\Name   = LibFunctionName
            Lib(count)\Adr    = LibFunctionAddr
            INC count
          Wend
        Lib(0)\Nr   = AnzLibFunktionen
        Lib(0)\Name = Datei$
        Lib(0)\Adr  = LibraryID
      EndIf
    Else
      dummy = MessageRequester("Fehler", "Keine Eintäge vorhanden!")
      ok=0
    EndIf
    CloseLibrary(LibNr)
  Else
    dummy = MessageRequester("Fehler", "Konnte Library nicht öffnen!")
    ok=0
  EndIf
Else
  dummy = MessageRequester("Fehler", "Konnte Datei nicht öffnen!")
  ok=0
EndIf
ProcedureReturn ok
EndProcedure


ok=LibraryEinlesen()


If ok
  If OpenWindow(0, 100, 100, 480, 274, "Library-View", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ListIconGadget(0, 5, 5, 470, 248, "Nr.", 48, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
      AddGadgetColumn(0, 1, "LibraryFunctionName", 336)
      AddGadgetColumn(0 ,2 ,"LFAddress",80)
      dummy = TextGadget(1, 5, 256, 330, 16, " LibName:  " + Lib(0)\Name , #PB_Text_Border) 
      dummy = TextGadget(2, 344, 256, 130, 16, " Location:  "+ Hex(Lib(0)\Adr) , #PB_Text_Border)
      count=1
      Repeat
        entry$=Str(count) + Chr(#LF) + Lib(count)\Name + Chr(#LF) + Hex(Lib(count)\Adr)
        AddGadgetItem(0, -1, entry$)
        INC count
      Until count = Lib(0)\Nr +1
      Repeat
      
        Event = WaitWindowEvent()

        ; Frage:  wie kann ich hier abfragen, welcher
        ;         Spaltenkopf angeklickt wurde?
        
        
      Until Event = #PB_Event_CloseWindow
    EndIf
  EndIf
EndIf

End
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

in folgendem Code wird sowas in angewendet (3.94)

http://www.purearea.net/pb/CodeArchiv/G ... yColumn.pb

übrigens ist das CodeArchiv auf Purearea.net immer 'n Versuch wert.
:)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
DeltaG
Beiträge: 112
Registriert: 10.09.2004 18:15

Beitrag von DeltaG »

Hallo bobobo!

Danke für Deine Antwort.

Leider führt das von Dir angeführte Beispiel bei mir (v4b8) zu einem 'Invalid memory access'.

Nichtsdestotrotz hat Deine Anmerkung
übrigens ist das CodeArchiv auf Purearea.net immer 'n Versuch wert.
mich dann doch noch auf den richtigen Weg geführt.

ListIcon_Get-Column.pb ist genau das Beispiel, das zum Erfolg geführt hat.

Das Ergebnis meiner Versuche führte zu diesem Ergebnis:

Code: Alles auswählen

;Kleiner Test-Code für
;	- Library-Funktionen-Handling
;	- Handhabung eines ListIconGadgets
;		(Befüllung, Sortierung der Einträge)
;	-	Feststellen, welche Spalte selektiert wurde
;	-	Erstellen und Sortieren einer Liste

Structure LibEntry
  Nr.l
  Name.s
  Adr.l
EndStructure

Global NewList Lib.LibEntry()


Procedure LibraryEinlesen()

Titel$="Library auswählen"																;Argumente für Requester
Pattern$="Dynamic Link Library|*.dll|Alle Dateien|*.*";
StandardDatei$="C:\Windows\System32\"											;
PatternPosition=0																					;

ok=1

DateiPfad$ = OpenFileRequester(Titel$, StandardDatei$, Pattern$ , PatternPosition )
Datei$ = GetFilePart(DateiPfad$)													;Name der DLL

If Datei$

  LibNr=OpenLibrary(#PB_Any, DateiPfad$)									;Öffnen der Library
  LibraryID=LibraryID(LibNr)

  If LibNr

    If ExamineLibraryFunctions(LibNr)

      AnzLibFunktionen = CountLibraryFunctions(LibNr)			;Anzahl der Einträge

      If AnzLibFunktionen
 
        AddElement(Lib.LibEntry())												;ersten Eintrag in Liste erzeugen
        Lib()\Nr		= AnzLibFunktionen										;darin werden die Anzahl der Einträge
        Lib()\Name	= Datei$															;der Name der DLL und die Adresse
        Lib()\Adr		= LibraryID														;gemerkt
 
        count = 1																					;als lfd. Nummer für erste Spalte
 
        While NextLibraryFunction()												;solange witere Einträge da sind 
          LibFunctionName.s = LibraryFunctionName()				;werden diese nach und nach ausgelesen
          LibFunctionAddr.l = LibraryFunctionAddress()		;und in der Liste gespeichert
					AddElement(Lib.LibEntry())
          Lib()\Nr		= count
        	Lib()\Name	= LibFunctionName
        	Lib()\Adr		= LibFunctionAddr
          INC count
        Wend
        
      EndIf		;AnzLibFunktionen
      
    Else
      dummy = MessageRequester("Fehler", "Keine Eintäge vorhanden!")
      ok=0
      
    EndIf		;
    
    CloseLibrary(LibNr)
    
  Else
    dummy = MessageRequester("Fehler", "Konnte Library nicht öffnen!")
    ok=0
    
  EndIf
  
Else
  dummy = MessageRequester("Fehler", "Konnte Datei nicht öffnen!")
  ok=0

EndIf

ProcedureReturn ok	;		Wenn alles funktioniert hat gibt's eine '1' zurück, sonst '0'	

EndProcedure


Procedure UpdateGadget()
;Das ListIconGadget wird mit der umsortierten Liste gefüllt

ClearGadgetItemList(0)						;zunächst die alten Einträge entfernen

FirstElement(Lib())								;Zeiger auf ersten Eintrag in der Library stellen

While NextElement(lib())					;solange Einträge da sind, werden diese ausgelesen
	entry$=Str(Lib()\Nr) + Chr(#LF) + Lib()\Name + Chr(#LF) + Hex(Lib()\Adr)
	AddGadgetItem(0, -1, entry$)		;und als neuer Eintrag in das ListIconGadget eingetragen
Wend

EndProcedure


Procedure wndproc(hwnd,msg,wparam,lparam)
; Diese Procedure stammt aus dem Code-Archive bei 
; PureArea.net und funktioniert auch mit PB v4b8
; Sie stellt fest, auf welchen Spaltenkopf ein
; Mausklick ausgeführt wurde.
;	Fragt mich nicht, wie die funktioniert. ;-)
;
; English forum:
; Author: Justin 
; Date: 02. November 2002

  Shared hlv, column
  retrn=#PB_ProcessPureBasicEvents
  Select msg
    
    Case #WM_NOTIFY
      *pnmhdr.NMHDR=lparam
      If *pnmhdr\code=#LVN_COLUMNCLICK   		;column click
        *pnmlistview.NMLISTVIEW=lparam
        If *pnmlistview\hdr\hwndFrom=hlv 		;comes from our listicon
          column=*pnmlistview\iSubItem
        EndIf
      EndIf

  EndSelect
ProcedureReturn retrn
EndProcedure


opt_col_0=1		;benutzt zum Umschalten der Sortierrichtung
opt_col_1=3		;der einzelnen Spalten
opt_col_2=1		;

ok=LibraryEinlesen()

If ok																				;Library wurde gefunden, geöffnet und eingelesen

	hwnd=OpenWindow(0, 100, 100, 480, 274, "Library-View", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  If hwnd			;Fenster erfolgreich geöffnet
    
    If CreateGadgetList(WindowID(0)) 				;Ressourcen-Reservierung für zukünftige Gadget-Liste war erfolgreich

			;ein ListIconGadget mit 3 Spalten erstellen    
      hlv=ListIconGadget(0, 5, 5, 470, 248, "Nr.", 48, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
      AddGadgetColumn(0, 1, "LibraryFunctionName", 336)
      AddGadgetColumn(0 ,2 ,"LFAddress",80)

      AnzLibFunktionen=Lib()\Nr							;Anzahl der Zeilen 
      
      ;zwei weitere TextGadgets zur Anzeige weiterer Informationen erzeugen
      dummy = TextGadget(1, 5, 256, 330, 16, " LibName:  " + Lib()\Name , #PB_Text_Border) 
      dummy = TextGadget(2, 344, 256, 130, 16, " Location:  "+ Hex(Lib()\Adr) , #PB_Text_Border)
      
      
      FirstElement(Lib())										;Auf ersten Eintrag in der Liste einstellen									;
      count=Lib()\Nr 												;Anzahl der Einträge
      
      While NextElement(lib())							;Solange noch Einträge in der List sind
        entry$=Str(Lib()\Nr) + Chr(#LF) + Lib()\Name + Chr(#LF) + Hex(Lib()\Adr)
        AddGadgetItem(0, -1, entry$)				;werden diese ausgelesen und als weitere Zeile
      Wend																	;im ListGadgetIcon dargestellt
      
      SetWindowCallback(@wndproc(),0)				;wenn irgendwann auf einen Spaltenkopf geklickt
      																			;wird, meldet uns das diese Procedure
      
      Repeat
      	column=-1														;keine Spalte geklickt

        Event = WaitWindowEvent()						;warten, daß etwas passiert

				Select column											;wenn eine Spalte selektiert, dann nicht mehr -1
				
					Case 0														;1. Spalte ausgewählt zum Sortieren
					opt_col_0=1-opt_col_0							;Schalter auf-/abwärts sortieren (0/1)
					SortStructuredList(Lib(), opt_col_0, OffsetOf(LibEntry\Nr), #PB_Sort_Long, 1, count )
					UpdateGadget()
					
					Case 1														;2. Spalte ausgewählt zum Sortieren
					opt_col_1=5-opt_col_1							;Schalter auf-/abwärts sortieren (2/3)
					SortStructuredList(Lib(), opt_col_1, OffsetOf(LibEntry\Name), #PB_Sort_String, 1, count )
					UpdateGadget()
					
					Case 2														;3. Spalte ausgewählt zum Sortieren
					opt_col_2=1-opt_col_2							;Schalter auf-/abwärts sortieren (0/1)
					SortStructuredList(Lib(), opt_col_2, OffsetOf(LibEntry\Adr), #PB_Sort_Long, 1, count )
					UpdateGadget()
					
					EndSelect
        
      Until Event = #PB_Event_CloseWindow		;fertig!
    EndIf
  EndIf
EndIf

End
*edit* Wieso sieht der Code heute eigentlich so zerfleddert aus? :oops:

DeltaG
Antworten