Sort und Spalte verschieben in Browse

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi,

gerade habe ich in einem Arraybrowse Spalten verschoben und mußte feststellen, das danach die SORT Option nicht mehr klappt. Wie bekommt man die denn nach einem MOVE der jeweiligen Spalte wieder aktiviert? Gibt es da irgendeine Funktion, oder so, die den SORT wieder aktiviert?

Die Headerfarbe ändert sich danach auch, aber das dürfte kein Problem sein dass wieder auf den Vorherzustand zu setzen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Nach dem Verschieben liefert oBrowse:ColPos für die Spalte einen anderen Wert zurück, aber im Array ist sie immer noch an derselben Stelle. :wink:
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Das heißt ich müßte mal in Erinnerungen kramen und diese Funktion aufrufen, die das Array aktualisiert? Oder war das Augenzwinkern anders gemeint?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Schau Dir mal den SORT-Codeblock an. Der bekommt als Parameter vermutlich die Nummer der Spalte. Wenn man jetzt eine Spalte verschiebt, bleibt das Array aber trotzdem dasselbe. Wenn also Spalte 2 bisher auch nach Arrayspalte 2 sortiert hat und jetzt an Position 3 wandert, sortiert sie nach Arrayspalte 3, obwohl sie immer noch Arrayspalte 2 anzeigt.

Etwas Code würde, wie immer, helfen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi Tom,

Code, ja Du hast Recht, aber ich dachte zunächst, ich hätte nur irgendeine Funktion übersehen und das wäre es. Aber hier der gewünschte Code

Code: Alles auswählen

PROCEDURE vodruck()
// Felder des Array
// Feld, Header,Browse,Folge,Breite
          LOCAL aDaten         := {;
                                   {"(oVo:nArea)->datumein"                                         ,"Erfass;Datum"        ,.T., 1,70},;
                                   {"(oVo:nArea)->ean"                                              ,"Ean-8"               ,.T., 2,70},;
                                   {"IF((oVo:nArea)->internetno,'JA','  ')"                         ,"I-Net;Sp"            ,.T., 3,10},;
                                   {"(oVo:nArea)->lagerbs"                                          ,"BS"                  ,.T., 4,30},;
                                   {"(oVo:nArea)->lagernr"                                          ,"Platz"               ,.T., 5,50},;
                                   {"(oVo:nArea)->preisinet"                                        ,"Vk;Inet"             ,.T., 6,50},;
                                   {"(oVo:nArea)->preissoll"                                        ,"Vk;Soll"             ,.T., 7,50},;
                                   {"(oVo:nArea)->preisek"                                          ,"Preis;Ek"            ,.T., 8,50},;
                                   {"IF((oVo:nArea)->reserve,'JA','  ')"                            ,"UL"                  ,.T., 9,20},;
                                   {"(oVostamm:nArea)->datumgestr"                                  ,"Streich;Datum"       ,.T.,10,70},;
                                   {"(oVostamm:nArea)->datumvoe"                                    ,"VÖ;Datum"            ,.T.,11,70},;
                                   {"(oVostamm:nArea)->fsk"                                         ,"FSK"                 ,.T.,12,10},;
                                   {"(oVostamm:nArea)->hap"                                         ,"HAP"                 ,.T.,13,50},;
                                   {"IF((oVostamm:nArea)->indiziert,'JA','  ')"                     ,"Indiz;iert"          ,.T.,14,10},;
                                   {"(oVostamm:nArea)->vkgbr"                                       ,"VK;GBR"              ,.T.,15,40},;
                                   {"(oVostamm:nArea)->vkneu"                                       ,"VK;NEU"              ,.T.,16,40},;
                                   {"TokenUpper(oVo:indexohneartikel((oVostamm:nArea)->v_darstell))","Interpret;Darsteller",.T.,17,200},;
                                   {"TokenUpper(oVo:indexohneartikel((oVostamm:nArea)->v_titel))"   ,"Titel"               ,.T.,18,200},;
                                   {"(oEan13:nArea)->ean"                                           ,"EAN-13"              ,.T.,19,85},;
                                   {"Transform(Date() - (oVo:nArea)->datumein + 1,'9999')"          ,"Lager;Tage"          ,.T.,20,40},;
                                   {"(oGenre:nArea)->bez"                                           ,"Genre"               ,.T.,21,150},;
                                   {"(oSysteme:nArea)->kuerzel"                                     ,"SYS"                 ,.T.,22,40},;
                                   {"(oSysteme:nArea)->bez"                                         ,"System"              ,.T.,23,150};
                                  }

          LOCAL aVo            := {}
          LOCAL cVersion       := "23.07.2010"
          LOCAL getlist        := {}
          LOCAL GetOptions
          LOCAL nFensterBreite
          LOCAL nFensterHoehe
          LOCAL nI
          LOCAL nMenge
          LOCAL nPbLaenge       := 70

          LOCAL oBrowse         := NIL
          LOCAL oDialog         := NIL
          LOCAL oDialogBrowse   := NIL
          LOCAL oDialogProgress := NIL
          LOCAL oGruppeBrowse   := NIL
          LOCAL oGruppeButton   := NIL
          LOCAL oPbEnde         := NIL
          LOCAL oPbLinks        := NIL
          LOCAL oPbRechts       := NIL
          LOCAL oProgress       := NIL

          MEMVAR oGenre
          MEMVAR oHauptDialog
          MEMVAR oMessage
          MEMVAR oSysteme
          MEMVAR oVo
          MEMVAR oVostamm
          MEMVAR oEan13

          nFensterBreite := oHauptDialog:clientsize[1]
          nFensterHoehe  := oHauptDialog:clientsize[2]
//------------------------------------------------------------------------------
          oEan13   := ean13():new()
          oGenre   := genre():new()
          oSysteme := systeme():new()
          oVo      := kassette():new()
          oVostamm := fstamm():new()

          oEan13:db_oeffnen(,,,,,,,,,,,,,.F.)
          oGenre:db_oeffnen(,,,,,,,,,,,,,.F.)
          oSysteme:db_oeffnen(,,,,,,,,,,,,,.F.)
          oVo:db_oeffnen(,,,,.T.,,,,,,,,,.F.)
          oVostamm:db_oeffnen(,,,,,,,,,,,,,.F.)

          (oVo:nArea)->(DbSetRelation(oVostamm:nArea     ,{|| Str((oVo:nArea)->idvostamm,8,0) }    ,"Str((oVo:nArea)->idvostamm,8,0)"    ,"id" ) )
          (oVostamm:nArea)->(DbSetRelation(oEan13:nArea  ,{|| Str((oVostamm:nArea)->id,8,0) }      ,"Str((oVostamm:nArea)->id,8,0)"      ,"idvostamm" ))
          (oVostamm:nArea)->(DbSetRelation(oGenre:nArea  ,{|| Str((oVostamm:nArea)->idgenre,8,0) } ,"Str((oVostamm:nArea)->idgenre,8,0)" ,"id" ))
          (oVostamm:nArea)->(DbSetRelation(oSysteme:nArea,{|| Str((oVostamm:nArea)->idsystem,8,0) },"Str((oVostamm:nArea)->idsystem,8,0)","id" ))
//------------------------------------------------------------------------------
          oDialogProgress := DialogFenster():new(AppDesktop(),SetAppWindow(),,{610,60},,,.F.)
          oProgress       := ProgressBar():new(oDialogProgress,,{ oDialogProgress:currentsize()[1]-10,24 },,.F.)
          oDialogProgress:title := "Datenerzeugung VO-Druck..."
          oDialogProgress:create()
          oProgress:create()
          oProgress:minimum := 1
          oProgress:maximum := (oVo:nArea)->(LastRec())
          oProgress:color   := GRA_CLR_GREEN
          (oVo:nArea)->(DbEval( { || fuelleVOArray(aVo,aDaten),oProgress:increment() }) )
          oProgress:quit()
          oDialogProgress:destroy()
          (oVo:nArea)->(DbClearRelation())
          (oVostamm:nArea)->(DbClearRelation())
          oVo:schliesse_datenbank(.T.)
//------------------------------------------------------------------------------
          @ 5,1 DCSTATIC;
                  OBJECT oDialogBrowse;
                    SIZE DCGUI_PARENTWIDTH,DCGUI_PARENTHEIGHT;
                    TYPE XBPSTATIC_TYPE_RECESSEDRECT
//------------------------------------------------------------------------------
          @ 10,5 DCGROUP oGruppeBrowse;
                 CAPTION "VO-Auswahl";
                  PARENT oDialogBrowse;
                    SIZE DCGUI_PARENTWIDTH-10,DCGUI_PARENTHEIGHT - 65
          @  0,0 DCGROUP oGruppeButton;
                    EVAL {|| oGruppeButton:setPos( {5,5} ) };
                  PARENT oDialogBrowse;
                    SIZE DCGUI_PARENTWIDTH-10,50
//------------------------------------------------------------------------------
          @ 15,5 DCBROWSE oBrowse;
                     DATA aVo;
                HEADLINES 2;
                 OPTIMIZE;
                   PARENT oGruppeBrowse;
                     SIZE DCGUI_PARENTWIDTH-10,DCGUI_PARENTHEIGHT - 20

          nMenge := Len(aDaten)
          FOR nI := 1 TO nMenge
              IF aDaten[nI][3]
                 DCBROWSECOL ELEMENT nI;
                      HEADER aDaten[nI][2];
                      PARENT oBrowse;
                        SORT {|aPos,nColPos,self| Spaltensortierung(aVo,nColPos,oBrowse) };
                       WIDTH aDaten[nI,5]
              ENDIF
          NEXT
//------------------------------------------------------------------------------
          @ 0,0 DCPUSHBUTTON;
                      ACTION {|| MoveColumn(1,oBrowse),DC_GETREFRESH(GetList) };
                     CAPTION "<- Links";
                        EVAL {|| oPbLinks:setPos( {5,5} ) };
                      OBJECT oPbLinks;
                      PARENT oGruppeButton;
                        SIZE nPbLaenge,DCGUI_PARENTHEIGHT - 20;
                        WHEN {|| oBrowse:colpos > 1}
          @ 0,0 DCPUSHBUTTON;
                      ACTION {|| MoveColumn(2,oBrowse),DC_GETREFRESH(GetList) };
                     CAPTION "Rechts ->";
                        EVAL {|| oPbRechts:setPos( {oPbLinks:currentpos()[1] + oPbLinks:currentsize()[1],5} ) };
                      OBJECT oPbRechts;
                      PARENT oGruppeButton;
                        SIZE nPbLaenge,DCGUI_PARENTHEIGHT - 20;
                        WHEN {|| oBrowse:colpos < oBrowse:ColCount }
          @ 0,0 DCPUSHBUTTON;
                      ACTION {|| DC_ReadGuiEvent(DCGUI_EXIT_ABORT,GetList) };
                     CAPTION 7755;
                        EVAL {|| oPbEnde:setPos( {oPbRechts:currentpos()[1] + oPbRechts:currentsize()[1],5} ) };
                      OBJECT oPbEnde;
                      PARENT oGruppeButton;
                        SIZE nPbLaenge,DCGUI_PARENTHEIGHT - 20
//------------------------------------------------------------------------------
          DCGETOPTIONS;
                BORDER XBPDLG_SIZEBORDER;
           NOMAXBUTTON;
           NOMINBUTTON;
                 PIXEL;
           WINDOWWIDTH nFensterBreite;
          WINDOWHEIGHT nFensterHoehe

          DCREAD GUI;
           APPWINDOW oHauptDialog:drawingArea;
             OPTIONS GetOptions;
              PARENT @oDialog;
               TITLE "VO-Druck " + cVersion

          RETURN
********************************************************************************
FUNCTION fuelleVOArray(aVo,aDaten)
         LOCAL aErgebnis := AClone(aDaten)
         LOCAL cFeld     := Aeval( aErgebnis, {|a| a := &(a[1]) },,, .T. )

         AAdd(aVo, cFeld)
         RETURN(.T.)
********************************************************************************
FUNCTION spaltenSortierung(aVo,nCol)

         aVo := ASort(aVo,,,{|x,y|x[nCol] < y[nCol] } )
         RETURN(.T.)
********************************************************************************
FUNCTION MoveColumn(nMode,oBrowse)
         LOCAL nPos    := oBrowse:colPos
         LOCAL oColumn := oBrowse:getColumn(nPos)
         LOCAL aSize   := oColumn:currentSize()

         oBrowse:delColumn(nPos)
         IF nMode = 1
            oBrowse:insColumn(nPos-1,oColumn)
            oBrowse:left()
         ELSE
            oBrowse:insColumn(nPos+1,oColumn)
            oBrowse:right()
         ENDIF
         oColumn:setSize(aSize)
         oBrowse:forceStable()
         RETURN(.T.)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Hier:

Code: Alles auswählen

SORT {|aPos,nColPos,self| Spaltensortierung(aVo,nColPos,oBrowse) }
rufst Du Deine Funktion "Spaltensortierung" auf, die das Array nach "nColPos" sortiert, und nColPos ist die Position der Spalte im Browse. Diese entspricht beim Aufbau des Browses auch der Position im Array, aber nach dem Verschieben nicht mehr.

Du könntest der Spalte im Cargo-Slot die Nummer der Arrayspalte zuordnen und das dann im SORT-Codeblock benutzen:

Code: Alles auswählen

DCBROWSECOL ... CARGO nI SORT {|aPos,nColPos,self| Spaltensortierung(aVo,self:Cargo[3],oBrowse) }
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hm,

ich habe es so gemacht

Code: Alles auswählen

FOR nI := 1 TO nMenge
              IF aDaten[nI][3]
                 DCBROWSECOL ELEMENT nI;
                       CARGO nI;
                      HEADER aDaten[nI][2];
                      PARENT oBrowse;
                        SORT {|aPos,nColPos,self| Spaltensortierung(aVo,self:cargo[3],oBrowse) };
                       WIDTH aDaten[nI,5]
              ENDIF
          NEXT
self:cargo[3] übergibt aber NIL an die Empfänger Funktion. Das wirft jetzt doch ein paar Fragen auf.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Versuch's mal so anstelle von self:cargo[3]:

Code: Alles auswählen

oBrowse:GetColumn(oBrowse:ColPos):Cargo[3]
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Nee,

das kann so nicht klappen, weil ja dann immer die Spalte übergeben wird, in der der Cursor gerade steht und nicht die Spalte, in der der Header gerade gedrückt wurde. Aber das kommt mir irgendwie bekannt vor von einer anderen Sache. Ich meine, da muß man anders vorgehen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Sort und Spalte verschieben in Browse

Beitrag von AUGE_OHR »

Manfred hat geschrieben:gerade habe ich in einem Arraybrowse Spalten verschoben und mußte feststellen, das danach die SORT Option nicht mehr klappt.
du willst es scheinbar in der Sort Function "korrigieren" ... ich würde das schon in der Function MoveColumn() machen.
wie Tom schon sagte
SORT-Option
ansehen ob es da einen "Index" für das Array gibt und es in MoveColumn() "korrigeren"
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi,

es ging/geht mir auch in erster Linie nur erstmal darum, ob Roger evtl. etwas dafür vorgesehen hat, was ich übersehen habe, deshalb habe ich gefragt.

Jetzt muß ich dann mal schauen, ob ich irgendwas in der Move Funktion finde (im Debugger) was mir weiterhelfen könnte. Das ist aber auch blöde, ich habe überhaupt nicht richtig verstanden was da überhaupt intern alles passiert, wenn ein Array gebrowst wird. Wie das Original gespeichert/verwaltet wird, was dann mit der Änderung wie läuft, oder laufen muß.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Im :LbClick- oder :RbClick-Block von oColumn:Heading kannst Du den Wert setzen, der dann an die Sortierung übergeben wird.

Code: Alles auswählen

nSortColumn := 1 

...

bColumnClick := {||nSortColumn := o:Cargo[3]}

DCBROWSECOLUMN ELEMENT 1 ... EVAL {|o|o:Heading:LbClick := bColumnClick,o:Heading:RbClick := bColumnClick} ... CARGO nI
und in der Sortierungsfunktion wird dann auf "nSortColumn" zugegriffen - und nicht mehr auf ":ColPos" oder derlei.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi Tom,

da ich jetzt überhaupt nicht verstehe, was Du da gemacht hast, knallt es natürlich bei der Umsetzung.

"o" ist nicht bekannt (wo muß denn überhaupt der Codeblock rein, wenn er gesetzt wird um "o" zu kennen? Oder müßten da noch Klammern und ein Makrooperator rein?)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Hallo, Manfred.

Ich habe leider keine Zeit, mich ausgiebig damit zu beschäftigen. Hier ist ein kleines Beispiel, das noch nicht ganz funktioniert, Dir aber zeigen dürfte, worauf ich hinauswill. Einfach kompilieren und mit /PM:PM linken.

Code: Alles auswählen

#include "dcdialog.ch"
#pragma library("dclipx.lib")

PROCEDURE appsys() ; RETURN

procedure main()
local GetList := {}, oBrowse, aDir := Directory()

nSortColumn := 1

bSort := {||aDir := MySort(aDir,nSortColumn)}
bColumnClick := {|a,b,o|nSortColumn := o:SetParent():Cargo[3],DC_DebugQout(nSortColumn)}
bEval := {|o|o:Heading:LbClick := bColumnClick,o:Heading:RbClick := DC_MergeBlocks(bColumnClick,o:Heading:RbClick)}

@ 1,1 DCBROWSE oBrowse DATA aDir SIZE 100,20 RBSELECT
DCBROWSECOL ELEMENT 1 HEADER 'Name' WIDTH 10 PARENT oBrowse CARGO 1 EVAL bEval SORT bSort
DCBROWSECOL ELEMENT 2 HEADER 'Größe' WIDTH 10 PARENT oBrowse CARGO 2 EVAL bEval SORT bSort
DCBROWSECOL ELEMENT 3 HEADER 'Datum' WIDTH 10 PARENT oBrowse CARGO 3 EVAL bEval SORT bSort
DCBROWSECOL ELEMENT 4 HEADER 'Zeit' WIDTH 10 PARENT oBrowse CARGO 4 EVAL bEval SORT bSort
DCBROWSECOL ELEMENT 5 HEADER 'Attribs' WIDTH 10 PARENT oBrowse CARGO 5 EVAL bEval SORT bSort
DCBROWSECOL ELEMENT 6 HEADER 'Erw.Attr.' WIDTH 10 PARENT oBrowse CARGO 6 EVAL bEval SORT bSort

@ 21,1  DCPUSHBUTTON CAPTION 'Links'  SIZE 10,1 ACTION {||MoveColumn(1,oBrowse),DC_GetRefresh(GetList)} ;
        WHEN {||oBrowse:ColPos > 1}
@ 21,15 DCPUSHBUTTON CAPTION 'Rechts'  SIZE 10,1 ACTION {||MoveColumn(2,oBrowse),DC_GetRefresh(GetList)} ;
        WHEN {||oBrowse:ColPos < 6}

DCREAD GUI FIT ADDBUTTONS

return

STATIC FUNCTION MySort(aDir,nCol)
ASort( aDir,,,{|aY1,aY2| aY1[nCol] < aY2[nCol]})
RETURN aDir

STATIC FUNCTION MoveColumn( nMode, oBrowse )
* aus Rogers Beispielen
LOCAL oColumn, nPos, aFrozen, aSize, oHeading

aFrozen := oBrowse:setLeftFrozen({})
nPos := oBrowse:colPos
oColumn := oBrowse:getColumn(nPos)
aSize := oColumn:currentSize()
oBrowse:delColumn(nPos)
IF nMode = 1
  oBrowse:insColumn(nPos-1,oColumn)
  oBrowse:left()
ELSE
  oBrowse:insColumn(nPos+1,oColumn)
  oBrowse:right()
ENDIF
oColumn:setSize(aSize)
oBrowse:forceStable()
oBrowse:setLeftFrozen(aFrozen)
RETURN nil
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi Tom,

es klappt nicht. Es gibt zwar keine Fehlermeldungen, aber die Sortiererei und das Verschieben der Spalten verursacht ein totales Chaos. Nach dem Verschieben klappt keine Spalte mehr wirklich richtig. Ich lass es und löse das Problem erstmal anders. Solange, bis ich evtl. durchblicke, was da so alles passiert intern. :roll:

Danke trotzdem für Deine Hilfe.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

was passiert denn überhaupt intern, wenn ein Array gebrowst wird? Wo wird der Codeblock für den Sort im Browse untergebracht?

Es muß doch irgendwie möglich sein, irgendwo das Array im Browse zu finden.

Die Spalten zu verschieben/löschen/einfügen scheint ja kein Problem zu sein, aber was passiert denn dann intern und warum kommt der Browser durcheinander, wenn diese Kombination wie oben zusammentreffen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Hallo, Manfred.

Den Codeblock für das Sort bringt Roger in der entsprechenden iVar seiner DC_XbpColumn-Klasse unter. (Bau einfach mal einen Button ein, der DC_InspectObject(oBrowse:GetColumn(1)) oder so macht).

Zugriff auf den Arraypointer hast Du über die iVar oBrowse:DataSource. "oBrowse:DataSource[1,1]" sollte immer dasselbe wie "aArray[1,1]" zurückliefern (DC_ArrayView(oBrowse:DataSource) zeigt das Array an). DC_GetBrowArray(o,a) (a = Array, o = Browse-Objekt) setzt den Pointer auf das Array neu, was nötig ist, wenn das Array neu entstanden ist (aber nicht, wenn das ursprüngliche Array direkt verändert wurde - allerdings schadet es auch nicht).
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi Tom,

das mit dem :dataSource hatte ich schon gefunden. Ich habe versucht das ganze Vorgehen zu Debuggen. Was ich aber nicht so ganz verstanden habe ist, ob DataSource jetzt von Roger ist, oder ob es überlagert wird. Allerdings kann ich in der Xbase Anleitung nichts dazu finden, sodass sich mein Eindruck verstärkt, das es von Roger ist? Aber wie wird es dann im puren Xbase++ geregelt?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Martin Altmann »

Moin Manfred,
Manfred hat geschrieben:Aber wie wird es dann im puren Xbase++ geregelt?
um so etwas zu sehen, ist es grundsätzlich sinnvoll, sich die .ppo-Dateien anzuschauen - also einfach mal entsprechend kompilieren :wink:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Die .PPO wird kaum helfen, da stehen nur lauter aAdd(GetList,......) drin. In der DCDIALOG.CH kann man sich das auch ohne .PPO anschauen.

Die Klasse DC_XbpBrowse ist der _DCXBROW.PRG im eXpress-Quellcode-Verzeichnis (..\Source\Dclipx) zu finden. Ja, :DataSource ist eine von Roger eingeführte iVar. Und, ja, das ist alles "plain Xbase++". :wink:
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi Tom,

wieder falsch verstanden, oder von mir falsch rüber gebracht. Das das plain xbase ist, das ist mir schon klar. Ich meinte nur, ob es eine reine Erweiterung von Roger ist, oder ob das auch unter XbpBrowse zur Verfügung steht, bzw. denke ich die ganze Zeit darüber nach, wie man sowas nun intern regeln und aktualisieren kann, damit mein Wunsch (siehe oben) durchgeführt werden kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

oBrowse:DataSource ist ein Pointer auf Dein Array - und Dein Array ist immer noch dasjenige, das gebrowst wird. Wenn Du das Array aber strukturell änderst oder z.B. in einer Funktion neu erzeugst, kann es Abweichungen geben (nicht allerdings durch bloßes Sortieren). Dafür gibt es dann DC_GetBrowArray - wenn Du also z.B. irgendwo einen Button hast, der sowas macht:

Code: Alles auswählen

aMyArray := NeuesArray(aMyArray)

FUNCTION NeuesArray(a)
aSize(a,0)
a := Directory()
RETURN a
aMyArray wird dann zum Pointer auf "a". Hier muss DC_GetBrowArray(o,a) ausgeführt werden, damit der Pointer aktualisiert wird. Die Funktion macht schlicht das hier:

Code: Alles auswählen

oBrowse:DataSource := a
Der Pointer wird zusätzlich in :Cargo[5] gespeichert.

Ein "reines" Xbase-Arraybrowse arbeitet mit den Datalink-Codeblöcken der Spalten und mit entsprechenden Navigationscodeblöcken. Es enthält - jedenfalls standardmäßig - ansonsten keine iVar, die einen Pointer auf die Datenquelle verfügt.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Sort und Spalte verschieben in Browse

Beitrag von Tom »

Hallo, Manfred.

Ich habe gerade zwei Dinge herausgefunden. Erstens: DC_XbpBrowse verfügt über eine Methode "MoveColumn", die viel mehr erledigt als die im Beispiel. Mit dieser Funktion bleiben auch die Header usw. erhalten. Und zweitens: Es gibt eine iVar "SortColumn" in DC_XbpBrowse. Diese muss man überschreiben, damit das ganze funktioniert. In diesem Beispiel klappt es jetzt:

Code: Alles auswählen

#include "dcdialog.ch"
#pragma library("dclipx.lib")

PROCEDURE appsys() ; RETURN

procedure main()
local GetList := {}, oBrowse, aDir := Directory()

nSortColumn := 1

bSort := {|a,n|MySort(aDir,nSortColumn)}
bColumnClick := {|a,b,o|nSortColumn := o:Parent:Cargo[3],oBrowse:SortColumn := nSortColumn}
bEval := {|o|o:Heading:LbClick := bColumnClick,o:Heading:RbClick := bColumnClick}

@ 1,1 DCBROWSE oBrowse DATA aDir SIZE 100,20 RBSELECT NODESCENDTOGGLE
DCBROWSECOL DATA {||DC_GetColArray(1,oBrowse)} HEADER 'Name' WIDTH 10 PARENT oBrowse CARGO 1 SORT bSort EVAL bEval
DCBROWSECOL DATA {||DC_GetColArray(2,oBrowse)} HEADER 'Größe' WIDTH 10 PARENT oBrowse CARGO 2 SORT bSort EVAL bEval
DCBROWSECOL DATA {||DC_GetColArray(3,oBrowse)} HEADER 'Datum' WIDTH 10 PARENT oBrowse CARGO 3 SORT bSort EVAL bEval
DCBROWSECOL DATA {||DC_GetColArray(4,oBrowse)} HEADER 'Zeit' WIDTH 10 PARENT oBrowse CARGO 4 SORT bSort  EVAL bEval
DCBROWSECOL DATA {||DC_GetColArray(5,oBrowse)} HEADER 'Attribs' WIDTH 10 PARENT oBrowse CARGO 5 SORT bSort EVAL bEval
DCBROWSECOL DATA {||DC_GetColArray(6,oBrowse)} HEADER 'Erw.Attr.' WIDTH 10 PARENT oBrowse CARGO 6 SORT bSort EVAL bEval

@ 21.5,1  DCPUSHBUTTON CAPTION 'Links'  SIZE 10,1 ACTION {||oBrowse:MoveColumn(-1),DC_GetRefresh(GetList)} ;
        WHEN {||oBrowse:ColPos > 1}
@ 21.5,15 DCPUSHBUTTON CAPTION 'Rechts'  SIZE 10,1 ACTION {||oBrowse:MoveColumn(1),DC_GetRefresh(GetList)} ;
        WHEN {||oBrowse:ColPos < 6}

DCREAD GUI FIT ADDBUTTONS

return

STATIC FUNCTION MySort(aDir,nCol)
ASort( aDir,,,{|aY1,aY2| aY1[nCol] < aY2[nCol]})
RETURN aDir
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

Hi Tom,

ich traue mich schon gar nicht das Ergebnis kund zu tun. Aber Dein Vorschlag hat das Problem, dass immer beim Sort die letztgewählte Spalte genommen wird und nicht die, die gerade angeklickt wurde. Also wenn vorher die 3. war und dann die 12. dann wird die 3. genommen. Danach nimmt man z.B. die 4, dann wird aber die 12. genommen usw.

Also habe ich die Übergabe der Spalte beim Verschieben mal wieder so gesetzt wie zu Anfang, aber da kommt als Resultat, dass wenn die 1. Spalte verschoben wird zwar der Rest richtig sortiert wird, aber nichts mehr, was links neben der Spalte ist, die mal verschoben wurde.

Ich hoffe ich habe das jetzt einigermaßen verständlich erklärt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Sort und Spalte verschieben in Browse

Beitrag von Manfred »

So,

nur zur Info. Ich habe das Problem jetzt erstmal anders gelöst. Da die Spalten sowieso gespeichert werden sollen um sie später als Vorlagen wieder einladen zu können, öffne ich vorher eine Pickliste, in der man entweder alles neu zusammenklickt, wie man es haben will, oder aber vorhandene Listen ändert. So wie es aussieht, genügt das, bzw. ist es eine gute Lösung.

Irgendwann später werde ich mich nochmals mit dem ursprünglichen Thema befassen. Vielleicht gibt es ja doch eine "einfache" Lösung dafür.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten