AddGadgetItem und Kompatibilität mit Windows API

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: AddGadgetItem und Kompatibilität mit Windows API

Beitrag von Kiffi »

@jacdelad:

was war jetzt noch mal der Grund, warum das ListIconGadget nicht Deinen Anforderungen entspricht?
Hygge
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: AddGadgetItem und Kompatibilität mit Windows API

Beitrag von mk-soft »

@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.

Code: Alles auswählen

...
message.LVITEM\mask=#LVIF_TEXT
...
SendMessage_(hnd,#LVM_INSERTITEM,0,message) 
...
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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
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

Beitrag von Jac de Lad »

@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:

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
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:

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
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
Zuletzt geändert von Jac de Lad am 25.07.2019 19:41, insgesamt 4-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: AddGadgetItem und Kompatibilität mit Windows API

Beitrag von RSBasic »

jacdelad hat geschrieben:Vergisst PureBasic den Inhalt wieder? Die API setzt eigentlich nichts in der Struktur zurück, das kommt mir merkwürdig vor.
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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
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

Beitrag von Jac de Lad »

RSBasic hat geschrieben:
jacdelad hat geschrieben:Vergisst PureBasic den Inhalt wieder? Die API setzt eigentlich nichts in der Struktur zurück, das kommt mir merkwürdig vor.
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.
Aber die Procedure ist noch nicht beendet, siehe mein letzter, editierter Beitrag.
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: AddGadgetItem und Kompatibilität mit Windows API

Beitrag von mk-soft »

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.

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
Benutzeravatar
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

Beitrag von Jac de Lad »

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...
Benutzeravatar
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

Beitrag von Jac de Lad »

Grr, du hast recht, der lParam-Wert wird von PureBasic intern benutzt: https://www.purebasic.fr/english/viewtopic.php?t=22130
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: AddGadgetItem und Kompatibilität mit Windows API

Beitrag von mk-soft »

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 8)

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
Benutzeravatar
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

Beitrag von Jac de Lad »

Im aktuellen PB gibts auch eine Option als nicht Unicode zu compilieren.
Antworten