Probleme bei Autoseek von arrays

Moderator: Moderatoren

Antworten
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Probleme bei Autoseek von arrays

Beitrag von gf210957 »

Hallo an Alle,

Ich versuche einen Browser zu erstellen, der es ermöglicht, eine DBF ohne Index zu sortieren, und in dem je nach ausgewählter Spalte gesucht werden kann.

Das Ganze funktioniert eigentlich ganz prima, doch leider sucht das Programm immer in der 1. Spalte.

Kann mir jemand weiterhelfen?

Gruß

Günter Früholz

Code: Alles auswählen

#include "dcdialog.ch"
#include "appevent.ch"
#INCLUDE "GRA.CH"
#INCLUDE "xbp.CH"

function Appsys()
return NIL


procedure main(cDatei)
Local aFelder := {}
Local nFelder, oScreen
local cSuche := space(20)
local oBrowse

local n := 1

Local bSort := {|a,n|_SortSpalte(aFelder,n)}


use (cDatei) new ALIAS DATEI

nFelder := DATEI->(FCount())

oScreen := DC_WaitOn("Lese Datei " + cDatei)

DATEI->(DbEval({||_Add2Array(aFelder, nFelder)}))

DC_Impl(oScreen)

@ 1,1 DCGET cSuche ;
      GETEVAL {|oXbp|oXbp:keyboard := {|a,b,o|_XSample_44(a,b,o,oBrowse,n)} }



@ 2.5,1 DCBROWSE oBrowse DATA aFelder SIZE 60,20;
        CURSORMODE XBPBRW_CURSOR_ROW;              //Cursor zeigt komplette Zeile an
        EVAL {|o|o:ItemSelected := {||aData := oBrowse:getData(),dc_qout(aData[1])}}



FOR i := 1 TO nFelder
  DCBROWSECOL ELEMENT i HEADER FieldName(i) PARENT oBrowse;
  SORT bSort
NEXT

DCREAD GUI FIT TITLE "Dbf2Array " + cDatei ADDBUTTONS




DATEI->(DbCloseArea())

return


Static Function _Add2Array(aArray, nFelder)
Local i, aRecord := {}
FOR i := 1 TO nFelder
    aAdd(aRecord, FieldGet(i))
NEXT
aAdd(aArray, aRecord)
return (NIL)

Static Function _SortSpalte(aFelder, nSpalte)
ASort( aFelder,,,{|x,y|x[nSpalte] < y[nSpalte]} )
dc_qout("spalte")
dc_qout(nSpalte)
return (nSpalte)


STATIC FUNCTION _XSample_44( a, b, o, oBrowse,n )

LOCAL aArray := oBrowse:cargo[5], nElement

nElement := AScan(aArray,{|x|Upper(x[n])=Upper(Alltrim(o:editBuffer()))})

dc_qout(n)
dc_qout(nElement)
*dc_wait()
IF nElement > 0
  IF IsMemberVar(oBrowse,'arrayElement') // eXPress++ 1.7 or later
    oBrowse:arrayElement := nElement
  ENDIF
  oBrowse:cargo[4] := nElement
  oBrowse:refreshAll()
ENDIF

RETURN nil
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Günter.

Mit XBPBRW_CURSOR_ROW steht der Cursor quasi immer in der ersten Spalte. Du mußt mit einer Zellenmarkierung arbeiten.
Herzlich,
Tom
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Beitrag von gf210957 »

Hallo Tom,

die Cursor-Einstellung habe ich bewusst gewählt, da ich damit Programmabhängig ein Feld mit Itemmarked auswählen kann.

Wenn man die Variable nSpalte an die Funktion _XSample_44 übergeben kann, und n dadurch ersetzt, funktioniert das Ganze.

Leider habe ich das nicht geschafft.

Gruß

Günter Früholz
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

Beitrag von AUGE_OHR »

hi,
gf210957 hat geschrieben: die Cursor-Einstellung habe ich bewusst gewählt, da ich damit Programmabhängig ein Feld mit Itemmarked auswählen kann.

Wenn man die Variable nSpalte an die Funktion _XSample_44 übergeben kann, und n dadurch ersetzt, funktioniert das Ganze.

Leider habe ich das nicht geschafft.
weil es nicht "so" geht. Bei XBPBRW_CURSOR_ROW steht oBrowse:colPos
immer auf "== 1" sodas man es nicht schafft "ihm" was "anderes" zu-
zuweisen.

Du MUSST in diesem Fall XBPBRW_CURSOR_CELL benutzen und wenn
du einen "ROW Balken" haben willst musst du dir schon eine eigene
Class schreiben der dir die aktuelle "ROW" mit ":ColorBlock" neu
":paint"ed.

... irgendwo hab ich da doch was gehabt ... suche ...

gruss by OHR
Jimmy
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Beitrag von gf210957 »

Hallo Jimmy,

ich erhalte doch im Sortblock in der Funktion bSort den Wert nSpalte. Der zeigt immer die richtige Spaltennummer an. Dieser Wert müsste doch an die Funktion sample... übergeben werden können und in ascan eingefügt werden können.
Bei der Cursor Einstellung geht es nicht um Farben usw. Hier geht es darum, zum Beispiel wenn der User nach Nachname sortiert, die Kunden-Nr. als Rückgabe zu erhallten.

Gruß

Günter Früholz
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

Beitrag von AUGE_OHR »

hi
gf210957 hat geschrieben: ich erhalte doch im Sortblock in der Funktion bSort den Wert nSpalte. Der zeigt immer die richtige Spaltennummer an. Dieser Wert müsste doch an die Funktion sample... übergeben werden können und in ascan eingefügt werden können.
sicherlich kannst du "nSpalte" übergeben, aber du will doch auch in "der"
Spalte hinterher die "sortierung" angezeigt bekommen ?

dazu müsstest du oBrowse:ColPos := nSpalte setzten, nur wenn du dir
das Ergebniss ansiehst, ist bei XBPBRW_CURSOR_ROW immer nur die
"1St. Spalte" richtig.

Ich hab den Source noch nicht gefunden, aber ich glaube zu wissen das
ich damals mit "Trick" ihn dazu gebracht habe in dem ich den Cursor,
nach dem ":headerRbDown", NICHT die nColPos genommen habe sondern
meinen "eigenen" Zähler. Um das oBrowse:Colpos := myZaehler setzten
zu können schalte ich "vorher" auf XBPBRW_CURSOR_COl "um" und
"nach" oBrowse:refresh() wieder zurück auf XBPBRW_CURSOR_ROW.

gruss by OHR
Jimmy
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

Autoseek

Beitrag von Juergen »

Hallo Günter

Folgenden Code habe ich getestet.
Habe das Beispiel von Roger etwas geändert und erweitert.

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "SetCurs.ch"
#include "Xbp.ch"
#include "dcmsg.ch"
#include "dcdialog.ch"

Proc appsys()
Return

Proc Main()
LOCAL GetList := {}, cSeek := Space(20), oBrowse, aDirectory, i, nCol:=1
LOCAL nPointer:=1, lOK:=.f.

DC_LangSet(DCLANG_GERMAN)
set date german

@ 1,1 DCSAY 'Suche:' GET cSeek SAYRIGHT PICT '@!' ;
KEYBLOCK {|a,b,o|DC_BrowseAutoSeek(a,o,oBrowse,aDirectory,nCol,,,{||cSeek})}

aDirectory := Directory()
FOR i := 1 TO Len(aDirectory)
aDirectory[i,1] := Upper(aDirectory[i,1])
aDirectory[i,2] := str(aDirectory[i,2],9)
aDirectory[i,3] := dtos(aDirectory[i,3])
NEXT

_Sort(aDirectory,1,.f.)

@ 3,1 DCBROWSE oBrowse DATA aDirectory ;
CURSORMODE XBPBRW_CURSOR_ROW;
ITEMMARKED {| aRowCol, x, o |nPointer:=dc_browserow(oBrowse)};
DATALINK {||DC_ReadGuiEvent(DCGUI_EXIT_OK,getlist)};
SIZE 55,12 FONT '10.Helv Bold' ;
FIT ;
PRESENTATION DC_BrowPres();
SORTSCOLOR GRA_CLR_WHITE, GRA_CLR_RED;
SORTUCOLOR GRA_CLR_WHITE, GRA_CLR_DARKGRAY;
NODESCENDTOGGLE

DCBROWSECOL ELEMENT 1 WIDTH 10 HEADER "Name" PARENT oBrowse ;
SORT {|a,n,o|nCol:=1,_Sort(aDirectory,nCol,.f.)} LEFTBUTTON DEFAULT

DCBROWSECOL ELEMENT 2 WIDTH 7 HEADER "Größe" PARENT oBrowse ;
SORT {|a,n,o|nCol:=2,_Sort(aDirectory,nCol,.t.)} LEFTBUTTON

DCBROWSECOL ELEMENT 3 WIDTH 8 HEADER "Datum" PARENT oBrowse ;
SORT {|a,n,o|nCol:=3,_Sort(aDirectory,nCol,.t.)} LEFTBUTTON

DCBROWSECOL ELEMENT 4 WIDTH 6 HEADER "Zeit" PARENT oBrowse


DCREAD GUI ;
FIT ;
MODAL ;
ADDBUTTONS;
TITLE 'Autoseek-Demo' to lOK

IF lOK
dc_msgbox("Gewählt wurde: "+aDirectory[nPointer,1])
ENDIF

RETURN

PROCEDURE _Sort ( aArray, nColumn, lDesc )

IF len(aArray)<2
RETURN
ENDIF

IF lDesc=NIL
lDesc:=.f.
ENDIF

IF lDesc
ASort( aArray,,,{|x,y|x[nColumn] > y[nColumn]} )
ELSE
ASort( aArray,,,{|x,y|x[nColumn] < y[nColumn]} )
ENDIF

RETURN




Gruß

Jürgen
Antworten