XbpQuickBrowse sortieren / neu einlesen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

XbpQuickBrowse sortieren / neu einlesen

Beitrag von AUGE_OHR »

hi,

das wäre der Code für ein Quickbrowse

Code: Alles auswählen

   oQB := XbpQuickBrowse():new(oDlg:drawingArea,,{0,0},aSize)
   oQB:dataLink := DacPagedDataStore():new( aWarn )
   oQB:create()
   oQB:setHeader( aHeader )
nun möchte ich das Array neu sortieren und anzeigen was damit geht

Code: Alles auswählen

   oSort2:activate:= {|| ASORT(aWarn,,, {|aX,aY| VAL(aX[3]) < VAL(aY[3]) } ) ,;
                         oQB:dataLink := DacPagedDataStore():new( aWarn )   ,;
                         oQB:configure()          ,;
                         oQB:setHeader( aHeader ) ,;
                         oQB:refreshAll()         ,;
                         SetAppFocus( oQB )       }
ich setze also einen "neuen" o:datalink ... und was passiert mit dem "alten" DacPagedDataStore() ... es gibt ja kein o:Destroy() ?

wenn das der "falsche" Weg ist (obwohl es ja zu funktionieren scheint) wie wäre der "richtige" Weg ?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von brandelh »

Ich meine es reicht aus das Array wie oben zu sortieren und ein RefreshAll aufzurufen.
Nur wenn man die Daten in ein neues Array umkopiert bricht man die alte Verbindung.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Ich meine es reicht aus das Array wie oben zu sortieren und ein RefreshAll aufzurufen.
das habe ich zuerst versucht und das ging nicht.
brandelh hat geschrieben:Nur wenn man die Daten in ein neues Array umkopiert bricht man die alte Verbindung.
die Verbindung ist das das o:Datalink dessen Codeblock ich ja generell austauschen kann.
Die Frage ist aber was macht das DacPagedDataStore() Object das ja kein o:Destroy() hat ?
wird da evtl. der Speicher "voll-gemüllt" ?

die andere Frage war ja : wie kann ich sonst die Sortierung ändern oder das Quickbrowse zu verlassen ?
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von georg »

Hallo,


ich habe mich mit einer verwandten Frage vor geraumer Zeit mal an den Alaska-Support gewandt, die Antwort kann ich morgen raussuchen.

Es scheint aber so (wie auch Jimmy bemerkt hat), dass das Array in das DacPagedDataStore-Object kopiert wird, so dass eine Änderung am Array keine Auswirkungen im DacPagedDataStore-Object zeigt. Soweit ich mich erinnere, war der Vorschlag, das DacPagedDataStore-Object neu zu erstellen, weil ein Austausch der Datenquelle (Array) nicht möglich sei.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von brandelh »

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()
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von brandelh »

georg hat geschrieben: dass das Array in das DacPagedDataStore-Object kopiert wird, so dass eine Änderung am Array keine Auswirkungen im DacPagedDataStore-Object zeigt.
wie mein Beispiel zeigt, wird nicht der INHALT sondern nur die Referenz (der Pointer) auf das Array übergeben.
Mit zwei Refresh-Aufrufen kann man Änderungen am Array selbst wieder sichtbar machen, solange man kein neues Array erzeugt.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von brandelh »

AUGE_OHR hat geschrieben: Die Frage ist aber was macht das DacPagedDataStore() Object das ja kein o:Destroy() hat ?
wird da evtl. der Speicher "voll-gemüllt" ?
Das DacPagedDataStore() verwendet eine Referenz auf das Datenarray, wenn es kein destroy() gibt, braucht man auch keines. ;-)
Ich hatte mit dem Programm nie ein Speicherproblem, ich denke Alaska räumt da intern auf.
AUGE_OHR hat geschrieben:die andere Frage war ja : wie kann ich sonst die Sortierung ändern oder das Quickbrowse zu verlassen ?
ich denke du meinst OHNE das quickbrowse zu verlassen ;-)

Im XbpSortedQuickBrowse() wird ein Klick auf die Titelzeile genutzt um die Sortierung umzuschalten (AUS, Abwärts, Aufwärts ... markiert durch einen kleinen Pfeil).
Intern läuft es ähnlich wie ich es oben mit :DelDiagZeile() mache. Dein Beispiel sollte so funktionieren:

Code: Alles auswählen

ASORT(aWarn,,, {|aX,aY| VAL(aX[3]) < VAL(aY[3]) } ) ,;
oQB:datalink:refresh()  ,;
oQB:refreshAll()   
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von AUGE_OHR »

brandelh hat geschrieben:
AUGE_OHR hat geschrieben: Die Frage ist aber was macht das DacPagedDataStore() Object das ja kein o:Destroy() hat ?
wird da evtl. der Speicher "voll-gemüllt" ?
Das DacPagedDataStore() verwendet eine Referenz auf das Datenarray, wenn es kein destroy() gibt, braucht man auch keines. ;-)
OK
brandelh hat geschrieben:
AUGE_OHR hat geschrieben:die andere Frage war ja : wie kann ich sonst die Sortierung ändern oder das Quickbrowse zu verlassen ?
ich denke du meinst OHNE das quickbrowse zu verlassen ;-)
hehe ... Typo ... JA klar meine ich "ohne"
brandelh hat geschrieben:Im XbpSortedQuickBrowse() ...

Code: Alles auswählen

ASORT(aWarn,,, {|aX,aY| VAL(aX[3]) < VAL(aY[3]) } ) ,;
oQB:datalink:refresh()  ,;
oQB:refreshAll()   
XbpSortedQuickBrowse() ... da war doch mal was ... ok muss ich mir mal ansehen.

was mich wundert ist deine doppelte :refresh Konstruktion :o
ich habe noch nie ein :datalink:refresh() gesehen :?:
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von brandelh »

der DataLink refresh() lädt die Daten nach,
der Browser refresh() zeigt diese dann neu an.

Eigentlich sollte der Browser refresh() (nach meiner Meinung) beides machen, aber der Code steht so da und vermutlich ist das auch nötig so ;-)
Klasse DacPagedDataStore()
Syntax
:refresh() --> self
:refresh()- Lädt die Daten der Datenquelle erneut in den Cache


PS: bei XbpBrowse() reicht ein normales RefreshAll() nach meiner Erinnerung auch nicht aus um die Daten von der Platte neu zu lesen.
Ich meine ich hätte da immer dbSkip(0) gemacht und danach refreshed ...
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

Re: XbpQuickBrowse sortieren / neu einlesen

Beitrag von Werner_Bayern »

Funktionsorientiert mache ich das so:

Code: Alles auswählen

static function sortierung(aPos, oMulticellGroup, aArray, oBrowse)
local aZeileSpalte := oMulticellGroup:cellFromPos(aPos), nSpalte

nSpalte := aZeileSpalte[2]
aSort(aArray,,,{|x, y| x[nSpalte] < y[nSpalte]})
oBrowse:datalink:refresh()
return NIL
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten