Listbox Items löschen [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Timn97
Rookie
Rookie
Beiträge: 15
Registriert: Do, 19. Apr 2018 11:45

Listbox Items löschen [Erledigt]

Beitrag von Timn97 »

Hallo zusammen :)

Ich stehe vor folgendem Problem. Ich möchte in meiner Listbox per Button Bestätigung ,einzelne Items aus meiner Listbox löschen .
Mit XbpListBox:delItem() kann man ja einzelene Items löschen z.b XbpListBox:delItem(3) würde immer die dritte Position löschen :)
Wie schaffe ich es dass es immer die aktuelle markierte Stelle löscht ? Ich klick auf das Item in der Listbox, es färbt sich blau, ich drücke auf den Button Löschen und das Item fliegt raus.

Viele Grüße Tim
Zuletzt geändert von Timn97 am Di, 26. Jul 2022 15:34, insgesamt 1-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Listbox Items löschen

Beitrag von brandelh »

Entweder reagierst du auf den MarkedItem Slot ... oder fragst die markierten Items ab:

Code: Alles auswählen

Returns the selected items in the list box. 
:getData() --> aItemPos
beachte dass du immer ein array zurück bekommst, das die Nummern der Markierten Elemente enthält, beim Löschen mit dem höchsten Element anfangen ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Listbox Items löschen

Beitrag von AUGE_OHR »

Timn97 hat geschrieben: Fr, 05. Okt 2018 8:26 Wie schaffe ich es dass es immer die aktuelle markierte Stelle löscht ?
Ich klick auf das Item in der Listbox, es färbt sich blau, ich drücke auf den Button Löschen und das Item fliegt raus.
wenn du eine Event Loop hast würde ich es so einbauen

Code: Alles auswählen

   nEvent := 0
   DO WHILE .NOT. lExit
      nEvent := APPEVENT( @mp1, @mp2, @oXbp )
      DO CASE
         CASE nEvent == xbeP_Keyboard .AND. mp1 == xbeK_DEL
            oListbox:delItem( oListbox:GetData()[1] )
gruss by OHR
Jimmy
Timn97
Rookie
Rookie
Beiträge: 15
Registriert: Do, 19. Apr 2018 11:45

Re: Listbox Items löschen

Beitrag von Timn97 »

brandelh hat geschrieben: Fr, 05. Okt 2018 9:28 Entweder reagierst du auf den MarkedItem Slot ... oder fragst die markierten Items ab:

Code: Alles auswählen

Returns the selected items in the list box. 
:getData() --> aItemPos
beachte dass du immer ein array zurück bekommst, das die Nummern der Markierten Elemente enthält, beim Löschen mit dem höchsten Element anfangen ;-)
Ich habe verstanden was Sie meinen aber bei mir ist das Array immer leer...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Listbox Items löschen

Beitrag von brandelh »

wir duzen uns hier ohne das böse zu meinen ;-)

Wenn das Array leer ist, wurde keine Zeile ausgewählt (angeklickt) ...
Gruß
Hubert
Timn97
Rookie
Rookie
Beiträge: 15
Registriert: Do, 19. Apr 2018 11:45

Re: Listbox Items löschen

Beitrag von Timn97 »

Habe jetzt was im Array drin stehen aber delItem hat eine falschen Parameter kann ich nicht oListbox1:delItem(aItemPos[1]) aItem enspricht dem Array und es hat nur einen Wert drin weil ich nur einen anklicke


ERROR:

oError:args :
-> VALTYPE: O CLASS: XbpListBox
-> VALTYPE: A VALUE: {1}
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : :delItem
oError:osCode : 0
oError:severity : 2
oError:subCode : 1025
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Listbox Items löschen

Beitrag von brandelh »

etwas mehr code wäre nützlich ;-)
Gruß
Hubert
Timn97
Rookie
Rookie
Beiträge: 15
Registriert: Do, 19. Apr 2018 11:45

Re: Listbox Items löschen

Beitrag von Timn97 »

Habs herrausgefunden:) habe mir eine löschen Methode geschrieben und die beim Button die aufgerufen und das Funktioniert so :)


Code: Alles auswählen

   PROCEDURE Loeschen()
   LOCAL aArrayy:= oListbox1:getData()
   LOCAL x:= 0


   DO WHILE ++x <= LEN(aArrayy)

     oListbox1:delItem(aArrayy[x])


   ENDDO
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Listbox Items löschen

Beitrag von brandelh »

Deine PROZEDUR greift direkt auf die Variable der Listbox zu, damit das funktioniert, muss diese Public, Private oder static sein,
besser wäre es diese als Parameter zu übergeben ...

Code: Alles auswählen


PROCEDURE ListBoxEintragLoeschen(oObj)
   LOCAL aArrayy:= oObj:getData()
   LOCAL x:= 0


   DO WHILE ++x <= LEN(aArrayy)

     oObj:delItem(aArrayy[x])


   ENDDO
Problematisch könnte dieser Ansatz werden, wenn mehrere markiert werden können und man einen Eintrag zwischen drin löscht ...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Listbox Items löschen

Beitrag von AUGE_OHR »

hi,
Timn97 hat geschrieben: Fr, 05. Okt 2018 11:55 Habs herrausgefunden:) habe mir eine löschen Methode geschrieben und die beim Button die aufgerufen und das Funktioniert so :)
ein Eintrag in einer Listbox ist selectiert wenn du einen Balken in der Listbox hast.
damit liefert o:GetData() ein Array mit den Nummer die durch einen Balken markiert sind.

Default ist o:markMode := XBPLISTBOX_MM_SINGLE d.h. man kann nur 1 Item selektieren, das wo man mit dem Balken drauf steht. wenn man mehrere markieren will muss man XBPLISTBOX_MM_MULTIPLE verwenden.

---

du hast es jetzt zwar über einen Button gelöst aber deine Frage zuerst war ja Keyboard.

Code: Alles auswählen

   oListbox:Keyboard := {| nKeyCode, uNIL, self | IF( nKeyCode = xbeK_DEL,;
                                                  IF(.NOT. EMPTY(oListbox:GetData()),;
                                                  oListbox:delItem( oListbox:GetData()[1] ),NIL),NIL) }
damit löscht man per Keyboard das Item wo man gerade steht.
! Note : danach verschwindet der Balken. mit dem Cursor/Maus kann man aber den nächsten wählen

um das ganz aufzulösen kann man es auch so schreiben

Code: Alles auswählen

   oListbox:Keyboard := {| nKeyCode, uNIL, self | IF( nKeyCode = xbeK_DEL, Do_loesch(oListbox), NIL )

PROCEDURE Do_loesch(oListbox)
LOCAL aData := oListbox:GetData()
LOCAL i,iMax,nNum

   IF .NOT. EMPTY(aData)
      iMax := LEN(aData)  // für mehrer ausgelegt

      // bei der gössten Nummer anfangen 
      ASORT(aData) 
      FOR i := iMax TO 1 STEP -1
         nNum := aData[i]
         oListbox:delItem(nNum)
      NEXT
   ENDIF

   // hier den Balken neu positionieren 
   IF nNum-1 > 0
      oListbox:SetData({nNum-1})
   ELSE
      oListbox:SetData({1})
   ENDIF 
RETURN
selbstverständlich kannst man Do_loesch() auch per Button aktivieren
gruss by OHR
Jimmy
Antworten