Seite 2 von 3

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 16:39
von Kiffi
@jacdelad:

was war jetzt noch mal der Grund, warum das ListIconGadget nicht Deinen Anforderungen entspricht?

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 18:50
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.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 19:17
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

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 19:37
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.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 19:38
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.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 20:13
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

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 20:44
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...

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 21:00
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

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 21:23
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)

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 28.07.2019 11:29
von Jac de Lad
Im aktuellen PB gibts auch eine Option als nicht Unicode zu compilieren.