Den Inhalt des Arrays kann man sehr wohl ändern, nur für ein neues Array braucht man ein neues DacPagedDataStore().
Hier habe ich ein Beispiel gefunden, bei dem ich einerseits neue Zeilen einfüge (sortiert nach Zeitraum), lösche oder ändere.
Die Array Datenbeziehung wird nicht gebrochen und das funktiert in meinem Programm, hier die verschiedenen Aufrufe zur jeweiligen Methode des Fensters (auszugsweise):
Code: Alles auswählen
CLASS tpBeaDiag FROM XbpTabPage
EXPORTED:
VAR aDiagListe // hier stehen die Array Daten
VAR nEditZeile // in welcher bin ich
...
VAR qbDiagListe // XbpQuickBrowse um die Daten anzuzeigen.
...
*--------------------------------------------------------------------
METHOD tpBeaDiag:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
...
::qbDiagListe := XbpQuickBrowse():new( ::gbDiagListe, ,{ 3,3 },;
{ ngbDiagListeDimX-6,;
ngbDiagListeDimY-nRandUnten*3-2},;
{ { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
// das gibt die Spaltenbreite grob vor.
::qbDiagListe:dataArea:referenceArray := {space(10),space(30),space(30),space(10)," "," "," "," "}
::qbDiagListe:clipParent := .T.
::qbDiagListe:clipSiblings := .T.
::qbDiagListe:tabStop := .T.
::qbDiagListe:hScroll := .F.
::qbDiagListe:itemSelected := {|| ::EditDiagZeile() } // im Browser nur zeigen, Editor starten.
::qbDiagListe:SetInputFocus := {|x1,x2,oXbp| ::Schalten(oXbp) } // Änderungen anzeigen
...
*--------------------------------------------------------------------
METHOD tpBeaDiag:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
::XbpTabPage:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
...
::qbDiagListe:datalink := DacPagedDataStore():new( ::aDiagListe, { SubArray_KEY,; // diese Defines ersetzen direkten Array Indexzugriff
SubArray_Ort,;
SubArray_Art,;
SubArray_AU,;
SubArray_DS,;
SubArray_AnzK,;
SubArray_AnzV } )
***** WICHTIG ***** jede Neuzuweisung ( := ) an ::aDiagListe zerstört diese Beziehung !!!!!
* Entweder nur asize() und aadd() verwenden oder eine neue DATALINK-Zuweisung wie hier !
::qbDiagListe:create()
::qbDiagListe:setHeader({"Key/LMS","Ort","Art","AU-Prog.","Doppels.","Kompl.","Vorsch."})
::qbDiagListe:dataArea:SetAlignment(1,XBPALIGN_HCENTER,.f.) // .f. nicht sofort anzeigen, da noch nicht sichtbar
::qbDiagListe:dataArea:SetAlignment(4,XBPALIGN_RIGHT,.f.)
::qbDiagListe:dataArea:SetAlignment(5,XBPALIGN_HCENTER,.f.)
::qbDiagListe:dataArea:SetAlignment(6,XBPALIGN_HCENTER,.f.)
::qbDiagListe:dataArea:SetAlignment(7,XBPALIGN_HCENTER,.f.)
::qbDiagListe:dataArea:SetColType(1,"C",,,.f.) // .f. nicht sofort anzeigen, da noch nicht sichtbar
::qbDiagListe:dataArea:SetColType(2,"C",,,.f.) // .f. nicht sofort anzeigen, da noch nicht sichtbar
::qbDiagListe:dataArea:SetColType(3,"C",,,.f.)
::qbDiagListe:dataArea:SetColType(4,"N",,"999999",.f.)
::qbDiagListe:dataArea:SetColType(5,"C",,,.f.)
::qbDiagListe:dataArea:SetColType(6,"N",,"9999",.f.)
::qbDiagListe:dataArea:SetColType(7,"N",,"9999",.f.)
::qbDiagListe:heading:SetAlignment(1,XBPALIGN_HCENTER,.f.) // .f. nicht sofort anzeigen, da noch nicht sichtbar
::qbDiagListe:heading:SetAlignment(4,XBPALIGN_RIGHT,.f.)
::qbDiagListe:heading:SetAlignment(5,XBPALIGN_HCENTER,.f.)
::qbDiagListe:heading:SetAlignment(6,XBPALIGN_HCENTER,.f.)
::qbDiagListe:heading:SetAlignment(7,XBPALIGN_HCENTER,.f.)
::qbDiagListe:setColWidth( 65,1) // WE-Key+Schweregrad
::qbDiagListe:setColWidth(160,2)
::qbDiagListe:setColWidth(160,3)
::qbDiagListe:setColWidth( 65,4)
::qbDiagListe:setColWidth( 70,5)
::qbDiagListe:setColWidth( 60,6)
::qbDiagListe:setColWidth( 60,7)
* jetzt könnte der Browser mit einem Leersatz angezeigt werden, das will ich aber nicht.
asize(::aDiagListe,0)
::qbDiagListe:datalink:refresh()
::qbDiagListe:refreshAll()
ein aSort() habe ich jetzt nicht gefunden, aber diesen Code, der genauso auf das Array zugreift und heute natürlich mit aRemove() ersetzt würde
Code: Alles auswählen
*----------------------------------------------------------------------- DelDiagZeile() -----------------------
METHOD tpBeaDiag:DelDiagZeile()
local x
x := ::qbDiagListe:getData()
if x > 0 .and. x <= len(::aDiagListe) // sonst gibt es nichts zu löschen
if XBPMB_RET_YES = ConfirmBox( ,"Zeile löschen" ?","Zeile löschen ...",;
XBPMB_YESNO , ;
XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )
// diese SYNTAX ist WICHTIG !
aDel( ::aDiagListe, x )
aSize( ::aDiagListe, len(::aDiagListe)-1)
::qbDiagListe:datalink:refresh()
::qbDiagListe:refreshall()
endif
endif
return nil
ein
::aDiagListe := aSort(::aDiagListe, ... ) würde ein neues Array anlegen und die Verbindung brechen !
aSort(::aDiagListe, ... ) per Referenz auf das bestehende, nutzt dieses weiter,
man muss aber 2 Refresh ausführen (das hatte ich vergessen)
Code: Alles auswählen
::qbDiagListe:datalink:refresh()
::qbDiagListe:refreshall()