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 ....
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:
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:
und umgekehrt auf Tab1, dass Daten gespeichert werden, falls vorher das Bearbeiten aktiviert war:
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.
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:
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