Seite 1 von 1

[gelöst] ListIconGadget-Zeile ersetzen

Verfasst: 09.10.2007 22:57
von scholly
moin, moin...

Wie ersetze ich am geschicktesten eine komplette Zeile eines LIG ?

Ein analog zu AddGadgetItem habe ich nicht gefunden (oder wieder nicht richtig gesucht :( ).

Im Moment schwebt mir vor:
a) Zelle für Zelle in einer Schleife ersetzen
oder
b) einfach eine neue Zeile an der Stelle der zu ändernden einfügen und dann die nächste löschen.

Ich tendiere zu b) oder gibts 'nen besseren Weg ?

bis denne... scholly

Verfasst: 09.10.2007 23:19
von roherter
Wenn Textmässig was anderes drin stehen soll müsste eigenlich SetGadgetItemText() gehen, wenn ich mich nicht irre!

Verfasst: 09.10.2007 23:35
von scholly
roherter hat geschrieben:Wenn Textmässig was anderes drin stehen soll müsste eigenlich SetGadgetItemText() gehen, wenn ich mich nicht irre!
Ja, das wäre Fall a), denn das gilt IMHO nicht für die komplette Zeile sondern nur eine Zelle:
HTML Help hat geschrieben:Ändert den Text des angegebenen 'Eintrag's (in der 'Spalte') beim angegebenen '#Gadget'.

Verfasst: 10.10.2007 00:20
von Kaeru Gaman
jetzt mal nur theorie, ich hab selber mit ListIconGadget noch nix gemacht/machen brauchen.
aber in der theorie ist ne tabelle ne tabelle.

wenn es dir wirklich auf ersetzen ankommt, weil du irgendwie pointer mitschreibst oder sonstwas,
wäre es natürlich "korrekter", die zeile zu ersetzen indem du mit einer schleife alle zellen überschreibst.

aber solange es nicht nötig ist, dass der physikalische speicherort erhalten bleibt,
bist du mit einfügen und löschen einfacher unterwegs.

wenn du woanders ersetzen willst, als sich der zeilenzeiger grade befand,
musst du den natürlich zwischenspeichern, damit du ihn nachher wieder auf den ursprung setzen kannst.

Verfasst: 10.10.2007 00:36
von edel
Mit WinApi geht es natuerlich einfacher

Code: Alles auswählen

Procedure ChangeCellContent(gadget,row,col,content.s,maxColumn)
    Protected cont.s
    
    For i = 0 To maxColumn - 1
      
      If col = i
        cont + content
        Else
        cont + GetGadgetItemText(gadget,row,i)
      EndIf 
      
      cont + #LF$
      
    Next 
    
    RemoveGadgetItem(gadget,row)    
    AddGadgetItem(gadget,row,cont)
  
EndProcedure

hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,410,310,"Test")

CreateGadgetList(hwnd)
ListIconGadget(0,100,5,300,300,"1",30,#PB_ListIcon_GridLines)
AddGadgetColumn(0,1,"2",30)
AddGadgetColumn(0,2,"3",30)
AddGadgetColumn(0,3,"bla",200)

ButtonGadget(1,10,10,75,23,"Change")

For i = 0 To 9
  AddGadgetItem(0,i,Str(i)+#LF$+Str(i)+#LF$+Str(i)+#LF$+Str(i)+#LF$)
Next 

Repeat
  event = WaitWindowEvent()
  
  If event = #PB_Event_Gadget
    
    If EventGadget() = 1
      For i = 0 To CountGadgetItems(0) - 1
        ChangeCellContent(0,i,2,"666",4)    
      Next
    EndIf 
     
  EndIf 
  
Until event = #PB_Event_CloseWindow

Verfasst: 10.10.2007 10:39
von AND51
> Wie ersetze ich am geschicktesten eine komplette Zeile eines LIG ?
Löschen und einfügen:

Code: Alles auswählen

  ; Zeigt mögliche Flags des ListIconGadgets in Aktion...
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    ; linke Spalte
    ListIconGadget(5, 5, 5, 555, 222, "", 200,#PB_ListIcon_GridLines)
      For b = 2 To 4          ; fügt 3 weitere Spalten zu jedem ListIcon hinzu
        AddGadgetColumn(5, b, "Column " + Str(b), 65)
      Next
      For b = 0 To 10          ; fügt 10 Einträge auf jeder Zeile der ListIcons hinzu
        AddGadgetItem(5, b, "Item "+Str(b)+Chr(10)+"Item "+Str(b)+Chr(10)+"Item "+Str(b)+Chr(10)+"Item "+Str(b))
      Next

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    
    RemoveGadgetItem(5, 3)
    AddGadgetItem(5, 3, "DIESE"+Chr(10)+"ZEILE"+Chr(10)+"WIRD"+Chr(10)+"ERSETZT")
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Um den Effekt zu sehen, bitte einmal Fenster schließen, war zu faul, EventGadget() einzubauen.


Daraus kann man ein kleines Macro machen:

Code: Alles auswählen

Macro ReplaceGadgetItem(Gadget, Item, Text)
	RemoveGadgetItem(Gadget, Item)
	AddGadgetItem(Gadget, Item, Text)
EndMacro
> Ein analog zu AddGadgetItem habe ich nicht gefunden
Ist es das, was du dir vorgestellt hast?

Verfasst: 10.10.2007 12:37
von scholly
AND51 hat geschrieben:Ist es das, was du dir vorgestellt hast?
Jo, Zeile schreiben/löschen hab ich letztendlich (ohne Makro) eingebaut.

@edel:
API nehm ich eigentlich nur, wenns mit PB-Boardmitteln nicht geht, und Zelle für Zelle wäre mühsamer, weil ich den Aufbau des kompletten Strings aus einer anderen Routine (Hinzufügen eines Datensatzes) übernehmen kann.

@KG
Der Benutzer öffnet mit einem Doppelklick auf eine Zeile ein 2. Fenster mit einer Maske, in dem der Datensatz Feld für Feld geändert werden kann. Jenachdem, wie man das nutzten will, kann man die Inhalte nach den Änderungen nun als neuen Datensatz hinzufügen oder als Korrektur den alten Datensatz ersetzen.
Insofern nix kritisches; ich bin nur darüber gestolpert, daß ich in der SQLite-DB per (Replace in ........) einfach ersetzen konnte, aber was entsprechendes fürs LIG nicht offensichtlich war.

Danke... scholly