Seite 1 von 1

Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 11:20
von Manfred
ich habe eine Methode, die eine pauschale Pushbuttonleiste erzeugt. Pauschal, weil da Standardwerte drin stehen. Diese Standardwerte wollte ich nachträglich über EVAl in DCGUI READ ändern. Das scheint aber nicht so einfach zu sein. CAption einfach über setcaption() ist wohl nicht dauerhaft. Nachdem ich mir über den Debugger mal angesehen habe, was so alles in dem PushButton Objekt hinterlegt ist, habe ich schließlich :captionblock, :captiondisabled und :captionenabled gefunden. Damit geht das wohl dauerhaft. Ob das jetzt die eleganteste Lösung ist? k.A. ich mache es mal so. Jetzt würde mich aber mal interessieren, wo z.B. die Tooltip Texte stehen, weil ich die auch ändern müßte. Wenn ich da aber suchen sollte, werde ich ja wahnsinnig. Roger hat einen so großen Baum darin erzeugt. Wo fängt man da an. Gibt es dafür z.b. irgendeine Methode, die sowas steuert? Vielleicht generell für die Einstellungen und Werte, die ich benötige?

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 11:33
von Tom
Nimm einfach Codeblöcke für die Captions. Das ist dann auch "dauerhaft", um es mal im Jimmystyle zu sagen. Obwohl auch SetCaption dauerhaft sein sollte, wenn Du a) keine Codeblöcke für die Captions verwendest (die würden bei jedem DC_GetRefresh neu evaluiert werden) und b) nicht mit DCPUSHBUTTONXP arbeitest, da ist es meiner Erinnerung nach auch noch einmal ein bisschen anders.
Ansonsten könnte, wie immer, etwas Code helfen, um die Situation zu analysieren. Was sind die Standardwerte? Was bedeutet "pauschal erzeugen"?

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 12:28
von Manfred
Ahhhhhh Tom,
Danke das hatte ich total übersehen, Caption geht ja auch mit Codeblock. Das muß ich mir mal näher ansehen, wie das klappt und was das für mich bedeutet.

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 13:49
von Manfred
OK, Codeblock implementiert. Aber wie ändere ich jetzt die Caption? :angry1: Ein einfaches SetCaption() bringt micht nicht weiter. Das muß ja einen Sinn gehabt haben, warum Roger das so programmiert hat.

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 13:57
von Manfred
Einfache Lösung, man nimmt z.B. eine Variable in den Codeblock. Wenn man die dann ändert vom Inhalt her, dann wird die neue Caption dauerhaft angezeigt. Hätte ich auch eher drauf kommen können. :banghead:

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 15:08
von Tom
Oder eine Funktion, deren Rückgabewert eine gültige Caption ist. Die Caption aktualisiert sich dann durch DC_GetRefresh(GetList) oder DC_GetRefresh(oButton). Aber ich frage mich weiterhin, warum Du meinst, das Setzen z.B. einer Textcaption eines DCPUSHBUTTON mit :SetCaption wäre irgendwie nicht dauerhaft. Wenn der DCPUSHBUTTON so erzeugt wird:

Code: Alles auswählen

lNeueingabe := .F.
@ 1,1 DCPUSHBUTTON CAPTION "Neueingabe" SIZE 10,1 OBJECT oButton ACTION {||lNeueingabe:=!lNeueingabe,oButton:SetCaption(IF(lNeueingabe,"Speichern","Neueingabe))}
, dann verändert sich die Caption ausschließlich durch diese Zeile bzw. durch das Betätigen des Buttons. Das wäre dann die Codeblock-Version:

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION {||IF(lNeueingabe,"Speichern","Neueingabe)} SIZE 10,1 OBJECT oButton ACTION {||lNeueingabe:=!lNeueingabe,DC_GetRefresh(GetList)} // oder DC_GetRefresh(oButton)

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 15:26
von Tom
Oder, wenn Du nicht mit einzelnen Objektvariablen arbeiten willst:

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION 'Test' SIZE 20,1 ACTION {|x,y,o|o:SetCaption(o:Caption+"x")}
Mit jedem Klick verlängert sich die Caption jetzt. Und sie bleibt, ganz egal, was Du in/mit diesem Dialog sonst noch veranstaltest - außer, ihn neu aufzubauen. :wink:

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 16:22
von Manfred
hm,
vielleicht mache ich ja auch was falsch. Wenn ich in der Reihenfolge die Pushbutton erzeuge und dort dann die Caption angebe, ist die Caption nicht dauerhaft änderbar, wenn ich mit EVAl in der DCGUI READ Area :setcaption("neuerwert") eingebe. Man kann kurz sehen, wie die Änderung "aufblinkt" aber sofort wieder der Ursprungswert angezeigt wird.

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 17:06
von Tom

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION 'Test 1' SIZE 10,1 OBJECT oButton1
@ 2,1 DCPUSHBUTTON CAPTION 'Test 2' SIZE 10,1 OBJECT oButton2
@ 3,1 DCPUSHBUTTON CAPTION 'Test 3' SIZE 10,1 OBJECT oButton3
DCREAD GUI FIT ADDBUTTONS EVAL {||oButton1:SetCaption('Test 4')}
Du siehst einen Dialog mit drei Buttons, der oberste hat die Caption "Test 4".

In Deinem Code ist was falsch.

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 17:27
von Manfred
Tom,
hier der Programmauszug

Code: Alles auswählen

oDialogZusatz:standardPbLeiste(.T.,,,@getlist,oDialogZusatz:oTagesdienst,,,,.T.)
//------------------------------------------------------------------------------
          DCGETOPTIONS;
                BORDER XBPDLG_SIZEBORDER;
                  BUSY "Daten werden geladen";
             COLORGETS {{ GRA_CLR_BLACK, GRA_CLR_CYAN },{ GRA_CLR_BLACK, GRA_CLR_WHITE }};
                  EVAL {|o| SetAppWindow(o) };                                  /* muß hier stehen für das Cascading*/
            HILITEGETS GRA_CLR_CYAN;
           NOESCAPEKEY;
           NOMAXBUTTON;
           NOMINBUTTON;
                 PIXEL;
            SAYOPTIONS XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT;
          TOOLTIPCOLOR GRA_CLR_BLACK, GRA_CLR_YELLOW;
           WINDOWWIDTH oDialogZusatz:nFensterBreite;
          WINDOWHEIGHT oDialogZusatz:nFensterHoehe

          DCREAD GUI;
           APPWINDOW oSysPara:oHauptDialog:drawingArea;
                EVAL {|| oDialogZusatz:oTagesdienst:schalteEditControls(.F.),;
                         oDialogZusatz:oPbNeu:setCaption( "Drucken"),;           ------------------------> da sieht man es kurz wechseln aber sofort steht wieder "Neu" drin.
                         oDialogZusatz:oPbAbbruch:cargo[3] := "AUS",;
                         SetAppFocus(oDialogZusatz:oPbNeu);
                     };
             OPTIONS GetOptions;
              PARENT @oDialog;
               TITLE "Tagesdienstedruck " + oDialogzusatz:cVersion

***************************************************************************************************************
METHOD mk_dialog:standardPbLeiste(lNavigationAus,;                              // hier werden Standard PushButton für normale Dialoge aufgebaut
                                                              lLoeschenAus,;
                                  oParent,;
                                  getlist,;
                                  objekt,;
                                  lNeuAus,;
                                  lSpeichernAus,;
                                  lAbbruchAus,;
                                  lNavigationWeg,;
                                  lEditAus,;
                                  lAendernAus)
       DEFAULT lNavigationAus TO .F.
       DEFAULT lLoeschenAus   TO .T.
       DEFAULT lNeuAus        TO .F.
       DEFAULT lSpeichernAus  TO .F.
       DEFAULT lABbruchAus    TO .F.
       DEFAULT lNavigationWeg TO .F.
       DEFAULT lEditAus       TO .F.
       DEFAULT lAendernAus    TO .F.

       IF ! lNavigationWeg
          @ 0,0 DCPUSHBUTTON;
                      ACTION {|| objekt:skipdb(,,,,,-1),;
                                 ::SkipzusatzDb(),;
                                 dc_getrefresh(getlist),;
                                 dc_getorigset(getlist);
                             };
                     CAPTION {||ICON_GOTOP,NIL};
                        EVAL {|o| o:setpos( {5,10}),;
                                  AAdd(::aPbNavigieren,{o,.T.} );
                             };
                        HIDE {|| lNavigationAus};
                      OBJECT ::oPbTop;
                      PARENT oParent;
                        SIZE ::nPbLaengeBMP,::nPbHoehe;
                     TABSTOP;
                     TOOLTIP "Zum Anfang der Tabelle"
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| objekt:skipsatz(,,.T.,,,-1),;
                                                     ::SkipzusatzDb(getlist),;
                                                     dc_getrefresh(getlist),;
                                                     dc_getorigset(getlist);
                                                 };
                                         CAPTION {||ICON_GOBACK,NIL};
                                            EVAL {|o| o:setpos( {::oPbTop:currentpos()[1] + ::oPbTop:currentsize()[1],::oPbTop:currentpos()[2]} ),;
                                                      AAdd(::aPbNavigieren,{o,.T.});
                                                 };
                                            HIDE {|| lNavigationAus};
                                          OBJECT ::oPbZurueck;
                                          PARENT oParent;
                                            SIZE ::nPblaengeBMP,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "vorheriger Satz in der Tabelle"
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| objekt:skipsatz(,,.T.),;
                                                     ::SkipzusatzDb(getlist),;
                                                     dc_getrefresh(getlist),;
                                                     dc_getorigset(getlist);
                                                 };
                                         CAPTION {||ICON_GONEXT,NIL};
                                            EVAL {|o| o:setpos( {::oPbZurueck:currentpos()[1] + ::oPbZurueck:currentsize()[1],::oPbZurueck:currentpos()[2]} ),;
                                                      AAdd(::aPbNavigieren,{o,.T.});
                                                 };
                                            HIDE {|| lNavigationAus};
                                          OBJECT ::oPbVor;
                                          PARENT oParent;
                                            SIZE ::nPblaengeBMP,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "nächster Satz in der Tabelle"
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| objekt:skipdb(),;
                                                     ::SkipzusatzDb(getlist),;
                                                     dc_getrefresh(getlist),;
                                                     dc_getorigset(getlist);
                                                 };
                                         CAPTION {||ICON_GOBOTTOM,NIL};
                                            EVAL {|o| o:setpos( {::oPbVor:currentpos()[1] + ::oPbVor:currentsize()[1],::oPbVor:currentpos()[2]} ),;
                                                      AAdd(::aPbNavigieren,{o,.T.});
                                                 };
                                            HIDE {|| lNavigationAus};
                                          OBJECT ::oPbBottom;
                                          PARENT oParent;
                                            SIZE ::nPblaengeBMP,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "Letzter Satz in der Tabelle"
       ENDIF
       IF ! lEditAus
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| ::schalteControls("neu",objekt,getlist)};
                                         CAPTION  "Neu";
                                           CARGO "AN";
                                            EVAL {|o| IF( lNavigationWeg,o:setPos({5,10}),o:setPos( {::oPbBottom:currentPos()[1] + ::oPbBottom:currentSize()[1],::oPbBottom:currentPos()[2] } ))};
                                            HIDE {|| lNeuAus};
                                          OBJECT ::oPbNeu;
                                          PARENT oParent;
                                            SIZE ::nPbLaenge,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "Neuanlage eines Datensatzes";
                                            WHEN {|| ::pbWhenPruefung(::oPbNeu,objekt,"neu")}
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| ::schalteControls("ändern",objekt,getlist)};
                                         CAPTION {||"Ändern"};
                                           CARGO "AN";
                                            EVAL {|o| o:setPos( {::oPbNeu:currentPos()[1] + ::oPbNeu:currentSize()[1],::oPbNeu:currentPos()[2] } )};
                                            HIDE {|| lAendernAus};
                                          OBJECT ::oPbAendern;
                                          PARENT oParent;
                                            SIZE ::nPbLaenge,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "Ändern des angezeigten Datensatzes";
                                            WHEN {|| ::pbWhenPruefung(::oPbAendern,objekt,"ändern")}
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| ::schalteControls("speichern",objekt,getlist)};
                                         CAPTION {||::cPbSpeichernCaption};
                                           CARGO "AN";
                                            EVAL {|o| o:setPos( {::oPbAendern:currentPos()[1] + ::oPbAendern:currentSize()[1],::oPbAendern:currentPos()[2] } )};
                                            HIDE {|| lSpeichernAus};
                                          OBJECT ::oPbSpeichern;
                                          PARENT oParent;
                                            SIZE ::nPbLaenge,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "Speichern des angezeigten Datensatzes";
                                            WHEN {|| ::pbWhenPruefung(::oPbSpeichern,objekt,"speichern")}
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| ::schalteControls("abbruch",objekt,getlist)};
                                         CAPTION {||"Abbruch"};
                                           CARGO "AN";
                                            EVAL {|o| o:setPos( {::oPbSpeichern:currentPos()[1] + ::oPbSpeichern:currentSize()[1],::oPbSpeichern:currentPos()[2] } )};
                                            HIDE {|| lAbbruchAus};
                                          OBJECT ::oPbAbbruch;
                                          PARENT oParent;
                                            SIZE ::nPbLaenge,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "Abbruch des Editiervorganges";
                                            WHEN {|| ::pbWhenPruefung(::oPbAbbruch,objekt,"abbruch")}
          @ DCGUI_ROW,DCGUI_COL + 5 DCPUSHBUTTON;
                                          ACTION {|| ::schalteControls("löschen",objekt,getlist)};
                                         CAPTION {||"Löschen"};
                                           CARGO "AN";
                                            EVAL {|o| o:setPos( {::oPbAbbruch:currentPos()[1] + ::oPbAbbruch:currentSize()[1],::oPbAbbruch:currentPos()[2] } )};
                                            HIDE {|| lLoeschenAus};
                                          OBJECT ::oPbLoeschen;
                                          PARENT oParent;
                                            SIZE ::nPbLaenge,::nPbHoehe;
                                         TABSTOP;
                                         TOOLTIP "Löschen des angezeigten Datensatzes";
                                            WHEN {|| ::pbWhenPruefung(::oPbLoeschen,objekt,"löschen")}
       ENDIF
RETURN self
vielleicht mache ich ja wirklich was falsch. Ich erkenne es aber nicht.

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 18:14
von Tom
Was passiert in der Methode pbWhenPruefung? Was ist, wenn Du deren Aufruf im WHEN des Buttons rausnimmst?

Re: Pushbutton und Caption

Verfasst: Di, 30. Jan 2018 18:38
von Manfred
bevor ich jetzt lange rede:

Code: Alles auswählen

METHOD mk_dialog:PbWhenPruefung(oXbp,objekt,cWoher,lAktivieren)                   // Prüfung ob PushButton enabled oder disabled sein mnssen
       LOCAL  lErfolg := .F.

       DEFAULT lAktivieren TO .T.

       DEFAULT cWoher TO ""

       IF Upper(oXbp:cargo[3]) = "AN"
          lErfolg := .T.
       ENDIF
       IF (objekt:nArea)->(Eof()) .AND. (Upper(cWoher) == "ÄNDERN" .OR. Upper(cWoher) == "LÖSCHEN")
          lErfolg := .F.
       ENDIF
       IF ! lAktivieren
          lErfolg := .F.
       ENDIF
RETURN lErfolg