DCBROWSE editacross beenden [erledigt]

Moderator: Moderatoren

Antworten
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

DCBROWSE editacross beenden [erledigt]

Beitrag von Ewald »

Moin zusammen,
ich habe hier eine Tabelle mit x Spalten, durch die sich der User mit der Enter-Taste nach jeder Eingabe durchhangelt. Nicht in jeder Zelle stehen zwangsläufig Daten.
In die nächst Zeile kommt man erst, wenn man in diesem Fall die Zelle mit der Überschrift 140 durchgeentet hat oder aber mit der Maus in die nächste Zeile geht.
Der User muss also sinnlos 10 x die Entertaste drücken oder zur Maus greifen wenn nach der Eingabe 3,0 nichts mehr in diese Zeile muss.
Ich würde gerne eine Taste so belegen (die Tab Taste z.B), das nach dem Drücken dieser Taste die Eingabe sofort in die 1. Zelle der nächsten Spalte springt.
Wie und wo kann ich das wohl machen ?
Grüße
Ewald



Bild

Code: Alles auswählen

@ 1,1 dcbrowse ob1 alias "dberf" size 136,14 ;
      edit xbeBRW_ItemSelected action {||ob1:forcestable()};
      mode DCGUI_BROWSE_EDITACROSSDOWN_APPEND ;
      presentation apres

dcbrowsecol field dberf->name  header "Name " parent ob1 width 10 picture "@!" ;
                               valid {|a,b|fname(a,b,getlist)}  ;
                               object ofangan
dcbrowsecol field dberf->datum header "Datum" parent ob1 width 6
dcbrowsecol field dberf->ag01  header {||aheader[01]} parent ob1 width 3 ;
                               picture "@Z 9999.9" ;
                               editprotect {||if(aheader[01]="-",.t.,.f.)}
dcbrowsecol field dberf->ag02  header {||aheader[02]} parent ob1 width 3 ;
                               picture "@Z 9999.9" ;
                               editprotect {||if(aheader[02]="-",.t.,.f.)}
Zuletzt geändert von Ewald am So, 18. Jan 2015 13:56, insgesamt 1-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von brandelh »

Ein XbpBrowse() kennt die Methoden
:down() --> Browse-Cursor um eine Zeile nach unten bewegen.
:firstCol() --> Horizontal bis zur ersten Tabellenspalte scrollen.
Ich denke dass die auch von eXpress zur Verfügung gestellt werden. Die TAB Taste ist von Windows mit dem Focuswechsel belegt.
Ob man diese Taste im KeyBoard Slot abfangen kann weiß ich nicht, aber wie wäre es mit SHIFT+ENTER für neue Zeile ?
Gruß
Hubert
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Moin Hubert,
gerne auch Shift Enter.
Ich habe nur keine Ahnung, wo im Quellcode ich das reinbasteln muss.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Tom »

Das Problem ist, dass Du nicht im Browse bist, sondern in einem überlagerten SLE (DGET), das man auch selbst gestalten kann.

Da gibt es aber Bordmittel für. Ich komme heute nicht mehr dazu - morgen mehr.
Herzlich,
Tom
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Ich weiß, das hat was mit dem Kopf zu tun aber ich habe down() + firstcol() mal testweise auf einen Button gelegt ;-)
Das Ergebnis kommt meinem Wunsch schon sehe nahe. Nur müsste diese action nicht an dem Knopf sondern an einer Taste(nkombination) hängen.
Was dann noch fehlt, ist das das Eingabefeld danach direkt aktiv ist. Der Cursor steht zwar auf der Zelle, man muss sie aber mit der Maus anklicken.

Code: Alles auswählen

@ 25,45 dcpushbutton caption "nächste Zeile" size 10,1 ;
        action {||ob1:down(),ob1:firstcol(),ob1:refreshall()}
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Das mit dem Button war ja doch zielführender als ich dachte. Den kann ich ja mit einer Tastenkombination belegen. "nächste &Zeile" z.b.
Dann kann ich mit Alt + Z die Aktion auslösen.

Ich muss nur irgendwie

1. das aktivierte Eingabefeld verlassen
2. mit ob1:down(),ob1:firstcol() das neue Feld anspringen
3. das neue Feld zur Eingabe aktivieren.

im Moment fehlt mir zu Punkt 1 und zu Punkt 3 die Idee wie das wohl gehen kann.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Koverhage »

Du kannst doch abfragen ob das Feld leer ist oder
im LOSTFOCUS Block entsprechend reagieren.
Gruß
Klaus
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Hallo Klaus,
ich nehme mal mein Beispiel oben. Da hat der User die 3,0 eingegeben und würde jetzt Enter auslösen. Dann springt der Cursor nach rechts und das Eingabefeld ist aktiv.
Jetzt sieht er, das er in diese Zeile keine Eingaben mehr machen muss uns soll per Tastenkombi in die nächste Zeile und dort sofort einen Namen eingeben können.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Koverhage »

So ?
DCHOTKEY xbeK_SH_DEL ACTION {|| ge_del(), oBrowse:goTop(), oBrowse:forcestable(), DC_GetRefresh( GetList ) }
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von brandelh »

Wenn es so wäre, dass es keine 0 Werte zwischen anderen Werten gibt, könnte man bei ENTER abfragen ob
die aktuelle Eingabe 0 war und wenn ja die Springe an Anfang nächster Zeile Aktion ausführen.
Ich vermute aber, dass das bei dir nicht der Fall ist ...

Schau mal in die express doku, dort sollte stehen wie man den Editiermodus eines Browse verläßt und die Daten nur anzeigt bzw. wieder editiert ... falls sowas vorgesehen ist.
Ansonsten könntest du auch die nötigen Tastenkombinationen mit PostAppEvent and das Browser-Objekt bzw. des Editier-Objekt im Browser zu senden.
Gruß
Hubert
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

@ Klaus.
DCHOTKEY ist genau das was ich gesucht habe. Der Hotkey müsste der Reihe nach folgendes auslösen.

1. einen einfachen Linksklick im Bereich ob1 (Browserfenster) zum Beenden des Edit-Modus
2. ob1:down()
3. ob1:firstcol()
4. einen doppel Linksklick auf die aktuelle Zelle zum Aktivieren des Edit-Modus

Dazu brauche ich ein wenig Hilfe.
Was muss ich den wohl genau für Aktion 1 und Aktion 4 eintragen um die gewünschten Mausklicks auszulösen ?

DCHOTKEY xbeK_... {||Aktion 1,ob1:down(),ob1:firstcol(),Aktion 4,ob1:refreshall()}

Gruß
Ewald
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Koverhage »

1. kann ich so auf die Schnelle nicht beantworten
entweder PostAppEvent( xbeP_Keyboard, xbeK_???,, oXbp )
oder PostappEvent einen linken Mausklick
4. PostAppEvent( xbeP_Keyboard, xbeK_RETURN,, oXbp )
(Return aktiviert den Edit-Modus)
Gruß
Klaus
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Ich bin fast am Ziel, muss aber noch mal nerven und um Hilfe rufen.
Dieser Code funktioniert bis auf die Zeile 1 genau wie gewünscht. Wenn im Browse keine Zelle zum Edit geöffnet ist, springt der Cursor eine Zeile tiefer ganz nach links und die Zelle wird zum Editieren geöffnet.
Wenn allerdings eine Zelle im Editmode steht geht es nicht. Diesen Modus kann ich manuell beenden, wenn ich irgendwo in das Fenster klicke. Dann schließt sich der Editmode.
Also muss ich diesen Mausklick irgendwie mit auslösen. Und genau das kriege ich nicht hin. Im Code steht die X-te Version die nicht funktioniert.
Hat jemand noch einen Tip für mich ?

Code: Alles auswählen

DCHOTKEY xbeK_CTRL_N ACTION {||PostAppEvent(xbeM_LbClick,{0,0},,ob1:getcolumn(1):heading), ;
                               ob1:down(),      ;
                               ob1:firstcol(),  ;
                               PostAppEvent( xbeP_Keyboard,xbeK_RETURN,,ob1:getcolumn(1)), ;
                               ob1:refreshcurrent()}
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Koverhage »

Wenn Du den Wert nicht geändert hast, reicht es doch ein ESC zu senden.
Also das geliche wie bei 4. nur anstatt RETURN eben ESC
Gruß
Klaus
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Moin,
ESC reicht leider nicht. Hatte ich auch schon versucht. Das geht aber dann in die Hose, wenn aus irgendwelchen Gründen kein Edit-Modus besteht und der User den Hotkey auslöst. Dann schließt sich das kpl. Fenster und die Daten sind im Nirvana. Dazu müsste ich dann wieder eine Fabrik bauen, um das abzufangen.
Ich lese mir schon einen Wolf. Außer einem Mausklick finde auch nichts, wie man den Edit-Modus beenden kann. Aber es muss doch möglich sein, einen linken Mausklick mit Postappevent auszulösen. Irgendwo hakt es da bei mir noch an der Syntax. Noch hoffe ich auf den ultimativen Tip für dieses Vorhaben.
Gruß
Ewald
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von brandelh »

Wenn die eXpressler hier nichts wissen, solltest du mal an den Autor gehen, vielleicht ist das ja ein missing feature ;-)
Gruß
Hubert
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Hi Hubert,
postappevent ist doch eine Anforderung an die Puristen ;-)
Wie löse ich mit Postappenvent einen Lbclick im aktiven Fenster aus. Nicht mehr und nicht weniger.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von brandelh »

das ist einfach !

PostAppEvent( <nEvent>, [<mp1>], [<mp2>], [<oXbp>] ) --> lSuccess
PostAppEvent( xbeM_LbDown, , , oDasIstDasProblem )

Die Frage ist nur, was in die Zielvariable rein muss (mp1 und mp2 braucht man glaube ich nicht):

oDasIstDasProblem könnte dein Fensterobjekt sein oder dein BrowserObjekt ... oder ?
Gruß
Hubert
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Wenn ich das manuell mache - also den Editmode mit einen LKlick beende, reicht es, wenn ich irgendwohin (im gesamten aktiven Fenster) klicke. Damit könnte "oDasIstDasProblem" von setappwindow() bis ob1:??? alles sein. Aber wie drücke ich das aus. Etwas mit setappwindow() ???? Da muss ich sofort mal probieren.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von brandelh »

Versuche mal SetAppFocus() auf ein anders Element oder nur das Fenster ...
Gruß
Hubert
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

Zweitausend Versuche später - ich bekomme es nicht hin. Und jetzt drängt sich mir ein ganz neuer Verdacht auf.
Kann es wohl sein, das ein Hotkey überhaupt nicht zieht, wenn ein Eingabe-Feld aktiv ist ?
Ein Pushbutton funktioniert bei aktivem Eingabefeld auch nur, wenn man ihn anklickt. Nicht wenn man seine Alt+Buchstabenkombi eingibt.
So ist das zumindest bei mir.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Koverhage »

Ewald,

meines Erachtens zwei Probleme.

1. Wenn Du das Feld mit einem Linksklick verlassen möchtest, musst Du zunächst die Mausposition außerhalb des Eingabefelder verschieben.
2. Verwenden der Editor Klausel.
Gruß
Klaus
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DCBROWSE editacross beenden

Beitrag von Ewald »

So, jetzt habe ich das System mit den eigenen Waffen geschlagen 8)
1. In den getoptions die ESC-Taste blockiert (noescapekey). Damit kann der User sich nicht mehr mit ESC kpl. rausschießen - sprich die Anwendung verlassen.
2. Wenn im Browser ein Feld zum Editieren geöffnet ist kann es jedoch (nur) noch mit ESC oder mit der Maus geschlossen werden.
3. Da ESC im Edit-Modus einer Zelle angenommen wird bewirkt der Hotkey auf ESC, das der User durch 2 x ESC das gewünschte Ergebnis erzielt.
Der Editmodus in der Zeile wird beendet, der Cursor springt in die erste Zelle der nächste Zeile und öffnet sie zur Eingabe.

Da bleiben bei mir zwar noch einige Fragen auf aber ich beende das dann mal.

Code: Alles auswählen

DCHOTKEY xbeK_ESC ACTION {|| ob1:down(),      ;
                             ob1:firstcol(),  ;
                             PostAppEvent( xbeP_Keyboard,xbeK_RETURN,,ob1:getcolumn(1)), ;
                             ob1:refreshcurrent()}
Danke für die Tips
Ewald
Antworten