ListIconGadget und #PB_ListIcon_MultiSelect

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bevor ich dem Einsteiger erkläre:
ListIconGadget = ListView
ListViewGadget = ListBox
laß ich es lieber :lol: und warte bis er selber nach API verlangt
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

Werden hier nicht Äpfel und Birnen verglichen?

Der "API - Test" liefert den Index des ersten selektierten Items.
Das macht PB wahrscheinlich genau so und genau so schnell mit

Code: Alles auswählen

GetGadgetState()
Irgendwann im letzten Jahrtausend habe ich mal verinnerlicht:
Bei normalen Applikationen kann kein Nutzer Reaktionszeiten unter einer Zehntelsekunde wahrnehmen.

Code: Alles auswählen


DisableDebugger 

Procedure main() 
  Protected win 
  Protected lv 
  Protected event 
  Protected i 
  Protected item 
  Protected time 
  Protected count 
  
  win = OpenWindow(0,#PB_Ignore,#PB_Ignore,304,304,"Test") 
  
  lv = ListIconGadget(0,2,2,200,300,"Test",200,#PB_ListIcon_MultiSelect|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)  
  ButtonGadget(1,205,2,75,23,"API Test") 
  TextGadget(2,205,32,75,23,"Time : ") 
  
  ButtonGadget(3,205,57,75,23,"PB Test") 
  TextGadget(4,205,87,75,23,"Time : ")  
  
  For i = 0 To 100000 
    AddGadgetItem(0,-1,"item " + Str(i)) 
  Next    
  
  Repeat 
    event = WaitWindowEvent() 
    
    If event = #PB_Event_Gadget 
      
      If EventGadget() = 1 
        
        time = ElapsedMilliseconds() : i = 0
        Repeat
          item = i
          i = SendMessage_(lv,#LVM_GETNEXTITEM,i,#LVNI_SELECTED) 
        Until i = -1 
        
        SetGadgetText(2,"Time : " + Str(ElapsedMilliseconds() - time) + " " + Str(item)) 
        
        item = 0
        
      EndIf 
      
      If EventGadget() = 3 
        
        time = ElapsedMilliseconds() 
        
        item = GetGadgetState(0)
       
        SetGadgetText(4,"Time : " + Str(ElapsedMilliseconds() - time) + " " + Str(item)) 
        
        item = 0
        
      EndIf 
      
    EndIf 
    
  Until event = #PB_Event_CloseWindow 
  
EndProcedure:main() 
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

>>> Werden hier nicht Äpfel und Birnen verglichen?

Wie kommst du denn darauf?

Die API-Funktion von edel ist rekursiv und erhält automatisch das darauffolgende Item zurück. Also wenn Item bei 0 anfängt, kommt beim
nächsten Durchlauf 1, darauf 2 usw. bis keins mehr da ist. Das wäre dann -1

Bei der PB-Funktion ist das leider nicht möglich, womit man dann die Gesamtanzahl der items vorher festlegen muss:

count = CountGadgetItems(0) - 1

Diese können dann mit Hilfe von For/Next, While / Wend oder Repeat / Until durchlaufen werden.

denn SetGadgetItemState() gibt nur den Status der Items in ListIconGadget zurück. Aber nicht den Index, wie die Api das machen kann.

Was nützt dann einem das GetGadgetState(0) , womit man nur den ersten Index erhält, aber nicht damit prüfen kann, ob ein Index des ListIconGadget gesetzt wurde.

Wo sind da die Äpfel und die Birnen :freak:

Hast du deinen Source mal ausprobiert, die Items mal alle markiert, als auch mal bei beiden Funktionen ein Debug Item gesetzt?

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Item sollte eigentlich -1 sein, also so

Code: Alles auswählen

item = -1
Repeat 
  item = SendMessage_(lv,#LVM_GETNEXTITEM,item,#LVNI_SELECTED) 
Until item = -1
Und es ist nicht der gleiche Befehl, PB nutzt LVM_GETITEMSTATE.

Ich weiss ja nicht was ihr alles fuer super Rechner habt, aber bei
mir ist PB, in meinem Beispiel, 200 mal langsamer.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Ich hab jetzt dein Bsp. getestet.

Api ergibt immer 0, PB fast immer 0, ab und zu 16 ms.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

cxAlex hat geschrieben:Ich hab jetzt dein Bsp. getestet.

Api ergibt immer 0, PB fast immer 0, ab und zu 16 ms.
also, wie ich sagte, keine Aussagekraft, überhaupt keine.

den Vorgang vertausendfachen, damit ein überhaupt wahrnehmbarer Meßwert entsteht,
am besten verZEHNtausendfachen, damit der Meßwert auch eine wirkliche Aussagekraft bekommt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

@php-freak: Bei hjbremers 1.Code musst du eben List einfügen. Dann gehts.
Win11 x64 | PB 6.20
php-freak
Beiträge: 536
Registriert: 07.02.2009 18:08

Beitrag von php-freak »

Jo ich habs jetzt!
PureBasic 4.30 (x86)
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

php-freak hat geschrieben:Jo ich habs jetzt!
gut dass das jetzt funktioniert.
und.., ähem... viel Spaß noch, wenn du jetzt wieder gesund bist...
Win11 x64 | PB 6.20
Antworten