XbpBrowse(), Header-Bereich und OwnerDrawing

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
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

XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von georg »

Hallo,


derzeit programmiere ich an einer Anwendung, die in der Stammdatenverwaltung ein (modifiziertes) XbpBrowse() anzeigt und durch Klick auf den Spaltenkopf den Browse neu nach dieser Spalte sortiert (unter Verwendung von MySQL). Klappt hervorragend.

Problem: die Browse-Anzeige bleibt unverändert, so dass nicht auf Anhieb erkennbar ist, nach welcher Spalte nun sortiert ist.

Ich habe dann zu Tom's Beispielen aus dem Hennies zu dem Thema gegriffen und folgende Methode geschrieben:

Code: Alles auswählen

METHOD MaintenanceModule:CustomDrawCell(oPS, aInfo, aSortOrder)
   Local aPP
   Local nAlign, nFound
   Local oArea, oCol
   Local xData

   oArea := aInfo[XBP_DRAWINFO_AREA]
   xData := oArea:GetCell(1)
   IF oArea:setParent():heading == oArea
      oCol := aInfo[6]
      IF oCol:lSortedBy .OR. oCol:SQLColLink == aSortOrder[1]
         nAlign := XBPALIGN_VCENTER+XBPALIGN_HCENTER
         aPP := oArea:SetParent():SetPresParam()
         nFound := AScan(aPP,{|a|Valtype(a[1])=='N' .AND. a[1]==XBP_PP_COL_DA_CELLALIGNMENT } )
         IF nFound > 0 .and. aPP[nFound,2] <> nil
            nAlign := aPP[nFound,2]
         ENDIF
         GraCaptionStr(oPS, aInfo[XBP_DRAWINFO_RECT],;
            {aInfo[XBP_DRAWINFO_RECT, 3], aInfo[XBP_DRAWINFO_RECT, 4]},;
            xData, nAlign)
         RETU(.F.)
      ENDIF
      RETU(.T.)
   ENDIF
RETURN (.T.)
Wenn jemand für den einen oder anderen Punkt eine elegantere Lösung hat, bin ich ganz neugierig.

Über oArea:setParent():heading versuche ich, festzustellen, ob gerade der Header-Bereich (Spaltenüberschrift) zur Bearbeitung ansteht. Alles andere interessiert mich nicht und wird mit RETU(.T.) vom System gezeichnet.

oCol:lsortedBy ist eine von mir in der abgeleiteten Klasse definierte iVar, die gesetzt ist, wenn nach der betreffenden Spalte sortiert wird. Bei der ersten Anzeige ist dies der primary key.

Aktuell funktioniert es (fast). Die Spaltenüberschrift, nach der sortiert wird, erscheint nämlich nicht. Beim ersten Aufruf wäre das "Artikelnummer", der Spaltenkopf ist leer. Klicke ich auf "Bezeichnung 1", erscheint "Artikelnummer" wieder als Spaltenkopf der ersten Spalte, und in der zweiten Spalte verschwindet "Bezeichnung 1".

Nun bin ich ein wenig verwirrt, vorsichtig formuliert.
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: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von AUGE_OHR »

georg hat geschrieben:Problem: die Browse-Anzeige bleibt unverändert, so dass nicht auf Anhieb erkennbar ist, nach welcher Spalte nun sortiert ist.
Ownerdraw ist eine Möglichkeit.
ich verwenden einen anderen visual Style für den Browse Header :

Code: Alles auswählen

         oCol := := ::AddColumn( ...) 
         oCol:heading:styleClass := "Header"
         oCol:heading:stylePart  := 1
         oCol:Configure()
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von brandelh »

In der Prof Sub gibt es ein Beispiel Sorted QuickBrowse wo sie auch nach Spalte sortieren.
Die verwenden kleine Pfeile ( nix = unsortiert, auf- oder absteigend) am Ende der Spalte, wobei man je nach Zeichensatz eventuell auch solche Pfeile findet und vor den eigentlichen Text setzen könnte.
Andere verwenden FETT als Markierung für die sortierte Spalte (auf oder ab sieht man ja sofort)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von Jan »

Ich mach das ähnlich. Ich setze einfach ein > hinter die Spaltenüberschrift, aber nur 1 Leerzeichen dazwischen, nicht am rechten Spaltenrand.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige 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: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Die verwenden kleine Pfeile ( nix = unsortiert, auf- oder absteigend)
naja ... die 3 BMP Files sind schon ziemlich "old Style" ...

btw. "auf- oder absteigend" : wie ändert man das bei einem Index zu Laufzeit ?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von brandelh »

AUGE_OHR hat geschrieben:
brandelh hat geschrieben:Die verwenden kleine Pfeile ( nix = unsortiert, auf- oder absteigend)
naja ... die 3 BMP Files sind schon ziemlich "old Style" ...

btw. "auf- oder absteigend" : wie ändert man das bei einem Index zu Laufzeit ?
Ich puffere meine Browses immer im Array zwischen, dann ist das kein Problem ;-)
Gruß
Hubert
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: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von georg »

Guten Morgen,


also, ich spiele gerade mit den Visual Styles herum. Eine Übersicht findet sich hier: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Bei MySQL (und Konsorten) ist ja kein Index erforderlich, da geht es "on the fly" ("Auf der Fliege" :D) durch Anhängen von DESC an die ORDER Clause. Und bei einer DBF braucht man nur die Befehle umzukehren: dbGoBottom() anstelle dbGoTop(), dbSkip(-1) anstelle dbSkip(1).
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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von Tom »

Hallo, Georg.

Mmmh. Aber das Ownerdrawing-Attribut für das Heading ist gesetzt, ja? Was ist mit Darstellungsfarben? Ändert sich das Verhalten, wenn Du im Moment des Zeichnens oPS:SetColor(GRA_CLR_RED) oder so einfügst? Der Code sieht ansonsten richtig aus.
Herzlich,
Tom
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: XbpBrowse(), Header-Bereich und OwnerDrawing

Beitrag von georg »

Hallo, Tom -


drawMode ist gesetzt für das XbpBrowse- sowie die XbpColumn-Objekte (nicht für den Heading-Bereich). Und jetzt klappt es? Irgendwie erstaunlich, ich werde mir das in den kommenden Tagen mal in Ruhe anschauen müssen.

Nachtrag: es lag wohl am oPS:setColor(), denn ohne diese Anweisung ist alles weiss auf weiss (oder grau auf grau). Oder, um genau zu sein. oPS:setColor() liefert {XBPSYSCLR_DIALOGBACKGROUND, GRA_CLR_WHITE} zurück.

Auf jeden Fall habe ich jetzt zwei Ansätze, wie ich die Sache darstellen kann.

"Vielen Dank" in die Runde!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten