@ DCBROWSE und die Möglichkeiten ?

Moderator: Moderatoren

Antworten
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

@ DCBROWSE und die Möglichkeiten ?

Beitrag 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
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: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
gruss by OHR
Jimmy
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: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
gruss by OHR
Jimmy
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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 !
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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 ?
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: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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 ;
Viele Grüße
Wolfgang
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag von xbaseklaus »

Ok , wenn ich die aktuelle Zeile farbig will geht das am besten mit:

Code: Alles auswählen

CURSORMODE (XBPBRW_CURSOR_ROW)
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag von Manfred »

das nimmt Dir aber die Möglichkeit später evtl. einzelne Felder zu editieren.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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 ...

???
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 und die Möglichkeiten ?

Beitrag 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.
Herzlich,
Tom
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
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 und die Möglichkeiten ?

Beitrag 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.
Herzlich,
Tom
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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
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 und die Möglichkeiten ?

Beitrag 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.
Herzlich,
Tom
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: @ DCBROWSE und die Möglichkeiten ?

Beitrag 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 :-(
Antworten