Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

Tach,

express++ ist ja reines xbase++. Also sollte doch auch die Möglichkeit bestehen den Header einer Spalte neu zu setzen.
Für mehrzeilige Header

Code: Alles auswählen

oBrowse:getColumn(oBrowse:colpos):heading:setCell(1,"")
oBrowse:getColumn(oBrowse:colpos):heading:setCell(2,"")
Das klappt auch so, leider nur bis zum nächsten Refresh, dann wird der alte Wert wieder hervorgezaubert. Also habe ich mir das einmal im Debugger angesehen und dort die Bezeichnung :headercaption gefunden. Also scheint Roger das alles getrennt zu verwalten. Das wäre auch nicht das Problem. Wichtig ist für mich, ich komme dran und kann es ändern. Leider habe ich vergeblich gesucht, wie ich die xte Zeile im Header finde. Ich kann immer nur die 1.Zeile sehen, finde aber nicht die Variable, die mir die Möglichkeit gibt jede weitere, wenn vorhanden, auch anzusehen, oder zu ändern. Wo muß ich denn da suchen?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Tom »

Hallo, Manfred.

Wenn Du dem Header einen Codeblock zuordnest, ändert sich der auch, wenn der Codeblock einen anderen Wert liefert und DC_GetRefresh(Getlist) (oder: DC_GetRefresh(oBrowse)) aufgerufen wird. Für mehrzeilige Header muss der Codeblock entsprechend semikolonseparierte Strings zurückliefern.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

OK,

ich bin gerade dabei es zu verstehen. Aber worauf muß ich achten, wenn ich in dem Codeblock ein IF() Funktion mit einbauen will? Irgendwie hämmert mir der Compiler immer eine Fehlermeldung raus.

ich mache das so

Code: Alles auswählen

cHeader  := &("{|| IF((oVarianten"+cNi+":nArea)->tgnrorg,"0","1") }")
Was ist daran falsch?

Wobei natürlich mein Problem nicht gelöst ist, warum es nicht händisch geht, bzw. wie es gehen würde. Nur mal so aus Neugier und Lerneifer.... :^o
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Tom »

Du musst im Makro-Ausdruck mit anderen (z.B. den einfachen) Anführungszeichen arbeiten:

Code: Alles auswählen

bHeader  := &("{|| IF((oVarianten"+cNi+":nArea)->tgnrorg,'0','1') }")
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

Ah,

dann habe ich da einiges durcheinander geworfen. Die Var cNi ist in "++" eingebettet und in einem anderen Thread, hatte ich mal angesprochen, dass doch eigentlich keine "" sondern ' ' benutzt werden sollten in diesen Kombinationen, worauf mir geantwortet wurde, dass das wohl nicht immer der Fall wäre. Aber das hätten wir dann.

Ich werde das jetzt mal ausprobieren. Jetzt muß ich nur noch den Thread durchlesen, den wir schon mal in einem ähnlichen Fall hatten, weil im Moment unter cNi immer die letzte Nummer angezeigt wird in jedem Spalteheader. Da wird noch nicht aktualisiert, aber ich meine das hattest Du mir auch schon eine Lösung zu genannt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Tom »

Wer lesen kann, ist klar im Vorteil. :wink: Im korrigierten Code ist "cNi" auch weiterhin in doppelte Anführungszeichen eingebettet, weil das für die Erzeugung der richtigen Zeichenkette semantisch nötig ist. Der Schnipsel enhält aber am Ende noch zwei Lexikale ('0' und '1'), die als Stringzuweisung innerhalb des auszuwertenden Codeblocks interpretiert werden müssen. Wenn man dort ebenfalls doppelte Anführungszeichen benutzt, wird a) ein Compilerfehler ausgelöst, weil die Zusammenstellung der Zeichenkette dadurch falsch wird und b) ein numerischer Wert als Ergebnis der Operation zurückgeliefert.

Edit: Vorsicht, ich habe die Variable in "bHeader" umbenannt, weil sie tatsächlich keine Zeichenkette, sondern einen Codeblock enthält.

Übrigens ginge es auch ohne Verwendung einfacher Anführungszeichen, obwohl diese absolut zulässig ist:

Code: Alles auswählen

bHeader  := &("{|| IF((oVarianten"+cNi+":nArea)->tgnrorg,"+Chr(34)+"0"+Chr(34)+","+Chr(34)+"1+Chr(34)+") }")
:badgrin:
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

Alles klar,

ich kann jetzt nur nicht mehr ganz nachvollziehen, worauf sich Dein letzter Beitrag bezieht. :confused2:

Auf die Sache mit den Anführungszeichen, oder die Sache dass in jeder Spalte im Header das gleiche steht?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Tom »

Also. Erstens: Der Fehler, nach dem Du gefragt hast, lag hier:

cHeader := &("{|| IF((oVarianten"+cNi+":nArea)->tgnrorg,"0","1") }")

Das ist schlicht syntaktisch falsch. Die IF-Operation soll entweder 0 oder 1 als Character zurückgeben. Da das ganze aber in ein Makro eingebettet ist, das seinerseits in geschachtelten, doppelten Anführungszeichen erzeugt wird, musst Du an dieser Stelle anders arbeiten. Simpel und elegant wären dort - und NUR DORT - einfache Anführungszeichen, die sich gut dafür eignen, innerhalb von Text wiederum Text kenntlich zu machen. Oder Du verwendest Funktionen:

IF(<Ausdruck>,Null(),Eins())

wobei die Funktionen "Null()" und "Eins()" die Lexikale "0" und "1" zurückliefern. Oder Du arbeitest mit Variablen:

IF(<Ausdruck>,cNull,cEins)

oder mit Konstanten:

#define NULL "0"
#define EINS "1"
IF(<Ausdruck>,NULL,EINS)

Verstehst Du? Die "Klammerung", eigentlich aber die Verschachtelung der Anführungszeichen muss stimmen. Da die Anführungszeichen um die zurückgegebenen Werte aber überhaupt nichts mit denen um den Codeblock herum zu tun haben, musst Du dort anders arbeiten.

Und zweitens: Wenn die Spalten immer noch alle die gleiche Überschrift haben, stimmt cNi an der Stelle, an der der Codeblock erzeugt wird, einfach nicht. Oder Dein Feld "tgnord" liefert immer denselben Wert zurück.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

Ja,

den Fehler mit "0" "1" habe ich ja sofort erkannt. :(
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

OK,

das hier habe ich eingebaut:

Code: Alles auswählen

bHeader  := &("{|| IF( (oVarianten"+cNi+":nArea)->tgnrorg > 0,'VAR' + cNi +';'+ Alltrim(Str( (oVarianten"+cNi+":nArea)->tgnrorg) ),'VAR' + cNi) }")

HEADER bHeader
das ergibt immer die gleiche Überschrift.

ich habe jetzt mal kurzfristig den Verstand hinzugenommen. :angel8: und folgendes gemacht

Code: Alles auswählen

value := Eval(bHeader)
in Value steht genau das drin, was ich haben will. Muß ich denn jetzt bei der Angabe von HEADER innerhalb DCBROWSECOL noch etwas beachten? Es wird doch nur

Code: Alles auswählen

HEADER bHeader
geschrieben oder liegt da mein Denkfehler? Aber wenn dem so ist, wie wird denn dann der Codeblock jedesmal aktualisiert. HEADER kann doch eigentlich nur Text annehmen, oder? Das bringt mich jetzt erstmal zum Nachdenken, ob das überhaupt alles so richtig, ist, was ich hier versuche. :?:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Tom »

Header können Texte und Codeblöcke enthalten. Aber die Header werden - im Gegensatz z.B. zu DATA-Codeblöcken der Spalten - beim Erzeugen und zur Laufzeit evaluiert. Dadurch würden jetzt alle Header den gleichen Codeblock bekommen. Du musst das so machen:

Code: Alles auswählen

bHeader&cNi  := &("{|| IF( (oVarianten"+cNi+":nArea)->tgnrorg > 0,'VAR' + cNi +';'+ Alltrim(Str( (oVarianten"+cNi+":nArea)->tgnrorg) ),'VAR' + cNi) }")

DCBROWSECOL ... HEADER bHeader&cNi
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

Tom,

ich weiß, ich kann ein schwerer Fall sein. Aber so klappt es auch nicht. Aber erstmal egal. Da muß ich jetzt mit leben. Ich denke mal, in den nächsten Tagen oder Wochen wird sich irgendwas tun, eine Glücksidee, oder was weiß ich. Und dann kommt der HB Effekt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Tom »

Hallo, Manfred.

Mit einer einzigen Codezeile ist das auch Fischerei im Tieftrüben. :wink:
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Überschrift einer DCBROWSECOLUMN Spalte neu setzen

Beitrag von Manfred »

Naja, Du mußt nur was sagen.....

das ist jetzt das Original

Code: Alles auswählen

          @ 15,5 DCBROWSE oBrowse;
                     DATA oStrecken:cAlias;
                     EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN;
                     EVAL {|| pruefeAufSpaltenEnde(oBrowse,@lAnfang,@lEnde),dc_getrefresh(getlist) } ;
               FREEZELEFT {1,2};
                HEADLINES 2;
              NOSOFTTRACK;
                   PARENT oGruppeBrowse;
                  PREEVAL {|| oBrowse:headerRbDown := {|aMousePos, nColPos, self| SpaltenHeaderNeu(nColPos,oBrowse,oRouten) },;
                              oBrowse:ItemRbDown   := {|aMousePos, aRowCol, self| zeitenUebernahme(oStrecken,oBrowse,aRowCol),;
                                                        oBrowse:refreshAll();
                                                      };
                          };
                     SIZE DCGUI_PARENTWIDTH-15,DCGUI_PARENTHEIGHT-60
          DCBROWSECOL FIELD (oStrecken:nArea)->folge;
             GOTFOCUS {|| lAnfang := .T.,lEnde := .T.,dc_getrefresh(getlist) };
               HEADER "F";
               PARENT oBrowse;
              PROTECT {|| .T.};
                WIDTH 20
          DCBROWSECOL FIELD (oHaltestellen:nArea)->bezlang;
               HEADER "Streckenfolge";
             GOTFOCUS {|| lAnfang := .T.,lEnde := .T.,dc_getrefresh(getlist) };
               PARENT oBrowse;
              PROTECT {|| .T.};
                WIDTH 170

          FOR nI := 1 TO nMengeSpalten
              cNi      := Alltrim(Str(nI))
              bColData := &("{||(oVarianten"+cNi+":nArea)->abfahrt}")
              cHeader  := IF( ! Empty((oVarianten&cNi:nArea)->tagesart),"Sp" + cNi +';'+ (oVarianten&cNi:nArea)->tagesart,"Sp" + cNi)
              DCBROWSECOL DATA bColData;
                 GOTFOCUS {|| pruefeAufSpaltenEnde(oBrowse,@lAnfang,@lEnde),dc_getrefresh(getlist) } ;
                   HEADER cHeader;
                   PARENT oBrowse;
                  PICTURE "@R 99:99";
                    VALID {|c,o| validcol(oBrowse,o) };
                    WIDTH 60
          NEXT
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten