Listicongadget Inhalt speichern, geht das noch einfacher ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Listicongadget Inhalt speichern, geht das noch einfacher ?

Beitrag von hjbremer »

Das Auslesen einer ListIconGadget Zeile mit GetGadgetItemText für jede Spalte erscheint mir doch etwas umständlich.
Schließlich geht das Zuweisen mittels #LF$ als Trenner ja auch einfach.

Gibt es einen besseren Weg als in meinem Beispielcode ?

Code: Alles auswählen

#dnr2 = 1
#Gadget_1 = 0 
#maxspalten = 2

Procedure LvInhaltSpeichern (dat$,pbnr,anzspalten)

  anzahlzeilen = CountGadgetItems(pbnr)
  
  If CreateFile(#dnr2, dat$)

      For j = 1 To anzahlzeilen
      
        zeile$ = ""
        For k = 0 To #maxspalten
          zeile$ + GetGadgetItemText(pbnr, j-1, k) + #LF$
        Next
        
        Debug zeile$
        
        WriteStringN(#dnr2,zeile$)      
      
      Next
      
      CloseFile(#dnr2)

  EndIf

EndProcedure

;-------------------------------------------------------

OpenWindow(0,0,0,400,600,"Test",1+#PB_Window_SystemMenu) And CreateGadgetList(WindowID(0)) 
    
  hLV = ListIconGadget(#Gadget_1,0,0,275,500, "1", 90) 
  For j = 1 To #maxspalten
    AddGadgetColumn(#Gadget_1, j, Str(j+1), 90) 
  Next 
   
  For j = 1 To 10
    AddGadgetItem(#Gadget_1,-1,"Links"+Str(j) + #LF$ + "Mitte"+Str(j) + #LF$ + "Rechts"+Str(j)) 
  Next
   
  ;------------
  
  LvInhaltSpeichern ("Test.txt", #Gadget_1, #maxspalten)
  
  ;------------

  Repeat ; 
    EventID=WaitWindowEvent() 
  Until EventID=#PB_Event_CloseWindow 
 
End

Im realen Programm werden ca 6000 Zeilen geladen mit je 20 Spalten, diese haben als Spaltentrenner bereits #LF$. Das Programm ändert einige Zeilen oder fügt welche hinzu und speichert das Ganze. Bisher habe ich ein Datenfeld benutzt, aber den Verwaltungsaufwand für Feld und ListIconGadget möchte ich reduzieren.
Dazu brauche ich eine schnelle Routine, welche den Inhalt des Listicongadget speichert.

PS: mein Rechner ist ein Oldie
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Du könntest das mit gnozal's PureLVSORT Library tun. Darin gibt es einen Befehl, der den Inhalt eines ListIconGadgets in eine Datei abspeichert, wahlweise gleich komprimiert.

Ebenso gibt es einen Befehl, der eine Datei (komprimiert oder nicht) wieder in das ListIcon läd.

Probier die Lib mal aus, sie enthält sehr viele, nützliche Befehle rund um's ListIconGadget(). :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@hjbremer:
Im Grunde ist es doch nicht weiter schwer, zusätzlich mit einem Array zu
arbeiten. Du musst dir nur ein paar Procedures stricken, die das Array und
das ListIconGadget gleichzeitig verwalten und dann nur noch die benutzen.
So mache ich es in meinem aktuellen Projekte auch.

In einer LinkedList sind alle Elemente in einer Structure für das ListIconGadget gespeichert. Im ListIconGadget verlinke ich die Pointer zu jedem Element dann über 'SetGadgetItemData()'. Wenn ich dann ein Element irgendwo hinzufügen möchte, brauche ich nur mit 'GetGadgetItemData()' das LinkedList-Element auswählen und mit 'InsertElement()' davor setzen.

Ich hab' gerade mal einen Beispiel-Code für dich gebastelt:

Code: Alles auswählen

EnableExplicit

Structure Element
  Col.s[5]
EndStructure
Global NewList Elements.Element()

Enumeration ;Windows
  #W_Main
EndEnumeration

Enumeration ;Gadgets
  #G_Main_List
  #G_Main_Add
  #G_Main_Del
  #G_Main_Open
  #G_Main_Save
EndEnumeration

Enumeration ;Menus
  #M_Main
EndEnumeration

Enumeration ;MenuItems
  #MI_Sort_Col0
  #MI_Sort_Col1
  #MI_Sort_Col2
  #MI_Sort_Col3
  #MI_Sort_Col4
  #MI_Del
EndEnumeration

Procedure Main_RefreshEntry(pos.l)
  Protected *Element.Element, a.l
  
  *Element = GetGadgetItemData(#G_Main_List, pos)
  If *Element
    For a = 0 To 4
      SetGadgetItemText(#G_Main_List, pos, *Element\Col[a], a)
    Next
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure Main_Refresh()
  Protected max.l, a.l
  
  max = CountGadgetItems(#G_Main_List) - 1
  For a = 0 To max
    Main_RefreshEntry(a)
  Next
  
  ProcedureReturn #True
EndProcedure
Procedure Main_Add(pos.l, *Element.Element = 0)
  Protected *In.Element, a.l
  
  If pos = -1
    pos = CountGadgetItems(#G_Main_List)
    LastElement(Elements())
    If AddElement(Elements()) = 0 : ProcedureReturn #False : EndIf
  Else
    *In = GetGadgetItemData(#G_Main_List, pos)
    If *In
      ChangeCurrentElement(Elements(), *In)
      If InsertElement(Elements()) = 0 : ProcedureReturn #False : EndIf
    Else
      ProcedureReturn #False
    EndIf
  EndIf
  
  If *Element
    For a = 0 To 4
      Elements()\Col[a] = *Element\Col[a]
    Next
  EndIf
  
  AddGadgetItem(#G_Main_List, pos, "")
  SetGadgetItemData(#G_Main_List, pos, @Elements())
  Main_RefreshEntry(pos)
  
  ProcedureReturn pos
EndProcedure
Procedure Main_Del(pos.l)
  Protected *Element.Element
  
  If pos < 0 : ProcedureReturn #False : EndIf
  
  *Element = GetGadgetItemData(#G_Main_List, pos)
  If *Element
    ChangeCurrentElement(Elements(), *Element)
    DeleteElement(Elements())
    RemoveGadgetItem(#G_Main_List, pos)
    
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure Main_Set(pos.l, *Element.Element)
  Protected *In.Element, a.l
  
  *In = GetGadgetItemData(#G_Main_List, pos)
  If *In
    For a = 0 To 4
      *In\Col[a] = *Element\Col[a]
    Next
    Main_RefreshEntry(pos)
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure Main_Get(pos.l)
  If pos >= 0
    ProcedureReturn GetGadgetItemData(#G_Main_List, pos)
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure Main_Sort(Col.l)
  SortStructuredList(Elements(), 0, Col * SizeOf(String), #PB_Sort_String)
  Main_Refresh()
  
  ProcedureReturn #True
EndProcedure

Procedure File_WriteString(FileID.l, String.s)
  WriteLong(FileID, Len(String))
  WriteString(FileID, String)
EndProcedure
Procedure.s File_ReadString(FileID.l)
  Protected l.l, s.s
  l = ReadLong(FileID)
  s = Space(l)
  ReadData(FileID, @s, l)
  ProcedureReturn s
EndProcedure

Procedure Main_Save()
  Protected File.s, FileID.l, a.l
  
  File = SaveFileRequester("Speichern unter...", "\", "Alle Dateien (*.*)|*.*", 0)
  If File = "" : ProcedureReturn #False : EndIf
  
  FileID = CreateFile(#PB_Any, File)
  If FileID
    WriteLong(FileID, CountList(Elements()))
    ForEach Elements()
      For a = 0 To 4
        File_WriteString(FileID, Elements()\Col[a])
      Next
    Next
    CloseFile(FileID)
    
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure Main_Open()
  Protected File.s, FileID.l, max.l, a.l, Element.Element, b.l
  
  File = OpenFileRequester("Öffnen...", "\", "Alle Dateien (*.*)|*.*", 0)
  If File = "" : ProcedureReturn #False : EndIf
  
  FileID = ReadFile(#PB_Any, File)
  If FileID
    ClearList(Elements())
    ClearGadgetItemList(#G_Main_List)
    max = ReadLong(FileID)
    For a = 1 To max
      For b = 0 To 4
        Element\Col[b] = File_ReadString(FileID)
      Next
      Main_Add(-1, @Element)
    Next
    CloseFile(FileID)
    
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure

Procedure Main_Change(pos.l)
  Protected s.s, a.l, r.s, *Element.Element
  
  *Element = Main_Get(pos)
  If *Element = #False : ProcedureReturn #False : EndIf
  
  For a = 0 To 4
    If a : s + ";" : EndIf
    s + *Element\Col[a]
  Next
  
  r = InputRequester("Inhalt...", "Ändern sie den Text des Eintrages:", s)
  If r
    For a = 0 To 4
      *Element\Col[a] = StringField(r, a + 1, ";")
    Next
    Main_RefreshEntry(pos)
    
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure

Define s.s, Element.Element, a.l

If OpenWindow(#W_Main, 0, 0, 400, 300, "ListIcon-Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If CreatePopupMenu(#M_Main)
    MenuItem(#MI_Del, "Del")
    MenuBar()
    MenuItem(#MI_Sort_Col0, "Sort Col 0")
    MenuItem(#MI_Sort_Col1, "Sort Col 1")
    MenuItem(#MI_Sort_Col2, "Sort Col 2")
    MenuItem(#MI_Sort_Col3, "Sort Col 3")
    MenuItem(#MI_Sort_Col4, "Sort Col 4")
  EndIf
  
  If CreateGadgetList(WindowID(#W_Main))
    ListIconGadget(#G_Main_List, 0, 0, 400, 280, "Col 0", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      AddGadgetColumn(#G_Main_List, 1, "Col 1", 50)
      AddGadgetColumn(#G_Main_List, 2, "Col 2", 50)
      AddGadgetColumn(#G_Main_List, 3, "Col 3", 50)
      AddGadgetColumn(#G_Main_List, 4, "Col 4", 50)
    ButtonGadget(#G_Main_Add, 0, 280, 50, 20, "Add")
    ButtonGadget(#G_Main_Del, 50, 280, 50, 20, "Del")
    ButtonGadget(#G_Main_Open, 100, 280, 50, 20, "Open")
    ButtonGadget(#G_Main_Save, 150, 280, 50, 20, "Save")
    
    For a = 1 To 10000
      Element\Col[0] = Str(a)
      Element\Col[1] = Chr(64 + a % 26)
      Element\Col[2] = RSet(Str(Random(9999)), 4, "0")
      Element\Col[3] = Chr(93 + Random(25))
      Element\Col[4] = "blubber"
      Main_Add(-1, @Element)
    Next
    
    Repeat
      a = GetGadgetState(#G_Main_List)
      
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #G_Main_List
              Select EventType()
                Case #PB_EventType_RightClick
                  DisplayPopupMenu(#M_Main, WindowID(#W_Main))
                
                Case #PB_EventType_LeftDoubleClick
                  Main_Change(a)
              EndSelect
            
            Case #G_Main_Add
              a = Main_Add(a)
              Main_Change(a)
              SetGadgetState(#G_Main_List, a)
            
            Case #G_Main_Del
              Main_Del(a)
            
            Case #G_Main_Open
              Main_Open()
            
            Case #G_Main_Save
              Main_Save()
          EndSelect
        
        Case #PB_Event_Menu
          Select EventMenu()
            Case #MI_Del       : Main_Del(a)
            Case #MI_Sort_Col0 : Main_Sort(0)
            Case #MI_Sort_Col1 : Main_Sort(1)
            Case #MI_Sort_Col2 : Main_Sort(2)
            Case #MI_Sort_Col3 : Main_Sort(3)
            Case #MI_Sort_Col4 : Main_Sort(4)
          EndSelect
      EndSelect
    ForEver
  EndIf
  CloseWindow(0)
EndIf
Ich hoffe es ist nicht zu verwirrend, weil ich keine Kommentare benutzt
habe.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

vielen Dank für die schnellen Antworten, werde diese erst einmal durchtesten.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten