AddGadgetItem und Kompatibilität mit Windows API
Re: AddGadgetItem und Kompatibilität mit Windows API
@jacdelad:
was war jetzt noch mal der Grund, warum das ListIconGadget nicht Deinen Anforderungen entspricht?
was war jetzt noch mal der Grund, warum das ListIconGadget nicht Deinen Anforderungen entspricht?
Hygge
Re: AddGadgetItem und Kompatibilität mit Windows API
@jacdelad:
Eigentlich kannst du auch das ListIconGadget direkt nehmen und das füllen des Gadgets mit den Standardbefehlen durchführen.
Erst wenn du Sachen realisieren möchtest nicht Direkt gehen, kann du mit GadgetID(Gadgetnummer) das Handle vom MS-Listview dir holen
und dann mit API weitermachen.
Viele Beispiel für API gibt es hier: RS-Basic WinAPI-Library
Ach ja...
Konstanten verwenden.
Eigentlich so wie sie in der MSDN beschrieben sind
Mach braucht auch kein For-Next-schleife um die Spalten vom dem Item zu füllen.
Dazu müssen nur die Daten mit Chr(10) "#LF$" für die Spalten getrennt werden.
Eigentlich kannst du auch das ListIconGadget direkt nehmen und das füllen des Gadgets mit den Standardbefehlen durchführen.
Erst wenn du Sachen realisieren möchtest nicht Direkt gehen, kann du mit GadgetID(Gadgetnummer) das Handle vom MS-Listview dir holen
und dann mit API weitermachen.
Viele Beispiel für API gibt es hier: RS-Basic WinAPI-Library
Ach ja...
Konstanten verwenden.
Code: Alles auswählen
...
message.LVITEM\mask=#LVIF_TEXT
...
SendMessage_(hnd,#LVM_INSERTITEM,0,message)
...
Mach braucht auch kein For-Next-schleife um die Spalten vom dem Item zu füllen.
Dazu müssen nur die Daten mit Chr(10) "#LF$" für die Spalten getrennt werden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: AddGadgetItem und Kompatibilität mit Windows API
@Kiffi und @mk-soft:
Ich will mich erstmal an PureBasic rantasten. Ich habe ein Projekt für meine Arbeit, rund 4000 Zeilen in XProfan, und will einige sehr oft wiederholte Passagen in PureBasic umsetzen, weil XProfan sehr langsam ist. Unabhängig von Sinn oder Unsinn dieser Sache fehlt es mir noch zu sehr an PureBasic-Verständnis und deswegen möchte ich erstmal das eine Problem lösen. Da das ListView bisher in XProfan erstellt wird kann ich keine Gadgetbefehle benutzen. Das ListView direkt in der DLL zu erstellen und das Handle an das aufrufende Programm zu übergeben ist natürlich eine tolle Idee!
Meine Funktion funktioniert so weit, nur dass ich vor der Schleife den Parameter "mask" noch einmal setzen muss. Vergisst PureBasic den Inhalt wieder? Die API setzt eigentlich nichts in der Struktur zurück, das kommt mir merkwürdig vor.
Unabhängig davon verstehe ich nicht, warum der Param-Wert nicht übergeben wird:
Ich setze das Flag und weise lParam einen Wert zu. Die Zeile im ListView wird erstellt, aber es kommt kein Param an. Das Beispiel aus dem Link macht im Prinzip genau das gleiche.
Wenn ich den Code einkürze (mit #LF$) bleibt das ListView leer:
Zur Erinnerung: In XProfan werden die SubItems standardmäßig mit "|" getrennt, deshalb die Umwandlung.
Edit: Das #LF$ wird wohl nur bei der entsprechenden Gadget-Funktion wirken.
Vielen Dank,
Jac
Ich will mich erstmal an PureBasic rantasten. Ich habe ein Projekt für meine Arbeit, rund 4000 Zeilen in XProfan, und will einige sehr oft wiederholte Passagen in PureBasic umsetzen, weil XProfan sehr langsam ist. Unabhängig von Sinn oder Unsinn dieser Sache fehlt es mir noch zu sehr an PureBasic-Verständnis und deswegen möchte ich erstmal das eine Problem lösen. Da das ListView bisher in XProfan erstellt wird kann ich keine Gadgetbefehle benutzen. Das ListView direkt in der DLL zu erstellen und das Handle an das aufrufende Programm zu übergeben ist natürlich eine tolle Idee!
Meine Funktion funktioniert so weit, nur dass ich vor der Schleife den Parameter "mask" noch einmal setzen muss. Vergisst PureBasic den Inhalt wieder? Die API setzt eigentlich nichts in der Struktur zurück, das kommt mir merkwürdig vor.
Unabhängig davon verstehe ich nicht, warum der Param-Wert nicht übergeben wird:
Code: Alles auswählen
Procedure AddLVItem(hnd,strg.s)
Protected message.LVITEM
message.LVITEM\mask=#LVIF_TEXT | #LVIF_PARAM
message.LVITEM\iItem=SendMessage_(hnd,#LVM_GETITEMCOUNT,0,0)
message.LVITEM\lParam=Val(StringField(strg,2,Chr(9)))
strg=StringField(strg,1,Chr(9))
temp.s=StringField(strg,1,"|")
message.LVITEM\pszText=@temp
message.LVITEM\iItem=SendMessage_(hnd,#LVM_INSERTITEMA,0,message)
message.LVITEM\mask=#LVIF_TEXT
For loop = 1 To CountString(strg,"|")
temp=StringField(strg,loop+1,"|")
message.LVITEM\pszText=@temp
message.LVITEM\iSubItem=loop
SendMessage_(hnd,#LVM_SETITEMA,0,message)
Next
EndProcedure
Wenn ich den Code einkürze (mit #LF$) bleibt das ListView leer:
Code: Alles auswählen
Procedure AddLVItem(hnd,strg.s)
Protected message.LVITEM
message.LVITEM\mask=#LVIF_TEXT | #LVIF_PARAM
message.LVITEM\iItem=SendMessage_(hnd,#LVM_GETITEMCOUNT,0,0)
message.LVITEM\lParam=Val(StringField(strg,2,Chr(9)))
strg=StringField(strg,1,Chr(9))
temp.s=ReplaceString(strg,"|",#LF$);StringField(strg,1,"|")
message.LVITEM\pszText=@temp
message.LVITEM\iItem=SendMessage_(hnd,#LVM_INSERTITEMA,0,message)
; message.LVITEM\mask=#LVIF_TEXT
; For loop = 1 To CountString(strg,"|")
; temp=StringField(strg,loop+1,"|")
; message.LVITEM\pszText=@temp
; message.LVITEM\iSubItem=loop
; SendMessage_(hnd,#LVM_SETITEMA,0,message)
; Next
EndProcedure
Edit: Das #LF$ wird wohl nur bei der entsprechenden Gadget-Funktion wirken.
Vielen Dank,
Jac
Zuletzt geändert von Jac de Lad am 25.07.2019 19:41, insgesamt 4-mal geändert.
Re: AddGadgetItem und Kompatibilität mit Windows API
Wenn deine Struktur im Main oder global definiert wird, dann ist die Struktur auch dauerhaft im Main oder überall verfügbar mit allen zuvor gespeicherten Daten. Wenn du aber deine Struktur innerhalb einer Prozedur definierst (z.b. mit Protected), dann wird die Struktur nach Beendigung der Prozedur freigegeben, was richtig ist.jacdelad hat geschrieben:Vergisst PureBasic den Inhalt wieder? Die API setzt eigentlich nichts in der Struktur zurück, das kommt mir merkwürdig vor.
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: AddGadgetItem und Kompatibilität mit Windows API
Aber die Procedure ist noch nicht beendet, siehe mein letzter, editierter Beitrag.RSBasic hat geschrieben:Wenn deine Struktur im Main oder global definiert wird, dann ist die Struktur auch dauerhaft im Main oder überall verfügbar mit allen zuvor gespeicherten Daten. Wenn du aber deine Struktur innerhalb einer Prozedur definierst (z.b. mit Protected), dann wird die Struktur nach Beendigung der Prozedur freigegeben, was richtig ist.jacdelad hat geschrieben:Vergisst PureBasic den Inhalt wieder? Die API setzt eigentlich nichts in der Struktur zurück, das kommt mir merkwürdig vor.
Re: AddGadgetItem und Kompatibilität mit Windows API
Ist etwas her mit API aber so gehts.
LVIF_PARAM habe ich ausgeklammert da PB wohl intern dort was ablegt...
Info
PB hinterlegt auf Param ein Pointer auf die Daten (SetGadgetItemData, etc)
Update v2.0
Text und Parameter müssen getrennt zugewiesen werden.
LVIF_PARAM habe ich ausgeklammert da PB wohl intern dort was ablegt...
Info
PB hinterlegt auf Param ein Pointer auf die Daten (SetGadgetItemData, etc)
Update v2.0
Text und Parameter müssen getrennt zugewiesen werden.
Code: Alles auswählen
;-TOP
EnableExplicit
ProcedureDLL API_AddListViewItem(hListView, Text.s)
Protected LvItem.LvItem
Protected r1, item, column, columns, szText.s, param
columns = CountString(Text, #TAB$) + 1
item = SendMessage_(hListView, #LVM_GETITEMCOUNT, 0, 0)
param = Val(StringField(Text, 2, #TAB$))
LvItem\mask = #LVIF_TEXT
LvItem\iItem = item
LvItem\iSubItem = 0
r1 = SendMessage_(hListView, #LVM_INSERTITEM, 0, LvItem)
If r1
For column = 0 To columns
szText = StringField(Text, column + 1, "|")
LvItem\iItem = item
LvItem\iSubItem = column
LvItem\pszText = @szText
SendMessage_(hListView, #LVM_SETITEM, 0, LvItem)
Next
LvItem\mask = #LVIF_PARAM
LvItem\iItem = Item
LvItem\iSubItem = 0
LvItem\lParam = Param
SendMessage_(hListView, #LVM_SETITEM, 0, LvItem)
EndIf
ProcedureReturn r1
EndProcedure
Procedure API_GetListViewParam(hListView, Item)
Protected LvItem.LvItem, r1
LvItem\mask = #LVIF_PARAM
LvItem\iItem = Item
LvItem\iSubItem = 0
r1 = SendMessage_(hListView, #LVM_GETITEM, 0, LvItem)
ProcedureReturn LvItem\lParam
EndProcedure
Procedure API_SetListViewParam(hListView, Item, Param)
Protected LvItem.LvItem, r1
LvItem\mask = #LVIF_PARAM
LvItem\iItem = Item
LvItem\iSubItem = 0
LvItem\lParam = Param
r1 = SendMessage_(hListView, #LVM_SETITEM, 0, LvItem)
ProcedureReturn r1
EndProcedure
;-Test
Define Event, hWnd
Procedure DoEvent()
EndProcedure
If OpenWindow(0, 100, 100, 300, 100, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 5, 5, 290, 90, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
hWnd = GadgetID(0)
AddGadgetColumn(0, 1, "Address", 250)
AddGadgetColumn(0, 1, "Telefon", 250)
AddGadgetItem(0, -1, "Harry Rannit" + Chr(10) + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + Chr(10) + "130 PureBasic Road, BigTown, CodeCity")
API_AddListviewItem(hWnd, "John Doe|Street 10|555-800-2019"+#TAB$+"0")
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Zuletzt geändert von mk-soft am 25.07.2019 21:44, insgesamt 3-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: AddGadgetItem und Kompatibilität mit Windows API
Der Code entspricht in etwa meinem und ich kriege auch den ganzen Text rein. Param klappt trotzdem nicht. Da das Control nicht von PureBasic erstellt wurde und nur API darauf angewendet wird erwarte ich eigentlich, dass es klappt. Das Flag wird ja auch erkannt. Ich habe auch kontrolliert, ob param in meiner Funktion überhaupt einen Wert bekommt oder er unterwegs verloren geht; ja er ist da. Es ist so als ob das Flag einfach ignoriert wird...
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: AddGadgetItem und Kompatibilität mit Windows API
Grr, du hast recht, der lParam-Wert wird von PureBasic intern benutzt: https://www.purebasic.fr/english/viewtopic.php?t=22130
Re: AddGadgetItem und Kompatibilität mit Windows API
So lange du keine Gadgets von PB verwendest, wird es für Profan als DLL funktionieren.
Habe Profan v7.6 lange nicht mehr benutzt. Letzte Anwendung war noch mit Profan 4.5 für Windows 3.11
Sollte XProfan noch AscII sein, lade dir die PB Version 5.46 aus dem Museum und Kompiliere die DLL als nicht Unicode (Compiler-Optionen)
Habe Profan v7.6 lange nicht mehr benutzt. Letzte Anwendung war noch mit Profan 4.5 für Windows 3.11
Sollte XProfan noch AscII sein, lade dir die PB Version 5.46 aus dem Museum und Kompiliere die DLL als nicht Unicode (Compiler-Optionen)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: AddGadgetItem und Kompatibilität mit Windows API
Im aktuellen PB gibts auch eine Option als nicht Unicode zu compilieren.