Seite 1 von 1

@ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 10:36
von xbaseklaus
Guten Morgen

ich probiere gerade mit Rogers Express++

Habe hier ein Beispiel von ihm an dem ich probiere !

Code: Alles auswählen

#include "Dbedit.ch"
#include "Inkey.ch"
#include "dcdialog.ch"
#include "xbp.ch"

#pragma library("c:\alaska\exp20\lib\dclipx.lib")

 PROCEDURE main

 LOCAL GetList := {}, GetOptions, oTabPage1, oTabPage2, ;
       oBrowse, cAlias, aDirectory, oDirectory

 USE COLLECT NEW SHARED

 /* ---- Tab Page #1 ---- */

 @ 3,3 DCTABPAGE oTabPage1 CAPTION 'Browse' ;
   SIZE 142,39

 cAlias := "COLLECT"

 @ 2,2 DCBROWSE oBrowse PARENT oTabPage1  ;
       DATA cAlias SIZE 140,35 FREEZELEFT { 1, 2 } FONT "14.Courier"

 DCBROWSECOL FIELD COLLECT->descrip ;
   HEADER "Description" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->type ;
   HEADER "Type" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->sub_type ;
   HEADER "SubType" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->location ;
   HEADER "Location" PARENT oBrowse

 DCBROWSECOL DATA {|a|a:={'Yes','No','Not Sure'},a[COLLECT->for_sale+1]} ;
   HEADER "For Sale?" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->date_orig ;
   HEADER "Orig Date" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->date_acqu ;
   HEADER "Acqu Date" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->orig_price ;
   HEADER "Acqu Price" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->appr_value ;
   HEADER "Appr Value" PARENT oBrowse

 DCBROWSECOL FIELD COLLECT->condition ;
   HEADER "Condition" PARENT oBrowse

 DCBROWSECOL DATA {||IIF(COLLECT->original,'Yes','No')} ;
   HEADER "Orig Owner?" PARENT oBrowse


 /* ---- Tab Page #2 ---- */

 @  0,0 DCTABPAGE oTabPage2 CAPTION 'Directory' ;
    RELATIVE oTabPage1

 aDirectory := Directory()

 @ 2,2 DCBROWSE oDirectory PARENT oTabPage2 ;
       DATA aDirectory SIZE 55,9

 DCBROWSECOL ELEMENT 1 HEADER "Name" PARENT oDirectory WIDTH 10

 DCBROWSECOL ELEMENT 2 HEADER "Size" PARENT oDirectory WIDTH 8

 DCBROWSECOL ELEMENT 3 HEADER "Date" PARENT oDirectory WIDTH 8

 DCBROWSECOL ELEMENT 4 HEADER "Time" PARENT oDirectory WIDTH 8

 DCREAD GUI ;
   TITLE "My COLLECTION" ;
   FIT ;
   ADDBUTTONS ;
   EVAL {||oBrowse:hide(), oBrowse:show()}

 RETURN
 


Dazu hätte ich an die Express++ User mal eine Frage

kann ich damit die einzelnen Tabellen Zeilen wegen der Übersichtlichkeit abwechselnd den Hintergrund verschiedenfarbig hinterlegen ?

Falls ja wie würde das in dem Beispiel ausschauen -> Danke

Mfg. Klaus

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 10:51
von AUGE_OHR
xbaseklaus hat geschrieben:ich probiere gerade mit Rogers Express++

kann ich damit die einzelnen Tabellen Zeilen wegen der Übersichtlichkeit abwechselnd den Hintergrund verschiedenfarbig hinterlegen ?
c:\exp20\Samples\Browse\Zebra.prg

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 10:53
von AUGE_OHR
AUGE_OHR hat geschrieben:
xbaseklaus hat geschrieben:ich probiere gerade mit Rogers Express++

kann ich damit die einzelnen Tabellen Zeilen wegen der Übersichtlichkeit abwechselnd den Hintergrund verschiedenfarbig hinterlegen ?

Code: Alles auswählen

c:\exp20\Samples\Browse\Zebra.prg
c:\exp20\Samples\Browse\browtype.prg

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 11:04
von xbaseklaus
AUGE_OHR hat geschrieben:
AUGE_OHR hat geschrieben:
xbaseklaus hat geschrieben:ich probiere gerade mit Rogers Express++

kann ich damit die einzelnen Tabellen Zeilen wegen der Übersichtlichkeit abwechselnd den Hintergrund verschiedenfarbig hinterlegen ?

Code: Alles auswählen

c:\exp20\Samples\Browse\Zebra.prg
c:\exp20\Samples\Browse\browtype.prg
DANKE .... :blob8:

habs in mein Beispiel eingebaut funktioniert 1A !

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 11:16
von xbaseklaus

Code: Alles auswählen

@ 2,2 DCBROWSE oBrowse PARENT oTabPage1  ;
       DATA cAlias SIZE 140,35 FREEZELEFT { 1, 2 } FONT "14.Courier" ZEBRA {|lEven|Jd_BrowseZebraColor(lEven)}

Code: Alles auswählen

Function Jd_BrowseZebraColor(lEven)

LOCAL aRet

if lEven
  aRet := {GRA_CLR_BLACK,GraMakeRGBColor({255,255,170})}
else
  aRet := {GRA_CLR_BLACK,GraMakeRGBColor({159,231,176})}
endif

Return aRet
um den ZEBRA Effekt zu erhalten habe ich ja jetzt folgendes eingefügt - passt :-)

Wie mache ich das, wenn ich jetzt noch die Zeile in einer anderen Hintergrund - Farbe haben will wo der Cursor grade steht ?

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 15:42
von Wolfgang Ciriack
Schau dir mal die Funktionen

DC_BrowPres() - für allgemeine Einstelungen - und DC_BrowseSort() - für die Header-Einstellungen an.
Z.B.

DC_BrowPres({ ;
{XBP_PP_COMPOUNDNAME, cMyBrwFont }, ;
{XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
{XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE}, ;
{XBP_PP_HILITE_FGCLR, GRA_CLR_BLACK }, ;
{XBP_PP_HILITE_BGCLR, GraMakeRGBColor({255,204,153}) }, ;
{XBP_PP_COL_DA_ROWHEIGHT, nMyBrwHoehe }, ;
{XBP_PP_COL_DA_CELLHEIGHT, nMyBrwHoehe }, ;
{XBP_PP_COL_HA_COMPOUNDNAME, cMyHeadFont } ;
})

Dann bei DCBROWSE einfach ein

PRESENTATION DC_BrowPres() ;


*** Farbe für Browse-Header mit Sort setzen
DC_BrowseSort( { GRA_CLR_BLACK, ;
GRA_CLR_HEADNORMAL , ;
GRA_CLR_WHITE, ;
GRA_CLR_HEADSORTBAR , ;
NIL, ;
NIL, ;
GRA_CLR_WHITE, ;
GRA_CLR_HEADSELECTED })

Bei der Column dann z.B.ein
SORT bMySortBlock LEFTBUTTON ;

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 17:47
von xbaseklaus
Ok , wenn ich die aktuelle Zeile farbig will geht das am besten mit:

Code: Alles auswählen

CURSORMODE (XBPBRW_CURSOR_ROW)

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 17:56
von Manfred
das nimmt Dir aber die Möglichkeit später evtl. einzelne Felder zu editieren.

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Mi, 20. Apr 2016 18:22
von xbaseklaus
Manfred hat geschrieben:das nimmt Dir aber die Möglichkeit später evtl. einzelne Felder zu editieren.
Das stimmt , aber es soll im Browse auch nicht editiert werden ... :-)

Ich mach das mit DCTABPAGE .. auf der nächsten TABPAGE wird dann der Aktuelle Datensatz vom Browse mit DCSAY / GET geändert

Mfg. Klaus

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 8:16
von xbaseklaus
Guten Morgen,

Also wenn ich der Browse TabPage1 auf die TabPage2 wechsle um den Datensatz anzuzeugen auf dem ich im Browse stehe funktioniert das nicht ... er steht in TabPage 2 immer auf
dem ersten ?

Code: Alles auswählen

@ 4,6 DCSAY "Description" get collect->descrip PARENT oTabPage2
wenn ich das mit DBedit gemacht habe war er bei einer Anzeige mit SAY/GET immer auf dem Datensatz in dem er in DBedit gerstanden ist ...

das scheint mit Express++ anders zu sein ... wie muß ich das dann jetzt machen ?

Mfg Klaus

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 8:17
von xbaseklaus
xbaseklaus hat geschrieben:Guten Morgen,

Also wenn ich von der Browse TabPage1 auf die TabPage2 wechsle um den Datensatz anzuzeugen auf dem ich im Browse stehe funktioniert das nicht ... er steht in TabPage 2 immer auf
dem ersten ?

Code: Alles auswählen

@ 4,6 DCSAY "Description" get collect->descrip PARENT oTabPage2
wenn ich das mit DBedit gemacht habe war er bei einer Anzeige mit SAY/GET immer auf dem Datensatz in dem er in DBedit gerstanden ist ...

das scheint mit Express++ anders zu sein ... wie muß ich das dann jetzt machen ?

Mfg Klaus

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 9:29
von xbaseklaus
Das schlimme ist wenn ich von Tabpage1 auf 2 wechsle schreibt er mir auch gleichzeitig den 1.Datensatz in die Datenbank wo ich gerade in meinem Browse stehe ...

???

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 9:49
von Tom

Code: Alles auswählen

@ DCBROWSE ... ITEMMARKED (oder ITEMSELECTED, je nachdem, ob durch einen einfachen oder einen Doppelklick die zweite Tabpage aktualisiert werden soll) {||DC_GetRefresh(oTab2)}
Dies bewirkt, dass die zweite Tabpage mit jedem einfachen oder mit jedem Doppelklick aktualisiert wird, also die Daten neu eingelesen werden. Dadurch würdest Du dort jederzeit die Daten zum aktuellen Satz aus dem Browse sehen.

ABER.

Ich würde so nicht arbeiten, also auf der Tabpage direkt auf der Tabelle, weil Du dann auf Feldebene für das Locking sorgen und bei jedem Fokuswechsel prüfen müsstest, ob etwas mit Daten passiert ist. Stattdessen würde ich die Inhalte des jeweiligen Datensatzes in Variablen oder in ein Array einlesen und diese zur Bearbeitung anbieten. Die Felder auf der Tabpage würde ich mit EDITPROTECT sperren und über eine Schaltfläche in den Bearbeiten-Modus wechseln:

Code: Alles auswählen

lEdit := .F.
@ 1,1 DCSAY "Name:" GET cName EDITPROTECT {||!lEdit} GETOBJECT oErstesFeld
..
@ 20,1 DCPUSHBUTTON CAPTION {||IF(lEdit,'Speichern','Bearbeiten')} SIZE 15,1 ACTION {||lEdit := !lEdit,IF(lEdit,SetAppFocus(oErstesFeld),NIL)}

* und auf Tab1 (vermutlich auch noch an anderen Stellen erforderlich):

@ x,y DCTABPAGE ... WHEN {||!lEdit} // dies verhindert, dass im Browse gearbeitet werden kann, während das Bearbeiten aktiv ist.
Man könnte auch dafür sorgen, dass der Bearbeiten-Modus eingeschaltet wird, sobald man auf Tab2 wechselt:

Code: Alles auswählen

@ 0,0 DCTABPAGE oTab2 GOTFOCUS {||lEdit := .T.}
und umgekehrt auf Tab1, dass Daten gespeichert werden, falls vorher das Bearbeiten aktiviert war:

Code: Alles auswählen

... oTab1 GOTFOCUS {||SaveData(),lEdit := .F.}
Entsprechend dann auch beim Verlassen des Dialogs usw.

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 10:17
von xbaseklaus
@ TOM genau das habe ich verzweifelt gesucht . DANKE

Deine Anmerkungen sind echt zu bedenken ...

Ich sehe schon ... mit Express++ arbeiten ist echt viel zu beachten ... und man sollte vorher genau überlegen wie man alles macht um sich nicht in eine Sackgasse zu programmmieren


Kann man eigentlich auf einer TabPage noch mehrere sozusagen UNTER-TabPages anlegen ? Ist das vom Aufwand her sinnvoll ?

Mfg. Klaus

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 10:44
von Tom
Kann man eigentlich auf einer TabPage noch mehrere sozusagen UNTER-TabPages anlegen ? Ist das vom Aufwand her sinnvoll ?
Klar. Du kannst fast alles auf allem machen.

Code: Alles auswählen

@ 1,1 DCTABPAGE oSubTab1 ... PARENT oTab2
erzeugt eine neue Tab auf einer anderen.

BTW, so:

Code: Alles auswählen

@ x,y DCTABPAGE oTab
DCSETPARENT TO oTab
... weitere Controls
DCSETPARENT TO
erspart Dir, immer den Parent anzugeben, und wenn sich dieser ändert, sind nur zwei Zeilen Code zu überarbeiten.

Ich empfehle Dir dringend, die Samples und die dazugehörigen Codes anzuschauen, außerdem die Doku z.B. zu DCBROWSE, DCTABPAGE, DCSAYGET usw. Da ist eine Menge möglich.

Und übrigens gibt es in eXpress++ eine Funktion (von vielen), die da "DC_AutoLockEditedRecord()" heißt. Wenn sie mit .T. aufgerufen wird, sperrt eXpress++ solche Felder, die z.B. über DCSAY/GET bearbeitet werden, im Moment der Bearbeitung automatisch. Allerdings ist das mit großer Vorsicht zu genießen.

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 11:51
von xbaseklaus
Ok , wenn ich dann einen Refresh vom geänderten im oBrowse haben will muß ich folgendes einfügen: VALID

Code: Alles auswählen

 @ 4,6 DCSAY "Description" get collect->descrip PARENT oTabPage2 VALID {||DC_GetRefresh(obrowse)} 
Was mich jetzt stört , warum ist wenn ich ins DCsay/Get Feld klicke auf oTabPage2 der CURSOR so komisch ... d.h. ein schwarzes Rechteck hinter dem der Cursor blinkt

kann man das ändern das es so ist wie beim Clipper Code ? Ich hoffe es ist verständlich was ich meine.

Mfg. Klaus

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 11:57
von Tom
Äh. Warum tust Du das? DC_GetRefresh(oBrowse) bewirkt, dass das Browse refresht wird: Die Daten werden neu eingelesen, die Anzeige wird stabilisiert. Das passiert dann mit jedem Tipper im Feld. Sinnvoller wäre das hier:

Code: Alles auswählen

@ x,y DCSAY ... GET ... LOSTFOCUS {||oBrowse:RefreshCurrent()}
Das aktualisiert die jeweilige Zeile im Browse, aber nur nach dem Verlassen des Eingabefelds. Alternativ kannst Du auch einfach bei der Browse-Tabpage das hier machen:

Code: Alles auswählen

@ x,y DCTABPAGE ... GOTFOCUS {||oBrowse:RefreshAll()}
Dann wird das Browse mit jedem Wechsel auf die Tabpage aktualisiert, auf der es sich befindet.

Edit: Der Valid-Codeblock muss .T. (Feld ist in Ordnung) oder .F. zurückliefern. Deiner liefert NIL.

Re: @ DCBROWSE und die Möglichkeiten ?

Verfasst: Do, 21. Apr 2016 13:21
von xbaseklaus
Was mich jetzt stört , warum ist wenn ich ins DCsay/Get Feld klicke auf oTabPage2 der CURSOR so komisch ... d.h. ein schwarzes Rechteck hinter dem der Cursor blinkt
kann man das ändern das es so ist wie beim Clipper Code ? Ich hoffe es ist verständlich was ich meine.
Das hat sich erledigt , war nur der Einfügemodus ... keine Ahnung warum ich nicht gemerkt habe dass der an war :-(