AddGadgetItem und Kompatibilität mit Windows API

Anfängerfragen zum Programmieren mit PureBasic.
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:

AddGadgetItem und Kompatibilität mit Windows API

Beitrag 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
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 »

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

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

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

Schau mal nach Werkzeug -> Strukturverzeichnis.

Die Strukturen sind schon alle angelegt und brauchst nicht mehr selber schreiben ;)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: AddGadgetItem und Kompatibilität mit Windows API

Beitrag 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.
PB 5.60
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 »

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

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

Vielleicht hilft dir der Code weiter: https://www.purebasic.fr/french/viewtop ... =6&t=15675
Da gibt es u.a. eine Prozedur ListView_AddItem().
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:
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!!!
Antworten