ItemSelected im Browser [erledigt]

Moderator: Moderatoren

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

ItemSelected im Browser [erledigt]

Beitrag von Ewald »

Moin zusammen,
ich schiebe ein Browser Problem vor mir her, das ich leider etwas zu spät erkannt habe.
Beispiel: Ich übernehme eine Datenbank in ein riesen Array und will möglichst einfach feststellen, ob jemand in einer Zeile gearbeitet hat.
Die Information das die Zeile gewählt wurde reicht mir.
Dazu habe ich im Array ein Element, das gekennzeichnet wird wenn die Zeile zwecks Änderung angewählt wurde. Aktionblock edit ...
Wenn die Daten irgendwann in die Datenbank zurückgeschrieben werden will ich nur die Zeilen berücksichtigen, die gewählt wurden.
Jetzt merke ich, das ItemSelected nur zutrifft, wenn man die Zeile direkt anklickt. Wenn man dann weiter mit den Pfeiltasten durch die
Tabelle in einzelne Zeilen oder Felder rast wird nicht erkannt das ein Feld zum editieren gewählt wurde.
Ich habe nichts gefunden das ItemSelected immer erkennt.
Hat jemand einen Tipp für mich wie ich das im Browserkopf selbst lösen kann ?

Code: Alles auswählen

@ 0,0 dcbrowse ob1 data amit size 42,20 fit ;
      pointer nkey ;
      edit xbeBRW_ItemSelected action {||amit[nkey,05]:="*",ob1:refreshcurrent()}
Zuletzt geändert von Ewald am Mi, 06. Dez 2017 10:26, insgesamt 1-mal geändert.
DelUser01

Re: ItemSelected im Browser

Beitrag von DelUser01 »

Hallo Ewald

wenn der User in ein Feld springt merke Dir den Wert vorher und vergleiche diesen mit dem Wert beim Verlassen des Feldes. Wurde der Wert geändert merke Dir das Feld in einem weiteren Array (z.B. AAdd( aChanged , {nRow,nCol,bDataLink,uValue}) ). Am Ende des Browse kannst Du dann aChanged abarbeiten.
(In MultiUser-Umgebung eventuell nicht empfehlenswert.)
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: ItemSelected im Browser

Beitrag von Ewald »

Hallo Roland,
danke für den Tipp am frühen Abend.
Die Überwachung einzelner Felder ist aber das was ich verhindern wollte. Irgendwie finde ich es komisch das ItemMarked geht, aber ItemSelected nicht. Klar, jetzt habe ich in der Beschreibung gelesen das ItemSelected nur Enter und Doppelklick registriert - nur ist selected für mich selected.
Egal wie ;-) Auch wenn ich mit den Pfeiltasten rein navigiere ist es selected. (Dachte ich)
Und um mir den Wert eines Feldes zu merken wenn ein User da mit den Pfeiltasten rein.- und rausspringt muss ich das ja auch irgendwie mitbekommen - wieder itemSelected oder so. Dann könnte ich auch meinen * in den Satz schreiben ohne ein zusätzliches Array anzulegen.

Gruß
Ewald
DelUser01

Re: ItemSelected im Browser

Beitrag von DelUser01 »

@Ewald

Es ist doch so, dass Xbase++ von sich aus eine Änderung des Feldinhalts nicht kennzeichnet. Das musst dann also Du machen. Oder Du schreibst einfach blind alles raus über DataLink() -ob geändert oder nicht.
Prüfen ob geändert kannst Du ja auch noch vor dem Schreiben in DataLink() realisieren.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: ItemSelected im Browser

Beitrag von AUGE_OHR »

Ewald hat geschrieben: Mo, 04. Dez 2017 19:38 Irgendwie finde ich es komisch das ItemMarked geht, aber ItemSelected nicht.
Klar, jetzt habe ich in der Beschreibung gelesen das ItemSelected nur Enter und Doppelklick registriert - nur ist selected für mich selected.
das was du "gelesen" hast stimmt ... es geht NUR Enter oder Doppelklick :!:

allerdings kann man ja jede Taste "umlenken" z.b. LEERTASTE zum selektieren.
ich würde ein extra Feld nehmen was man auch optisch sehen kann "das" was selektiert wurde.
gruss by OHR
Jimmy
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: ItemSelected im Browser

Beitrag von Ewald »

Ja, so habe ich das 100 gefühlte Jahre mit DBF's gemacht. Da kann man vor dem Zurückschreiben schnell mal prüfen ob es Änderungen gab oder nicht. Ich schreibe aber in SQL Datenbank. Mit der bin ich nicht "verdatalinkt".
Deswegen ja mein forscher Ansatz, das nur was im Browser geändert wurde wenn vorher jemand etwas zum Editieren ausgewählt hat - also itemSelected. Dann schreibe ich das kpl. SubArray zurück - egal ob tatsächlich Änderungen waren oder nicht.
Wenn das nicht so zu realisieren ist wie ich mir das vorstelle/vorgestellt habe gehe ich in die einzelnen Spalten und löse das mit valid.
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: ItemSelected im Browser

Beitrag von Ewald »

Moin Jimmy,
habe ich doch. In amit[nkey,05] erscheint ein "*" wenn jemand in der Spalte tätig war. Leider nicht wenn er mit den Pfeiltasten dahin gerutscht ist.
Ich könnte die deaktivieren ;-)
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: ItemSelected im Browser

Beitrag von AUGE_OHR »

Ewald hat geschrieben: Mo, 04. Dez 2017 20:13 Ich schreibe aber in SQL Datenbank. Mit der bin ich nicht "verdatalinkt".
du hast nicht erwähnt das es sich um SQL handelt ...
in eine SQL Query kann man "zusätzliche" Felder einbauen die man dann im Resultset / Array hätte welche man zum "selektieren" benutzen könnte.

ein andere Möglichkeit wäre sich die "Nummer" des Array Element zu "merken".
gruss by OHR
Jimmy
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: ItemSelected im Browser

Beitrag von brandelh »

Im browser selbst wird ja nichts geändert. Man springt ja in ein sle für die Eingabe und das kennt changed. Entweder im Array eine Spalte unsichtbar mitführen die ein editiert flag kennzeichnet, besser wäre aber ein update direkt auszuführen.
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: ItemSelected im Browser

Beitrag von Ewald »

Moin Hubert,
mein ursprüngliches Anliegen ist etwas untergegangen. Die Frage war ja, ob es möglich ist den Codeblock irgendwie auszuführen,
auch wenn das Feld nicht mit Doppelklick oder Enter sondern mit Pfeiltasten angewählt wurde. Und das durch eine Anweisung im Browse
selbst - ohne die Anweisung an jedes editierbare Feld zu hängen. Vollkommen unabhängig davon wohin ich das irgendwann schreiben will - oder nicht.

Ich fange vorsichtshalber mal an das dann doch mit valid zu lösen. Aber unter Protest ;-)

Code: Alles auswählen

@ 0,0 dcbrowse ob1 data amit size 42,20 fit ;
      pointer nkey ;
      edit xbeBRW_ItemSelected action {||amit[nkey,05]:="*",ob1:refreshcurrent()}]   <----  (sollte auch bei Anwahl durch Pfeiltaste)
     
      dcbrowsecol element  1 header "Name" ... // valid {||amit[nkey,05]:="*"} könnte ich natürlich machen - wollte ich aber nicht.
      dcbrowsecol element  2 header " blah"                "
      dcbrowsecol element  3 header " blah"                "
      dcbrowsecol element  4 header " blah"                "
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: ItemSelected im Browser

Beitrag von brandelh »

Oh wir sind im Express Zweig ... da läuft einiges ja anders, aber grundsätzlich ...

Man kann Events "in Auftrag geben", siehe hierzu ...
PostAppEvent()
Places an event in the event queue.

PostAppEvent( <nEvent>, [<mp1>], [<mp2>], [<oXbp>] ) --> lSuccess
aber irgendetwas muss ja auf die Idee kommen dies zu tun, das kann ein Timer sein oder eine sonstige Routine, aber ob das ein sinnvolles Verhalten gibt ?

Wenn schon die Bewegung in eine Zeile etwas auslösen soll, dann muss man einen anderen CallBack Slot nutzen, z.B. ItemMarked() oder setInputFocus().
Bei Express gibt es - soweit ich mich erinnere - aber auch die Möglichkeit einen Edit-Modus zu starten, sicher wird sich TOM dazu äußern ;-)
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: ItemSelected im Browser

Beitrag von Wolfgang Ciriack »

Dafür ist doch ITEMMARKED zuständig. Der wird ausgeführt, jedesmal wenn nur ein Satz den Cursor bekommt. Allerdings auch schon, wenn DCBROWSE den Focus bekommt (dann ist ja der Cursor auf einem Satz).
Viele Grüße
Wolfgang
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: ItemSelected im Browser

Beitrag von brandelh »

Die Information das die Zeile gewählt wurde reicht mir.
...
Ich habe nichts gefunden das ItemSelected immer erkennt.
nach dieser Beschreibung verwendest du einfach den falschen Event !
Ein ItemSelect wird immer erkannt, wenn er aufgetreten ist !

Was du brauchst ist die Aktion bei jedem ItemMarked Event, kann man deinen Befehl etwa so ändern ?

Code: Alles auswählen

@ 0,0 dcbrowse ob1 data amit size 42,20 fit ;
      pointer nkey ;
      edit xbeBRW_ItemMarked action {||amit[nkey,05]:="*",ob1:refreshcurrent()}
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: ItemSelected im Browser

Beitrag von Ewald »

Ich will ja nicht das das Markieren einer Zelle (itemmarked) etwas auslöst, ich will das etwas ausgelöst wird wenn eine Zelle ZUM EDITIEREN geöffnet (selected) wird. Und das der gleiche Zustand ob ich sie mit Doppelklick aufmache oder mit den Pfeiltasten ansteuere. Wenn ich eine Zelle öffne und dann mit den Pfeiltasten weiter navigiere sind danach alle angesprungenen Zellen nicht nur markiert, sie sind zum Editieren geöffnet - nach meinem Verständnis also genau so selected als wenn ich geklickt hätte. Es sei denn selected bedeutet nicht das eine Zelle gewählt und geöffnet ist ...
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: ItemSelected im Browser

Beitrag von brandelh »

OK das ist Express-Spezial !!!
Die Zeile edit xbeBRW_ItemSelected action {||amit[nkey,05]:="*",ob1:refreshcurrent()}
steuert offensichtlich die Editierfunktion, in der Doku oder der CH Datei, die das in Xbase Code übersetzt, müsste stehen ob du in die Verarbeitung der Pfeiltasten kommst.
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: ItemSelected im Browser

Beitrag von Ewald »

Hallo Hubert,
Bingo. Da habe ich gesucht und bin nicht fündig geworden.
xbeBRW_ItemSelected kommt allerdings soweit ich das sehe aus der appevent.ch von xbase selbst.
Das müsste reagieren bei.
1. Doppelklick
2. Auswahl durch Enter
3. Durch Anwahl über Pfeiltaste - wenn zum Editieren geöffnet.
Ist aber nun mal nicht - aber dann wäre ich endlich zufrieden. :D
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: ItemSelected im Browser

Beitrag von brandelh »

Du solltest lesen was man schreibt :!:

In der Xbase++ Hilfe steht eindeutig, wann ein ItemSelect() beim Browser ausgelöst wird:

xbeBRW_ItemSelected- Doppelklick links oder Return Taste wurde gedrückt

dein 3. Wunsch hat nichts mit dem XbpBrowse() zu tun, sondern mit der Spezialversion vom Express++

Ein Pfeil im Edit-Feld führt zum Wechsel der Zeile und erneuten editieren ... aber eben nicht über einen xbeBRW_ItemSelected() Event des Browsers,
sondern vermutlich wird der Editiermodus durch ein automatisch eingebettetes XbpSLE() realisiert, und dort wird laut Hilfe Pfeil auf/ab auf das nächste Xbase++ Part Objekt springen.

Du hast was von einem VALIDATE geschrieben, das dürfte nach jedem XbpSle() edit Ende aufgerufen werden, da könntest du die Markierung setzen.

Aber nochmal, das ist Express++ spezial, in der Doku dazu sollte sowas stehen. TOM scheint heute nicht online zu sein und ich kann bei Express nicht wirklich helfen ;-)
Gruß
Hubert
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: ItemSelected im Browser

Beitrag von Tom »

Oh, was für ein Durcheinander.

Also. DCBROWSE erzeugt mit eXpress++-Code ein Browse, die Klausel "EDIT" bewirkt, dass es editierbar ist. Dadurch öffnen sich SLEs in den Browserzellen. Ewalds Code sorgt dafür, dass der Editiermodus mit dem Event xbeBRW_ItemSelected ausgelöst wird. Dies ist in Xbase++ das Standardevent (auch verfügbar als Slot ItemSelected) für das Auswählen einer Zelle/Zeile - mit Doppelklick oder ENTER. Ewalds Problem ist, dass der Editiermodus aktiv bleibt, wenn er einmal gewählt ist, bis man ihn mit ESC beendet, aber sobald man in eine andere Zeile springt, aktiviert er sich immer wieder. Das ist vermutlich nicht das gewünschte Verhalten. Außerdem wird die Markierung in Spalte 5 des Arrays immer gesetzt, ganz egal, ob tatsächlich editiert wird oder nicht - und der Pointer stimmt auch nicht immer (für derlei sollte man DC_GetColArray(0,oBrowse) oder DC_BrowseRow(oBrowse) verwenden, weil die POINTER-Klausel von eXpress++ nicht verlässlich ist, Ewald). Die Frage ist jetzt, welches Verhalten eigentlich gewünscht ist. Wenn Du mir das sagst, Ewald, kann ich Dir die Klauseln dafür nennen.
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: ItemSelected im Browser

Beitrag von Ewald »

Ahhhh, moin Tom - ich sage nur Babylon.
Die Markierung in Spalte 5 wird eben nicht !!!! gesetzt wenn ich mit den Cursortasten editierend rumflitze. Und das wäre genau das Verhalten das ich mir von action {||itemselected ...} wünschen würde.
Nehmen wir an jemand gibt in ein Feld einen Wert ein und tickert dann mit dem Pfeil immer einen tiefer und gibt da einen Wert ein. Das passiert dann ohne das ein Itemselected registriet wird. In meinem Beispiel nicht registriert wird - besser gesagt. Also bekomme ich meine Info für amit[nkey,05] auf diese Weise nicht. Das verwirrte mich etwas das eine Info-Lücke klafft. Ob das aus XBase kommt oder aus Express kann ich überhaupt nicht beurteilen. Kann man ich Xbase nicht editierend mit den Pfeiltasten durch eine Tabelle browsen ?

Also noch mal auf den Punkt, ich wollte das mein 1. Code IMMER reagiert und amit[nkey,05] einen Stern bekommt. Auch wenn die Zelle mit den Pfeiltasten geöffnet! wurde - auch wenn nicht editiert wurde. In der Art xbe_BRW_ItemSelected_auch_mit_Pfeiltasten action ...

Code: Alles auswählen

@ 0,0 dcbrowse ob1 data amit size 42,20 fit ;
      pointer nkey ;
      edit xbeBRW_ItemSelected action {||amit[nkey,05]:="*",ob1:refreshcurrent()}
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: ItemSelected im Browser

Beitrag von brandelh »

Ewald hat geschrieben: Di, 05. Dez 2017 14:36Kann man ich Xbase nicht editierend mit den Pfeiltasten durch eine Tabelle browsen ?
Nein, ein XbpBrowse() zeigt nur an ... alles andere muss man selbst einbauen.
Z.B. ein XbpSle(), das den Edit-Teil abdeckt. Ich weiß andere Browser können mehr :roll:
Gruß
Hubert
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: ItemSelected im Browser

Beitrag von Tom »

Das Problem ist also, dass das DCBROWSE zwar richtig agiert, dass aber das "*" nur gesetzt wird, wenn das Editieren kurz mit ESC beendet wird, richtig? Ich schaue mir das morgen früh mal an - ich arbeite aus guten Gründen nicht mehr mit Browses, in denen man direkt editieren kann. Das sollte sich aber hinkriegen lassen. Sinnvoller als Dein Vorgehen wäre aber der hier auch schon angeregte Vergleich mit den Originaldaten. Dafür dupliziert man das Array (oder jede Zeile in sich selbst) und vergleicht nach dem Beenden des Editiervorgangs Original und Kopie - und schreibt nur solche Daten in die Tabelle durch, an denen Änderungen vorgenommen wurden. Das kann man auch zur Laufzeit machen und über den ColorBlock (COLOR-Klausel bei DCBROWSE) solche Zellen/Zeilen hervorheben, die verändert sind.
Herzlich,
Tom
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: ItemSelected im Browser

Beitrag von brandelh »

Und wenn mehrere gleichzeitig die Datei editieren können sollte man sofort durchschreiben ;-)
Gruß
Hubert
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: ItemSelected im Browser

Beitrag von Tom »

Und dann auch wieder einlesen. Und überhaupt, es kann ja was passieren, während lokal nichts passiert. Tabellendaten in Arrays sind in solchen Situationen nicht ungefährlich, aber es gibt Methoden dafür. RegisterClient() und so. Oder eigene Überwachungen.
Herzlich,
Tom
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: ItemSelected im Browser

Beitrag von HaPe »

Hallo Tom !
Tabellendaten in Arrays sind in solchen Situationen nicht ungefährlich, aber es gibt Methoden dafür. Oder eigene Überwachungen.
Wie geht Ihr dabei vor?
Der Netzwerk-Client registriert sich beim Anmelden an der Applikation/Öffnen des Formulares in einer Anwendung auf dem Server. Wenn die Anwendung auf dem Server merkt dass an den Daten die der Client bearbeitet/anschaut sich etwas ändert, dann bekommt der Client eine Info auf welchem Weg?
--
Hans-Peter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: ItemSelected im Browser

Beitrag von AUGE_OHR »

HaPe hat geschrieben: Di, 05. Dez 2017 18:05 ... dann bekommt der Client eine Info auf welchem Weg?
über einen Event : xbeDBO_Notify

schau mal im Help file nach der Method "notify()"
in ..\SOURCE\samples\apps\MdiDemo\DataDlg.prg kann man es im Debugger in Aktion sehen.
gruss by OHR
Jimmy
Antworten