Seite 1 von 3

AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 24.07.2019 18:01
von Jac de Lad
Hallo Leute,
kurze Vorgeschichte: Ich komme von XProfan und würde PureBasic gern als Ergänzung für zeitkritische Funktionen nutzen, bzw. komplett umsteigen, falls es sich lohnt (aber das ist nicht Thema dieses Threads). XProfan beherrscht ListViews (in PureBasic "ListIconGadget" genannt, nur sehr mangelhaft, deshalb hab ich eine Bibliothek erstellt, mit der mittels Windows-API ein ListView erzeugt und verwaltet werden kann. Jetzt zu meiner Frage:

Ich habe ein mittels API erstelltes ListView und möchte per PureBasic eine Zeile hinzufügen. Das klappt nicht mit AddGadgetItem (ich vermute, dass PureBasic die Gadgets intern anders verwaltet und ein ListIconGadget kein SysListView32 ist, daher kann ich das Handle meines ListViews nicht mit diesem Befehl nutzen). Ist das möglich?

Vielen Dank im Voraus,
Jac

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 24.07.2019 18:42
von RSBasic
Wenn du das ListIconGadget (ListView) mit WinAPI erstellst, dann brauchst du immer die Handle-Nummer. Bei PureBasic wird eine interne ID generiert.
Statt AddGadgetItem() musst du SendMessage_() und #LVM_INSERTITEM benutzen.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 24.07.2019 19:45
von Jac de Lad
Hallo RSBasic,
ja, in XProfan hab ich mir auch eine Funktion zusammengeschustert, die auf sendmessage basiert. Ich hatte nur gehofft, dass es auch mit einem vorgefertigten Befehl geht. Vielen Dank für die Antwort.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 24.07.2019 20:42
von Jac de Lad
Ok, also das klappt jetzt schon halb. Allerdings werden meine Substrings nicht übergeben. Zur Erklärung: in hnd kommt das Handle und in strg der String, der in das ListView soll, an. strg besteht aus mehrere Teilstrings, getrennt durch |; am Ende kommt ein Tab (Chr(9)) und ein Zahlenwert. Der erste Teilstring wird eingefügt, aber die anderen Teilstrings werden zwar ausgeschnitten, jedoch nicht eingefügt. Ich habe meinen XProfan-Code genommen und in PureBasic übersetzt und es dieser Teil besteht auch nur aus ein paar Zeilen, klappt trotzdem nicht. Kann mir jemand weiterhelfen?

Code: Alles auswählen

Structure LVADDITEM
  mask.l
  item.l
  subitem.l
  state.l
  statemask.l
  text.l
  textmax.l
  image.l
  param.l
  ident.l
  groupid.l
  ccloumns.l
  picolfmt.l
  igroup.l
EndStructure

Procedure AddLVItem(hnd,strg.s)
  message.LVADDITEM\mask=5
  message.LVADDITEM\item=SendMessage_(hnd,$1004,0,0)
  message.lvadditem\param=Val(StringField(strg,2,Chr(9)))
  strg=StringField(strg,1,Chr(9))
  temp.s=StringField(strg,1,"|")
  message.LVADDITEM\text=@temp
  SendMessage_(hnd,$1007,0,message)
  For loop = 1 To CountString(strg,"|")
    temp=StringField(strg,loop+1,"|")
    ;MessageRequester(Str(message.LVADDITEM\item),temp,0)
    message.LVADDITEM\text=@temp
    message.LVADDITEM\subitem=loop
    SendMessage_(hnd,$1006,0,message)  
  Next
EndProcedure

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 24.07.2019 23:56
von mk-soft
Schau mal nach Werkzeug -> Strukturverzeichnis.

Die Strukturen sind schon alle angelegt und brauchst nicht mehr selber schreiben ;)

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 03:59
von H.Brill
Der String für PB muß auch mit Chr(10) statt mit | unterteilt sein.
Sollte man auch beachten. Ansonsten nimmt PB alle Zeichen bis
Chr(10). Wenn dann der Teilstring genau so lang ist, wie die
erste Spalte, meint man, man hätte es richtig gemacht.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 04:47
von Jac de Lad
Hallo mk-soft,
danke für den Hinweis, das schaue ich mir gleich nach der Arbeit an.

Hello Heinz, schön dich zu sehen. :bounce:
Der erste Sendmessage-Befehl fügt eine Zeile hinzu, aber nur Text in der ersten Spalte. Mit der Schleife und dem zweiten Sendmessage-Befehl fülle ich die Subtexte. Das | ist im Moment noch eine XProfan-Altlast, stört aber nicht, da jeder Subtext einzeln geschrieben wird und das Trennzeichen dadurch irrelevant ist.

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 14:45
von Jac de Lad
Ich habs mal angepasst, die vordefinierten Strukturen kannte ich noch nicht. Auch, dass ich einen Pointer für pszText einsetzen muss ist mir neu, da ist XProfan anders. Wie auch immer, das Ergebnis ist leider immer noch das Gleiche:

Code: Alles auswählen

Procedure AddLVItem(hnd,strg.s)
  message.LVITEM\mask=5
  message.LVITEM\iItem=SendMessage_(hnd,$1004,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
  SendMessage_(hnd,$1007,0,message)
  For loop = 1 To CountString(strg,"|")
    temp=StringField(strg,loop+1,"|")
    ;MessageRequester(Str(message.LVADDITEM\item),temp,0)
    message.LVITEM\pszText=@temp
    message.LVITEM\iSubItem=loop
    SendMessage_(hnd,$1006,0,message)  
  Next
EndProcedure

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 15:08
von RSBasic
Vielleicht hilft dir der Code weiter: https://www.purebasic.fr/french/viewtop ... =6&t=15675
Da gibt es u.a. eine Prozedur ListView_AddItem().

Re: AddGadgetItem und Kompatibilität mit Windows API

Verfasst: 25.07.2019 16:10
von Jac de Lad
@RSBasic:
Ja, ein wenig. Ich muss die Maske vor dem For nochmal neu setzen:

Code: Alles auswählen

  message.LVITEM\mask=1
Vielen Dank für die Hilfe!!!