Mehrere Zeilen in TBrowse einfärben

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
monokeros
Rookie
Rookie
Beiträge: 7
Registriert: Fr, 12. Nov 2021 15:34
Hat sich bedankt: 3 Mal

Mehrere Zeilen in TBrowse einfärben

Beitrag 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.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Mehrere Zeilen in TBrowse einfärben

Beitrag 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ß!
es grüßt

Werner

<when the music is over, turn off the lights!>
monokeros
Rookie
Rookie
Beiträge: 7
Registriert: Fr, 12. Nov 2021 15:34
Hat sich bedankt: 3 Mal

Re: Mehrere Zeilen in TBrowse einfärben

Beitrag 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.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Mehrere Zeilen in TBrowse einfärben

Beitrag 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.
es grüßt

Werner

<when the music is over, turn off the lights!>
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: Mehrere Zeilen in TBrowse einfärben

Beitrag 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
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Mehrere Zeilen in TBrowse einfärben

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: Mehrere Zeilen in TBrowse einfärben

Beitrag 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
gruss by OHR
Jimmy
monokeros
Rookie
Rookie
Beiträge: 7
Registriert: Fr, 12. Nov 2021 15:34
Hat sich bedankt: 3 Mal

Re: Mehrere Zeilen in TBrowse einfärben

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