OwnerDrawing und graue Haare

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

OwnerDrawing und graue Haare

Beitrag von georg »

Hallo,


derzeit arbeite ich an einem kleine XbpBrowse, in dem Abstimmzahlen dargestellt werden. Weichen diese ab, sollen die entsprechenden Zellen farblich anders dargestellt werden.

Ich habe mal das Beispiel3 von Tom aus dem vorvergangenen Jahr verwendet. Das Beispiel selbst läuft auf meinem Rechner einwandfrei, nur die Übertragung auf meinen XbpBrowse funktioniert nicht ...

Code: Alles auswählen

   oCol                         := oBro:addColumn({|| aData[nPointer, 3]},  5, "FTE (D)")
   oCol:ColorBlock              := {|x| {MyGetColor(x, 2, oBro),GRA_CLR_WHITE}}
   oCol:DataArea:DrawMode       := XBP_DRAW_OWNER
   oCol:DataArea:CustomDrawCell := {|oPs,aInfo,oArea| PaintCellWithForeGround(oPs, aInfo, oArea, aData)}
Also, der :ColorBlock wird ausgeführt, zeigt aber keine Wirkung?

:CusstomDrawCell wird überhaupt nicht ausgeführt?! Zur Überprüfung habe ich hinter die LOCAL Deklaration ein ConfirmBox() gesetzt, das aber nicht ausgeführt wird.

Langsam färben sich meine grauen Haare noch einen Ton grauer. Hat irgendjemand einen Vorschlag/Hinweis, was ich übersehen haben könnte?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von Tom »

Ist Dein Browse auch von der entsprechenden Klasse (im Beispiel "XbpBrowseCustom") abgeleitet?

Ansonsten - Du müsstest schon ein bisschen mehr Code zeigen.

Ach so: Der DrawMode sollte auch für das gesamte Browse auf XBP_DRAW_OWNER gesetzt sein.
Herzlich,
Tom
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OwnerDrawing und graue Haare

Beitrag von georg »

Hallo, Tom -


im Beispiel 3 verwendest Du den Standard XbpBrowse() (gerade noch einmal nachgesehen).

Mehr Code? Gerne:

Code: Alles auswählen

STATIC FUNCTION ShowCheckResultDialog(oDlg, aData)  // oDlg ist die :drawingArea eines XbpDialog()
   Local aBaseSize, aPos, aSize, aPres, aColPres
   Local nI
   Local oBro, oXbp, oCol

   oDlg:clipChildren := .T.

   nMaxPoint := Len(aData)
   nPointer  := 1

   aBaseSize := oDlg:currentSize()
   aPos := {10, 50}
   aSize := AClone(aBaseSize)
   FOR nI := 1 TO 2
      aSize[nI] -= aPos[nI] * 2
   NEXT

   // aus Beispiel 3 übernommen
   aPres := {;
      {XBP_PP_COL_DA_ROWHEIGHT,       15}, ;
      {XBP_PP_COL_DA_CELLHEIGHT,      15}, ;
      {XBP_PP_COL_DA_ROWSEPARATOR,    IF(IsThemeActive(), XBPCOL_SEP_LINE, XBPCOL_SEP_NONE)},;
      {XBP_PP_COL_DA_COLSEPARATOR,    IF(IsThemeActive(), XBPCOL_SEP_LINE, XBPCOL_SEP_NONE)},;
      {XBP_PP_HILITE_BGCLR,           GraMakeRGBColor({136, 170, 214})},;
      {XBP_PP_HILITE_FGCLR,           GraMakeRGBColor({255, 102, 51})},;
      {XBP_PP_COL_DA_CELLFRAMELAYOUT, XBPFRAME_BOX + XBPFRAME_RECESSED },;
      {XBP_PP_COL_FA_FRAMELAYOUT,     XBPFRAME_BOX + XBPFRAME_RECESSED },;
      {XBP_PP_COL_DA_FRAMELAYOUT,     XBPFRAME_NONE },;
      {XBP_PP_COL_DA_FGCLR,           GRA_CLR_BLACK},;
      {XBP_PP_COL_DA_BGCLR,           GRA_CLR_WHITE};
      }

   aColPres := aClone(aPres)
   aAdd(aPres,    {XBP_PP_COL_DA_CELLALIGNMENT, XBPALIGN_LEFT + XBPALIGN_VCENTER})
   aAdd(aColPres, {XBP_PP_COL_DA_CELLALIGNMENT, XBPALIGN_LEFT + XBPALIGN_VCENTER})

   oBro := XbpBrowse():new(oDlg, oDlg, aPos, aSize)
   // more configurations
   oBro:UseVisualStyle := .T.
   oBro:SkipBlock      := {|nSkip,oBro| DoSkip(nSkip,oBro) }
   oBro:GoBottomBlock  := {||           nPointer := Len(aData) }
   oBro:GoTopBlock     := {|| nPointer := 1 }
   oBro:PosBlock       := {|| nPointer }
   oBro:PhyPosBlock    := {|| nPointer }
   oBro:LastPosBlock   := {|| Len(aData) }
   oBro:FirstPosBlock  := {|| 1 }
   oBro:CursorMode     := XBPBRW_CURSOR_ROW
   oBro:tabStop        := .T.
   oBro:setPresParam(aPres)
   oBro:create()

   oCol := oBro:addColumn({|| aData[nPointer, 1]}, 10, "Company")
   oCol:Configure(, , , , aColPres, .T.)

   // now we add numeric colums which need to be right adjusted:
   ASize(aColPres, Len(aColPres) - 1)
   AAdd(aColPres,  {XBP_PP_COL_DA_CELLALIGNMENT, XBPALIGN_RIGHT + XBPALIGN_VCENTER})
   AAdd(aColPres,  {XBP_PP_COL_HA_ALIGNMENT, XBPALIGN_RIGHT + XBPALIGN_VCENTER})

   oCol                         := oBro:addColumn({|| aData[nPointer, 2]},  5, "FTE (I)")
   oCol:Configure(, , , , aColPres, .T.)
   oCol                         := oBro:addColumn({|| aData[nPointer, 3]},  5, "FTE (D)")
   oCol:ColorBlock              := {|x| {MyGetColor(x, 2, oBro), GRA_CLR_WHITE}}
   oCol:DataArea:DrawMode       := XBP_DRAW_OWNER
   oCol:DataArea:CustomDrawCell := {|oPs,aInfo,oArea| PaintCellWithForeGround(oPs, aInfo, oArea, aData)}
   oCol:Configure(, , , , aColPres, .T.)

   oBro:show()

   aPos          := {10, 10}
   aSize         := {120, 20}
   oXbp          := XbpPushButton():new(oDlg, oDlg, aPos, aSize)
   oXbp:tabStop  := .T.
   oXbp:caption  := "OK"
   oXbp:activate := {|uNil1, uNil2, self| PostAppEvent(xbeP_Close)}
   oXbp:create()

RETURN (.T.)

STATIC FUNCTION MyGetColor(x, nPosition, oBro)
   Local nCompare

   nCompare := oBro:getcolumn(nPosition):getData()  // Vergleichswert aus vorheriger Spalte
   DO CASE
      CASE x = nCompare              // bei Übereinstimmung SCHWARZ
         RETURN GRA_CLR_BLACK
   ENDCASE
RETURN GRA_CLR_RED               // bei Abweichung ROT

PaintCellWithForeGround() entspricht dem aus Deinem Beispiel.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von Tom »

Hallo, Georg.

Ich spiele das morgen mal durch. Auf den ersten Blick sieht's richtig aus. Und meine Anmerkungen aus der ersten Antwort waren Unsinn. Wetterbedingt. :wink:
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: OwnerDrawing und graue Haare

Beitrag von AUGE_OHR »

georg hat geschrieben:

Code: Alles auswählen

   oCol:Configure(, , , , aColPres, .T.)
*   oCol:Configure(, , , , aColPres, .T.) // zuviel
*   oCol:Configure(, , , , aColPres, .T.) // zuviel
:CusstomDrawCell wird überhaupt nicht ausgeführt?! Zur Überprüfung habe ich hinter die LOCAL Deklaration ein ConfirmBox() gesetzt, das aber nicht ausgeführt wird.
ein o:Configure() sollte nur 1 MAL ausgeführt werden.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OwnerDrawing und graue Haare

Beitrag von georg »

Guten Morgen, Jimmy -


meines Wissen muss ich je Instanz das :configure() einmal ausführen. Nach dem ersten :configure() in meinem Beispiel erstelle ich eine neue Instanz mittels :new(), die dann ebenfalls ein :configure() durchlaufen muss. Oder?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von UliTs »

Hallo Georg,

ja, so wie Du ::AddColumn() benutzt, wird dabei eine neue Instanz erstellt.
Allerdings musst Du deswegen nicht unbedingt ::configure() aufrufen. Es seid denn, Du möchtest Initialisierungsparameter ändern, was Du ja auch -meine ich- machst.

Ich habe leider momentan noch zu wenig Zeit. Ansonsten würde ich mich gern schon jetzt damit mehr beschäftigen :-) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OwnerDrawing und graue Haare

Beitrag von georg »

Hallo, Uli -


wie schon geschrieben, beziehe ich mich auf Tom's Beispiel vor zwei Jahren.

Er verwendet :addColumn(), um die Spalte zu erzeugen. Parameter wie die Spaltenüberschrift und die -breite lassen sich auf dem Weg einfacher definieren, da Du bei einem XbpColumn():new() jedesmal die Presentation-Parameter anpassen musst, in denen diese Angaben hinterlegt sind. (Faul, aber effizient.)

Da Du über :addColumn() keine Presentation-Paramter mitgeben kannst, folgt später ein :configure(), um das "nachzuholen".

So zumindest habe ich Tom's Vorgehensweise interpretiert.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von UliTs »

Hallo Georg,

ich hatte nur erklären wollen, warum in Deinem (oder Tom's) Fall sehr wohl das configure() richtig und nötig ist. :)

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OwnerDrawing und graue Haare

Beitrag von georg »

Hallo,


also, inzwischen habe ich mein Ziel erreicht, bin aber nicht zufrieden ...

Rechner: Windows 7 32bit, Aero aktiviert, d.h. IsThemeActive() gibt .T. zurück.

Erst einmal habe ich aus dem Code ein kleines Test-Programm gebaut und es in einem neuen Verzeichnis (ohne manifest-Datei) laufen lassen. Da funktionierte dann der :colorBlock.

Aktivierte Themes, Manifest-Datei und :useVisualStyle = .T. => :colorBlock wird ignoriert;
Aktivierte Themes, Manifest-Datei und :useVisualStyle = .F. => :colorBlock wird ausgeführt.

Damit bin ich jetzt in der Lage, Abweichungen in den Zellen durch eine andere Farbe darzustellen, und da wollte ich eigentlich hin. Warum die Einstellung :drawMode ignoriert wird, das habe ich noch nicht herausgekriegt, und da würde ich gerne klüger werden.
Zuletzt geändert von georg am Mi, 17. Jul 2013 19:42, insgesamt 1-mal geändert.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von brandelh »

georg hat geschrieben: Aktivierte Themes, Manifest-Datei und :useVisualStyle = .T. => :colorBlock wird ignoriert;
Aktivierte Themes, Manifest-Datei und :useVisualStyle = .T. => :colorBlock wird ausgeführt.
sind die Zeilen nicht gleich ?
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von Wolfgang Ciriack »

Ich verstehe nicht, warum man für eine andere Farbdarstellung von Zahlen OwnerDrawing verwendet.
Hast du denn in einer Cell mehrere Zahlen ?
Ich habe gerade einen Monats-/Wochen-/Tages-Kalender mit Terminen erstellt, dort habe ich mehrere "Zeilen" in einer Cell und auch unterschiedliche Fonts,Farben,Icons und Ausrichtungen pro Cell, das bekommt man nur mit OwnerDrawing hin.
Bei einem normalen Browse reicht doch der Colorblock ?
Viele Grüße
Wolfgang
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OwnerDrawing und graue Haare

Beitrag von georg »

Hallo,


@Hubert - ja, Deine Beobachtung ist korrekt, ich habe mich vertappt. In der zweiten Zeile muss es .F. heissen, ist korrigiert.

@Wolfgang - ja, auch Deine Beobachtung ist richtig, da ich allerdings extrem selten mit andersfarbigen Zellen arbeite, war mein erster Gedanke "OwnerDrawing". Allerdings verwendete Toms Beispiel auch den :colorBlock, und mit dem habe ich es hinbekommen. Hoffentlich vergesse ich das nicht bis zum nächsten so gelagerten Problem.

Trotzdem bleibt die Frage, warum das OwnerDrawing nicht funktioniert?
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: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: OwnerDrawing und graue Haare

Beitrag von AUGE_OHR »

georg hat geschrieben:Trotzdem bleibt die Frage, warum das OwnerDrawing nicht funktioniert?
ich hätte nicht geantwortet wenn ich "dein" Beispiel nicht zum laufen gebracht hätte : du hast "zu viele o:Configure()"

wie auch Tom verwendest du ja die "Kurzfassung"

Code: Alles auswählen

oCol := oBro:addColumn({|| ... } )
was dir ein XbpColumne Object gibt.
danach setzt du dann die Property

Code: Alles auswählen

   oCol:DataArea:DrawMode       := XBP_DRAW_OWNER
   oCol:DataArea:CustomDrawCell := {|oPs,aInfo,oArea| PaintCellWithForeGround(oPs, aInfo, oArea, aData)}
und dann machst du ein "reset" (nur Presentation Parameter und keine Propertys) mit

Code: Alles auswählen

   oCol:Configure(, , , , aColPres, .T.)
Wenn du in Tom´s Beispiel ein o:configure() anhängen/setzten würdest funktioniert auch da Ownerdraw nicht mehr.

ich persönlich würde "echte" XbpColumn() verwenden

Code: Alles auswählen

LOCAL aPP := { {XBP_PP_COL_HA_CAPTION, "" }, ;
               {XBP_PP_COL_DA_CHARWIDTH, 1 }, ;
               ...

FOR i := 1 TO LEN( MyArray )
   aPP[ 1, 2 ] := MyArray[ i, 1 ]                      // Header
   aPP[ 2, 2 ] := MyArray[ i, 2 ]                      // Zeichen breite 
   aPP[ x, 2 ] := andere_Presentation_Parameter
   ...
   oColumn := XBPCOLUMN() :new(oBrowse,,,, aPP) // hier Presentation Parameter
   oColumn:dataLink := {|| ...})
   oColumn:colorBlock := {|| ...})
   ...
   // set styleClass / stylePart
   oColumn:heading:styleClass := "Header"
   oColumn:heading:stylePart  := 1
   ... 
   // Ownerdraw :dataArea -> XbpCellGroup()
   oColumn:dataArea:DrawMode       := XBP_DRAW_OWNER
   oColumn:dataArea:CustomDrawCell := {|oPs,aInfo,oSelf| MyDraw(oPs,aInfo,oSelf) }

   oColumn:create()
   oBrowse:addColumn( oColumn )
NEXT
btw. ähnliches gilt für XBP_PP_COMPOUNDNAME vs. XBP_PP_FONT
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OwnerDrawing und graue Haare

Beitrag von georg »

Hallo, Jimmy -


ich werde es gleich im Büro mal ausprobieren.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von Tom »

Ich verstehe nicht, warum man für eine andere Farbdarstellung von Zahlen OwnerDrawing verwendet.
Weil Xbase++ 1.9 SL1 mit visuellen Stilen und aktiven Themes in dieser Variante keine Farbdarstellungen unterstützt.
Herzlich,
Tom
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: OwnerDrawing und graue Haare

Beitrag von Wolfgang Ciriack »

Gilt doch aber nur für Hintergrundfarben, oder ?
Viele Grüße
Wolfgang
Antworten