Seite 1 von 1

Mehrere Zeilen in TBrowse einfärben

Verfasst: Fr, 12. Nov 2021 16:04
von monokeros
Hallo Zusammen,
ich hab mich nun heute neu hier im Forum angemeldet und hoffe Hilfe zu finden.
Kurz zu mir: Meine Name ist Luca, anfang 20 und aboslviere momentan mein 6-monatiges Praktikum im Rahmen meines Informatiksutdiums.
Bisher entwickelte ich hauptsächlich in Java und etwas im Webdev-Bereich (HTML, PHP, JS)
Seit Oktober nun in XBase++

Ziel
Ich möchte in einer Tabelle mit der Leertaste Zeilen farblich markieren und mit einer weiteren Taste die enthaltenen Informationen weitervararbeiten (in einer anderen Tabelle).
Logik
Beim drücken der Leertaste wird die RecNo Position und die TBrowse:Row in einem 2 Dimensionalen Array gespeichert.
Ich fange auch die Fälle ab, falls der Nutzer das fällt wieder abwählt in dem er das zweite mal Leertaste drückt und die gleiche Position ein zweites mal im Array landen würde.
Bei jedem Neuaufruf der so genannten tableViewControll, mit Hilfe desser ich mich über die Tabelle bewegen kann und wo auch die Leertasteeingabe abgefangen wird, wird dann das Array durchgegangen und eintsprechenden Zeilen Farblich markiert.
Problem
Soweit so gut, oder? :D Nein! Es färben sich zwar alle markierten Zeilen, aber nur wenn der Cursor 2 Felder entfernt ist. Wenn das zweite mal die Pfeil auf/ab oder Bild auf/ab Taste in die gleiche richtung gedrück wird, wird die gewünschte Zeile eingefärbt. Mein Kollege welcher auch mit Hilfe des Forums das TBrowse und vor allem auch das einfärben erstellte, verwies mich hier mein Glük zu Versuchen.
Ich würde auch noch ein kleines Video zur verdeutlichung hochladen, zur Verdeutlichung.

Anbei die Programmabschnitte die ich fürs erste als wichtig erachte:

Code: Alles auswählen

FUNCTION tableViewDefaultControl(oTBrowse, nKey, mark, array) //mark := .T. wenn per space zeilen markiert werden sollen
LOCAL lAction := .F., currentRec
	IF mark == NIL
		mark := .F.
	ELSEIF mark == .T.
		FOR m := 2 To Len(marked)
			IF marked[m][2] != -1
			oTBrowse:colorRect( {marked[m][2], 1, marked[m][2], oTBrowse:colCount}, {3, 2} )	
			ENDIF
		NEXT
	
	ENDIF
	//Beispielhaft K_UP
	CASE nKey == K_UP		//Pfeil nach oben
			oTBrowse:colorRect( {oTBrowse:rowpos, 1, oTBrowse:rowpos, oTBrowse:colCount}, {1, 2} )
            oTBrowse:HILITE()				//Browser Cursor wird hervorgehoben
            oTBrowse:REFRESHCURRENT()	//aktuelle Datenzeile neu anzeigen
            oTBrowse:up()					//Browser-Cursor um eine Zeile nach oben bewegen
            lAction := .T.
         //Space
         CASE nKey == 32
            	IF mark == .T.
			currentRec := RecNo()
			AAdd(marked, {currentRec,oTBrowse:rowpos})
		ENDIF
		lAction := .T.

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: Fr, 12. Nov 2021 16:59
von Werner_Bayern
Servus,

willkommen in der Welt von Xbase++ :)

Muss es grade Tbrowse sein, das ist uralt und für den DOS- bzw. Konsolemodus gemacht. Mit sowas arbeitet doch keiner mehr seit 20 Jahren 8)

Schau mal in der Hilfe unter XbpBrowse, da hast alle Möglichkeiten, auch mit einfärben. Da gibt's auch 2 Beispiele und noch ein gutes Beispiel: GuiBrowse(). Einfach in der Workbench unter Hilfe / Desktop-Beispiele und dann im Ordner source\samples\Basics\guibrow

Viel Spaß!

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: Fr, 12. Nov 2021 19:02
von monokeros
Danke für die Antwort.
Im ganzen Programm ist TBrowse implementiert. An sich bin ich damit auch sehr zufrieden gewesen...
Wenns keine Lösung mit TBrowse gibt, wirds halt leider nicht "schön" werden, dann werde ich die jeweilige ausgewählte Zeile mit einem Zeichen davor markieren.
Mir wurde gesagt wenns darum geht auch eigene Methoden zu implementieren etc sei TBrowse das beste und wie gesagt ist es eben schon komplett implementiert.

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: Fr, 12. Nov 2021 23:13
von Werner_Bayern
Servus,

also Du bist Anfang 20, studierst Informatik und man sagt Dir, Tbrowse sei das Mittel der Wahl, wenn man eigene Methoden implementieren möchte? Geht's hier tatsächlich um die Erstellung von Software im Stile der frühen 90iger?

Interessanter Ansatz... :shock:

Sorry, bei Tbrowse kann ich Dir nicht helfen, da müssen die Konsole-Experten her.

Viel Erfolg.

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: Sa, 13. Nov 2021 0:03
von AUGE_OHR
hi,
monokeros hat geschrieben: Fr, 12. Nov 2021 16:04 Logik
Beim drücken der Leertaste wird die RecNo Position und die TBrowse:Row in einem 2 Dimensionalen Array gespeichert.
ist schon eine Zeit lang her das ich mit TBrowse in "Console" Form gearbeitet habe

wenn ich mich nicht irre hab ich so was auch mal gemacht aber das "Array" war "gleich gross"
Das Array wurde als "Column" aufgenommen und "ausgewertet" ( wenn STABLE )

das Array hatte ich am Anfang noch mit einem "X" versehen aber bin dann auf eine "Farbe" gegangen
wenn das Element nicht leer ist wird die entsprechende Farbe verwendet

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: Sa, 13. Nov 2021 10:19
von georg
Hallo,


also, es gibt da verschiedene Möglichkeiten, wie man das machen kann. Zumindest bilde ich mir ein, dass ich das vor vielen, vielen Jahren gemacht habe.

Du solltest Dir in der Dokumentation mal unter Klassen -> TBrowse die Instanzvariable colorSpec ansehen, und den dort vorhandenen Verweisen folgen.

Du musst aber auch berücksichtigen, dass TBrowse eine Klasse ist, die aus Gründen der Rückwärtskompatibilität in der Sprache noch unterstützt wird. Ich vermute mal, dass die meisten Programmierer inzwischen auf XbpBrowse() umgestellt haben.

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: Sa, 13. Nov 2021 11:49
von AUGE_OHR
hi,

ich habe mal in den alten Sachen "gekramt" und das gefunden : o:ColorBlock

ich habe meine TBROWSE von der "Definition" als Array aufgebaut

Code: Alles auswählen

LOCAL aABZU := { { "ABZUREF", "Ref", 9, "", "" }, ;
                 { "ABZUMODUS", "Mod", 3, "IF(ABZU->ABZUMODUS='AUS' ,{4,2},{6,2})", "" }, ;
                 ...
                 { "ABZULIEFNR", "Liefnr", 5, "", "" } }
#IFDEF __XPP__
   oTBrowse:colorSpec := "N/W,W+/R,GR+/B,W+*/R,G+/B,W+/G+,W+/RB"
#ELSE
   oTBrowse:colorSpec := "W+/B,W+/R,GR+/B,W+*/R,G+/B,W+/G+"
#ENDIF
wie du siehst habe ich o:colorSpec erweitert.

das Array wird nun so verarbeitet

Code: Alles auswählen

   FOR i := 1 TO imax
      oCol := TBCOLUMNNEW( aABZU[ i, 2 ], &( "{||" + aABZU[ i, 1 ] + "}" ) )
      oCol:width := aABZU[ i, 3 ]
      // COLORBLOCK 
      IF EMPTY( aABZU[ i, 4 ] )
      ELSE
         oCol:COLORBLOCK := &( "{|x|" + aABZU[ i, 4 ] + "}" )
      ENDIF
      // FOOTER
      IF EMPTY( aABZU[ i, 5 ] )
      ELSE
         bblock := &( "{||" + aABZU[ i, 5 ] + "}" )
         oCol:FOOTING := EVAL( bblock )
      ENDIF
      oTBrowse:addColumn( oCol )
   NEXT
es wird, als 4th. Element, die "Bedingung" für COLORBLOCK gesetzt z.b.

Code: Alles auswählen

   "IF(ABZU->ABZUMODUS='AUS' ,{4,2},{6,2})"
nun geht auch

Code: Alles auswählen

   "IF(ASCAN(aMarked,{|e| e[1] = ABZU->( RECNO() ) > 0, {4,2},{6,2})" 
damit solltest du eine "stabile" Darstellung bekommen

Code: Alles auswählen

      nKey := 0
      DISPBEGIN()
      DO WHILE ( nKey := INKEY() ) == 0                               // .AND. !oTBrowse:stabilize()
         IF oTBrowse:stabilize()
            EXIT
         ENDIF
      ENDDO
      DISPEND()

      IF oTBrowse:stable
         IF oTBrowse:hitTop .OR. oTBrowse:hitBottom
            TONE( 125, 0 )
         ENDIF
         nKey := TB_INKEY( 300 )                                      // max 300 sec
      ENDIF

      DO CASE
have fun

Re: Mehrere Zeilen in TBrowse einfärben

Verfasst: So, 14. Nov 2021 5:00
von monokeros
Danke für eure Antworten und Hinweise! Ich werde mal sehen was sich umsetzen lässt, scheinbar weiß niemand direkt woher der "Fehler" herkommt. Ich werde der Doku mal nachgehen und die colorSpec mir anschauen. Vielleicht liefert das ja neue Erkenntnisse und danach das ganze ausprobieren anhand von AUGE_OHRs Beispiel.

Danke für die Beispiele @AUGE_OHR

Wie ursprünglich angekündigt, anbei ein Link zu einem Video welches das Problem veranschaulicht (Entschuldigt die Qualität, die Windows Aufnahmen wollte nicht so recht, darum der simple Weg per Smartphone).
Ich hoffe das ist in Ordnung so: https://streamable.com/jqmg78