Aktuelle Zeit: 11.07.2020 19:53

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 16:39 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
@jacdelad:

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

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 18:50 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
@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:
...
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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 19:17 
Offline
Benutzeravatar

Registriert: 24.07.2019 17:53
Wohnort: Riesa
@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:
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:
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 jacdelad am 25.07.2019 19:41, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 19:37 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
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.

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 19:38 
Offline
Benutzeravatar

Registriert: 24.07.2019 17:53
Wohnort: Riesa
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 20:13 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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:
;-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

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Zuletzt geändert von mk-soft am 25.07.2019 21:44, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 20:44 
Offline
Benutzeravatar

Registriert: 24.07.2019 17:53
Wohnort: Riesa
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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 21:00 
Offline
Benutzeravatar

Registriert: 24.07.2019 17:53
Wohnort: Riesa
Grr, du hast recht, der lParam-Wert wird von PureBasic intern benutzt: https://www.purebasic.fr/english/viewtopic.php?t=22130


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 25.07.2019 21:23 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: AddGadgetItem und Kompatibilität mit Windows API
BeitragVerfasst: 28.07.2019 11:29 
Offline
Benutzeravatar

Registriert: 24.07.2019 17:53
Wohnort: Riesa
Im aktuellen PB gibts auch eine Option als nicht Unicode zu compilieren.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye