Seite 1 von 1

DCBROWSE mit Itemselected [erledigt]

Verfasst: Do, 03. Sep 2009 21:58
von Ewald
Hallo und schönen guten Abend Gemeinde ...
in einem DCBROWSE gebe ich dem User die Möglichkeit, per Doppelklick (itemselected) einen Eintrag in den Datensatz vorzunehmen, der die gewählte Position zur Weiterverarbeitung markiert. Das mache ich schon lange so und hatte auch noch nie Probleme - bis jetzt die Anforderung im Raum steht, auch Änderungen in der gewählten Zeile vornehmen zu können.
Wenn jetzt die Zeile mit Doppelklick markiert wird, steht der User auch sofort im Editmodus. Das möchte ich verhindern. Möglich wäre es, den EditModus mit einem Rechtsklick auf die markierte Zelle zu aktivieren. Habe es mit "edit xbeBRW_ItemRbDown" versucht. Der Versuch war nicht gut.
Hat jemand den ultimativen Rat, der mich vor weiteren 1000 Versuchen rettet ?

Code: Alles auswählen

@ 01,01 dcbrowse obrowse alias "dbfremd" size 85,20 ;
                 itemselected {||dbfremd->einspiel:=if(dbfremd->einspiel="X"," ","X"),obrowse:refreshall()};
                 edit xbeBRW_ItemSelected 

Re: DCBROWSE

Verfasst: Fr, 04. Sep 2009 7:47
von Wolfgang Ciriack
Hallo Ewald,
ich benutze die rechte Maustaste in einem Browse, um ein Kontextmenü anzuzeigen.
Das kannst du bestimmt adaptieren.

Code: Alles auswählen

@3.8,0.5 DCBROWSE oBrowse ;
.......
EVAL {|o| o:ItemRbDown:={|aMPos,aLC,oBr| ...... }

Re: DCBROWSE und itemselected [erledigt]

Verfasst: Fr, 04. Sep 2009 14:39
von Ewald
Hallo Wolfgang,
danke für die Hilfe, ich habe das wie folgt gelöst.
Aber - mir macht das alles irgendwie Angst :shock: ;-)

Code: Alles auswählen

@ 01,01 dcbrowse obrowse alias "dbfremd" size 89,20 ;
                 eval {|o|o:ItemRbDown:={|a,b,c|dbfremd->einspiel:=if(dbfremd->einspiel="X"," ","X"),obrowse:refreshall()  }} ;
                 edit xbeBRW_ItemSelected
Gruß
Ewald

Re: DCBROWSE

Verfasst: Fr, 04. Sep 2009 14:53
von Tom
Hallo, Ewald.

Deine Lösung dürfte zwei Probleme generieren: Erstens könnte man irgendwo hinklicken (einschließlich der Spaltenüberschriften), es würde sich per Rechtsklick immer der Inhalt des Feldes bzw. der Spalte "einspiel" ändern. Zudem würde sich immer nur die derzeit aktuelle (markierte) Spalte/Zeile ändern, selbst dann, wenn man in eine andere klickt. Besser: Nur in der fraglichen Spalte:

Code: Alles auswählen

DCBROWSECOL DATA {||dbfremd->einspiel} PARENT oBROWSE ... 
   EVAL {|o|o:DataArea:RbClick := {||dbfremd->einspiel:=if(dbfremd->einspiel="X"," ","X"),oBrowse:RefreshCurrent()}}
(RefreshCurrent() reicht, es sei denn, Dein Browse wertet noch irgendwie Daten aus.)

Zusätzlich kannst Du DCBROWSE selbst mit der Option RBSELECT versehen. Das würde dazu führen, dass ein Klick mit der rechten Maustaste auch die Spalte auswählt. Ohne das würde mein Codevorschlag die Zeile ändern, in deren Spalte "einspiel" man klickt, ohne die Markierung auf sie zu setzen. Auch das kann sinnvoll sein.

Re: DCBROWSE mit Itemselected [erledigt]

Verfasst: Fr, 04. Sep 2009 15:53
von Ewald
Hallo Tom,
auch dir vielen Dank für deine Lösung.
Irgenwann fällt mir sowas (hoffentlich) selbst mal ein.
Rom wurde schließlich auch nicht an einem Tag abgebrannt.
Gruß
Ewald

Re: DCBROWSE mit Itemselected [erledigt]

Verfasst: Fr, 04. Sep 2009 16:10
von Tom
Rom wurde schließlich auch nicht an einem Tag abgebrannt.
Ja, gute Brandbeschleuniger kamen erst sehr viel später auf den Markt.

Rogers Befehle erzeugen ganz normale Xbase++-Objekte. Eine DCBROWSE-Spalte ist eine XbpColumn, die einen Header, einen Footer und eine Dataarea hat. Auch das sind Klassenobjekte (XbpCellGroup), deren Superklassen so gut wie immer die Standardevents berücksichtigen, also zum Beispiel RbClick (und zig andere). Diese Slots kann man mit eigenen Codeblöcken bestücken, wie in meinem Beispiel den RbClick-Slot der Dataarea. Wenn man so arbeitet, verbindet man die Eleganz und Einfachheit von Rogers Bibliothek mit quasi-echter Objektorientierung. :wink:

Re: DCBROWSE mit Itemselected [erledigt]

Verfasst: Fr, 04. Sep 2009 22:32
von Juergen
Hallo Tom,

Deine Aussage über die Verbindung von Rogers Bibliothek mit quasi-echter Objektorientierung kann ich nur
bestätigen.

Alaska Xbase++ in Verbindung mit Express++ ist ein sehr mächtiges Werkzeug.

Ich hoffe, dass die Weiterentwicklung nicht eingestellt wird.



Gruß
Jürgen