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

Moderator: Moderatoren

Antworten
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

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

Beitrag 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...)
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
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:

Beitrag 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++".
Herzlich,
Tom
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von Wolfgang Ciriack »

Oder du setzt gleich einen Codeblock ein

FOOTER {|| MeineSumme }
Viele Grüße
Wolfgang
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:

Beitrag 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().
Herzlich,
Tom
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag 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.
Viele Grüße
Wolfgang
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:

Beitrag 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.
Herzlich,
Tom
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

Beitrag 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
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag 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?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
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

Beitrag 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
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag 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)...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
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

Beitrag 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
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag 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...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
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

Beitrag 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
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag 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.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Antworten