Seite 1 von 1

DCBROWSE Sort [erledigt]

Verfasst: Mo, 24. Jun 2019 14:13
von Ewald
Moin zusammen,
mir fällt da auf, das sich das gleiche Programm (Quellcode) für ein DCBROWSE unter 1.9 anders verhält als unter 2.0.
Wenn ich eine Spalte per Klick rauf oder runter sortiere steht unter 1.9 der Cursor anschließend immer in Zeile 1. Egal ob rauf oder runter sortiert wurde.
Unter 2.0 wird richtig sortiert, der Cursor steht aber anschließend bei der descending Sortierung in der letzten Zeile. Dagegen hilft mir auch kein
obrowse:gotop() in der sort() Funktion. Übersehe ich da einen neuen Parameter in EXPRESS++ ? Ich möchte erreichen, das der Cursor im Browserfenster nach jeder Sortierung - egal in welche Richtung - immer in der ersten Zeile steht.

Code: Alles auswählen

A <- Cursor
B
C
Sort der Spalte unter 1.9

Code: Alles auswählen

C <- Cursor
B
A
Sort der Spalte unter 2.0

Code: Alles auswählen

C 
B
A <- Cursor 

Re: DCBROWSE Sort

Verfasst: Mo, 24. Jun 2019 14:19
von Manfred
Hallo Ewald,
hilft Dir vielleicht ein oBrowse:arrayElement := 1 weiter?

Re: DCBROWSE Sort

Verfasst: Mo, 24. Jun 2019 14:20
von Tom
Oder oBrowse:navigationMode auf XBPBRW_NAVIGATION_1XCOMPATIBLE?

Re: DCBROWSE Sort

Verfasst: Mo, 24. Jun 2019 15:25
von Ewald
Alle Vorschläge sind eingearbeitet. Das gewünschte Ergebnis stellt sich aber nicht ein.
Irgendwie macht das für mich auch keine Sinn ans Ende der Tabelle zu springen :?

Code: Alles auswählen

#include "dcdialog.ch"

proc main
local getlist:={}
aa:={{"A",1},{"B",2},{"C",3},{"E",4},{"F",5},{"G",6}}

bsortcol := {|a,n,o| fsort(aa,n,getlist) }

@ 01,01 dcbrowse ob1 data aa size 5,7 fit ;
        ;// navMode XBPBRW_NAVIGATION_1XCOMPATIBLE
        navmode XBPBRW_NAVIGATION_SYSTEM
dcbrowsecol element 1 parent ob1 header "Sp1" width 3 ;
            sort bsortcol LEFTBUTTON
dcbrowsecol element 2 parent ob1 header "Sp2" width 3 ;
            sort bsortcol LEFTBUTTON

@ 9,1 dcpushbutton caption "Ende " size 10,1 ;
       action {||dc_readguievent(DCGUI_EXIT_OK,Getlist)}

dcread gui fit ;
title "Test"

return

*------------------------------------------------------
func fsort (aarray,ncolumn,xlist)

asort ( aarray,,, {|x,y|x[ncolumn] < y[ncolumn] } )

ob1:arrayelement:=1
ob1:firstcol()
ob1:gotop()
ob1:refreshall()

*dc_getrefresh(xlist)

return .t.

*-----------------------------
proc appsys
return

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 16:25
von Ewald
Aha, jetzt kenne ich die Ursache. Die Funktion fsort() wird nur beim ersten Klick auf den Spaltenkopf aufgerufen. Dann wirkt auch ob1:gotop().
Beim zweiten und allen weiteren Klicks auf diesen Spaltenkopf wird die Funktion nicht mehr angesprungen. Da kann ich dann soviel gotop(), refresh() etc. reinschreiben wie ich will. Hilft mir aber erst mal wenig dieses Testergebnis.

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 16:33
von Manfred

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 16:45
von Ewald
Moin Manfred,
da steht es ja das Problem - zumindest in den ersten Beiträgen. Dann weicht es etwas auf ;-)
Mein Problem ist tatsächlich, das die Funktion ab dem 2. mal nicht mehr angesprungen wird und ich nirgendwo die Chance habe, den Cursor automatisch in die erste Zeile des Browsers zu verschieben.

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 16:50
von Manfred
Hallo Ewald,
ich verstehe das Problem trotzdem nicht. Ich benutze Version 2.0 1095 von xbase++ und express++ 20266. Wenn ich auf den Header klicke, wird einmal rauf und einmal runter sortiert Aber jedesmal steht der Cursor bei mir auf dem ersten Satz im Browse. Was meinst Du genau?

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 17:11
von Ewald
Bei mir steht der Cursor eben nicht immer in der ersten Zeile des Browserfensters sondern nach dem 2. Klick am Ende der Tabelle bzw. auf der vorher markierten Position. Nach der Sortierung bleibt der Cursor an dieser Position stehen.
Vllt. kannst du ja das Beispiel von mir oben (ist kpl.) linken. Ich habe hier 2.00 1087 vom 29.3.2019 und 2.0 266. Warum meine frisch installierte 2.0 Version (alle Updates gemacht) kleiner ist als deine muss ich mal klären.

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 17:17
von Manfred
hm, ich mache das so.

Code: Alles auswählen

DCBROWSECOL OBJECTVAR name;
                         HEADER "Name";
                         PARENT oDialogZusatz:oBrowse;
                           SORT {|aMousePos, nColPos, self| oDialogZusatz:MausImKopf(nColPos,"name","fahrer")}
 ********************************************************************************************************************************** 
 METHOD DialogDispo:MausImKopf(nColPos,cSpalte,cWoher)
       DEFAULT cWoher TO ""

       IF Upper(cWoher) == "FAHRER"
          IF At(::cBrowseSort,(STR(nColPos))) = 0
             ::cBrowseSort := "Spalte" + Alltrim(Str(nColPos)) + "rauf"
          ENDIF
          IF Upper(cSpalte) == "NAME"
             IF ::cBrowseSort == "Spalte" + Alltrim(Str(nColPos)) + "rauf"
                ASort(::aBrowse,,,{|x,y| x:name < y:name})
                ::cBrowseSort := "Spalte" + Alltrim(Str(nColPos)) + "runter"
             ELSE
                ASort(::aBrowse,,,{|x,y| x:name > y:name})
                ::cBrowseSort := "Spalte" + Alltrim(Str(nColPos)) + "rauf"
             ENDIF
          ELSEIF Upper(cSpalte) == "NUMMER"
             IF ::cBrowseSort == "Spalte" + Alltrim(Str(nColPos)) + "rauf"
                ASort(::aBrowse,,,{|x,y| x:nummer < y:nummer})
                ::cBrowseSort := "Spalte" + Alltrim(Str(nColPos)) + "runter"
             ELSE
                ASort(::aBrowse,,,{|x,y| x:nummer > y:nummer})
                ::cBrowseSort := "Spalte" + Alltrim(Str(nColPos)) + "rauf"
             ENDIF
          ENDIF
          ::cBrowseSortDoName := cSpalte
          ::oBrowse:gotop()
          ::oBrowse:refreshAll()
       ENDIF
RETURN self                         
                           

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 17:50
von Ewald
Hallo Manfred - da habe ich etwas Quatsch erzählt.
Der Cursor steht auch bei mir nach der neuen Sortierung (abwärts) in der ersten Zeile. Aber in dem Fall ist die erste Zeile das Ende der Tabelle. Um zum Anfang der Tabelle zu kommen (eigentlich obrowse:gotop()) muss der User den Scrollbalken hochschieben.

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 20:04
von Manfred
Hallo Ewald,
ich weiß, wir sind nicht mehr die Jüngsten :lol: steht der Cursor jetzt ganz oben oder ganz unten? Weil 1.Stelle ist für mich immer ganz oben, direkt unter dem Header. Egal wie sortiert. Und das tut er bei mir auf jeden Fall.

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 20:44
von Ewald
Fast muss ich nachkucken :oops: Der Cursor steht ganz oben. Aaaaber - er soll auch auf das erste Arrayelement zeigen. Er seht aber in der ersten Zeile und markiert bei der descend Sortierung das letzte Array element. OK hätte ich unter 1.9 noch gesagt obrowse:gotop(). Und das genau ist das Problem. Das würde in der sort Funktion aufgerufen - die aber nur bei der ersten Sortierung angesprungen wird.

Re: DCBROWSE Sort

Verfasst: Di, 25. Jun 2019 22:45
von Ewald
Vielleicht sagt ein Bild ja mehr als 1000 Worte.
Aus nachvollziehbaren Gründen möchten die User nicht den Scrollbalken hochschieben.

vom 2. zum 3. Bild fehlt mir das obrowse:gotop() aus der sort() Funktion.

Bild

Re: DCBROWSE Sort [erledigt]

Verfasst: Di, 02. Jul 2019 23:45
von Ewald
Die Ursache für dieses Verhalten habe ich rausgeprockelt. Im _dcxbrow.prg der 266 waren die Zeilen die das eigentlich steuern auskommentiert :confused2:

Re: DCBROWSE Sort [erledigt]

Verfasst: Mi, 03. Jul 2019 7:19
von Manfred
und, welche waren es und wo sind sie zu finden?

Re: DCBROWSE Sort [erledigt]

Verfasst: Mi, 03. Jul 2019 8:47
von Ewald
Moin Manfred,
Zeile 3348 + 3360. Aber Vorsicht … habe ich durch try & error rausgeprockelt. Keine Ahnung warum das gemacht wurde und ob die Reaktivierung nicht irgendwo an anderer Stelle Probleme macht. Ich habe dadurch bisher eine Sorge weniger ...

Re: DCBROWSE Sort [erledigt]

Verfasst: Mi, 03. Jul 2019 9:04
von Hans Zethofer
Frag mal Roger warum er das so gemacht hat!