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?
DeltaG