[gelöst] ListIconGadget-Zeile ersetzen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[gelöst] ListIconGadget-Zeile ersetzen

Beitrag 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
Zuletzt geändert von scholly am 17.05.2008 16:48, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Wenn Textmässig was anderes drin stehen soll müsste eigenlich SetGadgetItemText() gehen, wenn ich mich nicht irre!
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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'.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten