Seite 1 von 1

Express-ler: Ändern der Fußzeile einer Browse-Column?

Verfasst: Mi, 21. Jun 2006 17:52
von Markus Walter
Hi,

weiß jemand, wie man bei einem DCBROWSE nachträglich die Fußzeile ändern kann?

Die Fußzeile wird über

DCBROWSECOL ... FOOTER ...

erzeugt.


Hintergrund:
Ich nutze die Fußzeile um Summen anzuzeigen und ändere die Werte im Browser. Dann müsste ich auch die Summe in den Fußzeilen anpassen.

Hat jemand eine Idee? (Ohne das Browse neu zu erzeugen...)

Verfasst: Mi, 21. Jun 2006 18:05
von Tom

Code: Alles auswählen

DCBROWSECOL ... FOOTER " - " OBJECT oCol1

oCol1:footing:SetCell(1,"Text")
Edit: Ich habe den Thread in "3rd Party" verschoben, weil es um eXpress++ geht, aber die Methode zur Änderung einer Fußzeile funktioniert natürlich auch bei "plain Xbase++".

Verfasst: Mi, 21. Jun 2006 18:09
von Wolfgang Ciriack
Oder du setzt gleich einen Codeblock ein

FOOTER {|| MeineSumme }

Verfasst: Mi, 21. Jun 2006 18:11
von Tom
Hallo, Wolfgang.

Nach meinem Kenntnisstand unterstützt DCBROWSECOL bei Fußzeilen (noch) keine Codeblöcke (see Docs: FOOTER <cFooter>, nicht <cbFooter>). Sofern doch (bin jetzt zu faul zum Ausprobieren), genügt natürlich eine Änderung der Codeblockbedingungen und ein oBrowse:RefreshAll().

Verfasst: Mi, 21. Jun 2006 18:18
von Wolfgang Ciriack
Hallo Tom,
ich hab das lange auch nicht benutzt, dann mal ausprobiert und jetzt bei mir im Code so drin, funktioniert auch.

Verfasst: Mi, 21. Jun 2006 18:31
von Tom
Hallo, Wolfgang.

Anscheinend unterstützt FOOTER tatsächlich inzwischen Codeblöcke, aber es ist ein DC_GetRefresh(GetList) erforderlich, um die Anzeige zu aktualisieren. Das fällt mit meinem :footing:SetCell() natürlich weg.

Verfasst: Mi, 21. Jun 2006 18:58
von AUGE_OHR
hi,
Tom hat geschrieben:

Code: Alles auswählen

oCol1:footing:SetCell(1,"Text")
... aber die Methode zur Änderung einer Fußzeile funktioniert natürlich auch bei "plain Xbase++".
ja, aber dazu muss der "Footer" auch "eingeschaltet" werden mit
XBP_PP_COL_FA_CAPTION.

gruss by OHR
Jimmy

Verfasst: Fr, 23. Jun 2006 12:34
von Markus Walter
Hallo,

schon mal Danke für die Antworten...

FOOTER mit Codeblock geht ja wunderbar. Aber wie finde ich in dem Codeblock heraus, für welche Spalte der Footer-Block ausgeführt wird?

Nach meinem Verständnis, müsste der Codeblock als Parameter die "aktuelle" Spaltennummer bekommen. Ist aber nicht so...

Hintergrund ist, dass ich einen Array-Browser habe und ich in den Fußzeilen jeweils die Summe der Spalten anzeigen will. Der Daten-Array ändert sich allerdings bei manchen Events, so dass dann durch ein dc_getrefresh() der Browser neu aufgebaut wird und dann die Summen neu berechnet werden müssen.
Damit das funktioniert, müsste ich aber im Footer-Codeblock die Spalten-Nummer wissen...

Oder hat jemand eine andere Idee?

Verfasst: Fr, 23. Jun 2006 15:42
von AUGE_OHR
hi,
Markus Walter hat geschrieben: Damit das funktioniert, müsste ich aber im Footer-Codeblock die Spalten-Nummer wissen...

Code: Alles auswählen

nPos := ::browser:colpos
::Browse:getColumn(nPos):footing:inValidateRect()
::Browse:getColumn(nPos):footing:Setcell(1,STR(ntotal[1] ,11,2),,.T.)
gruss by OHR
Jimmy

Verfasst: Mo, 26. Jun 2006 10:54
von Markus Walter
Hallo Jimmy,

leider enthält :colpos die Spaltennummer, in der sich der Cursor befindet, nicht der Spalte, die gerade "aufgebaut" wird.

Ich habe eine Browse mit 20 Spalten, die jeweils numerische Werte haben, diese Werte ändern sich durch eine Combobox neben dem Browse. Immer dann müsste ich die Summen aus allen Spalten (Arrays) kalkulieren. Das klappt auch, aber im Footer-Codeblock (Express++), der auch pro Spalte einmal ausgeführt wird, müsste ich wissen, in welcher Spalte ich gerade bin, damit ich die richtigen Werte aus dem Array addieren kann.

colpos liefert aber leider die Spalte, in der der Cursor steht (immer 1)...

Verfasst: Mo, 26. Jun 2006 15:24
von AUGE_OHR
hi,
Markus Walter hat geschrieben: leider enthält :colpos die Spaltennummer, in der sich der Cursor befindet, nicht der Spalte, die gerade "aufgebaut" wird.
...
colpos liefert aber leider die Spalte, in der der Cursor steht (immer 1)...
hab kein Express++, aber das passiert eigendlich nur wenn du
XBPBRW_CURSOR_ROW hast.

gruss by OHR
Jimmy

Verfasst: Mo, 26. Jun 2006 15:52
von Markus Walter
Hi,

ich glaube wir reden aneinander vorbei...

Aus der Xbase-Dokumentation:
Die Instanzvariable :colPos enthält einen numerischen Wert. Er entspricht der Ordinalposition der Spalte, in der sich der Cursor gerade befindet.
Der Curso befindet sich in meinem Falle ja in der ersten Spalte. Dann ändere ich die Datengrundlage (Array) und führe ein refresh durch. Dadurch werden alle Spalten neu aufgebaut (und auch die benötigten Footer-Codeblöcke ausgeführt). Aber der Cursor steht halt immer noch in der 1 Spalte und folgerichtig gibt :colpos immer 1 zurück...

Ich habe jetzt eine Lösung erarbeitet, aber nun habe ich das Problem mit der Zählerübergabe an Codeblöcke...

Verfasst: Mo, 26. Jun 2006 20:23
von AUGE_OHR
hi,
Markus Walter hat geschrieben:Hi,
Der Curso befindet sich in meinem Falle ja in der ersten Spalte. Dann ändere ich die Datengrundlage (Array) und führe ein refresh durch. Dadurch werden alle Spalten neu aufgebaut (und auch die benötigten Footer-Codeblöcke ausgeführt). Aber der Cursor steht halt immer noch in der 1 Spalte und folgerichtig gibt :colpos immer 1 zurück...
aha ... klar 1=1 ...aber wenn du im Array arbeitetes hast du doch die
"Koordinaten" eines "2-Dim" Array ?
Ich habe jetzt eine Lösung erarbeitet, aber nun habe ich das Problem mit der Zählerübergabe an Codeblöcke...
kannst auch den :cargo slot benutzten um dort was abzulegen was bei
einem "refresh" EVALuiert wird.

gruss by OHR
Jimmy

Verfasst: Di, 27. Jun 2006 14:36
von Markus Walter
Hi Jimmy,

ich hatte ja von Anfang an eine Lösung im Auge. Ich erzeuge die Spalten in einer Schleife und brauchte ja nur die Schleifenvariable im Footer-Codeblock. Aber da begann das Problem: Der Codeblock merkt sich die Referenz zur Schleifenvariablen, greift aber erst bei der Ausführung darauf zu. Dann ist diese Variable aber bereits hochgezählt...

Mein Code war:

Code: Alles auswählen

for i := 1 to 10
  aadd(aBlocks, {|| MyFunction(i) })
next
In diesem Falle war i bei der Ausführung aller Codeblöcke gleich, nämlich 11.

Andreas und Martin haben mich dann auf den richtigen Weg gebracht:

Code: Alles auswählen

aadd(aBlocks, &"{|| MyFunction("+str(i)+") }") 
Somit ist mein Problem gelöst und die Footer-Codeblöcke arbeiten jetzt wie gewünscht...

Danke nochmal für die Mühe.