Seite 1 von 1

XbpSLE mit rotem Rahmen

Verfasst: Mo, 05. Feb 2024 10:09
von klammerauf
Hallo,

ich will im Fall einer fehlenden Eingabe in einem SLE nachträglich einen roten Rahmen um dieses XbpSLE machen.

Hat das schon jemand gemacht? Muss ich hier Gra-Functions verwenden?

Re: XbpSLE mit rotem Rahmen

Verfasst: Mo, 05. Feb 2024 12:12
von Marcus Herz
Richtig: Um einen Rahmen zu zeichnen, musst dur GRA Funtkkionen verwenden.
Du kannst allerdings auch die Hintergrundfarbe des SLE ändern, ist einfacher.
Weil ein gezeichneter Rahmen mit GRA musst du auch wieder löschen...

Re: XbpSLE mit rotem Rahmen

Verfasst: Mo, 05. Feb 2024 13:33
von Jan
Ich mach das ähnlich wie Marcus beschreibt. Das aktuelle SLE hat einen gelben Hintergrund, ein SLE mit einem Validierungsproblem einen roten.

Das geht recht einfach über :setColorBG(nFarbe). Auf jeden Fall erheblich einfacher als da mit GRA-Funktionen oder Ownerdrawing zu arbeiten.

Jan

Re: XbpSLE mit rotem Rahmen

Verfasst: Mo, 05. Feb 2024 15:06
von klammerauf
Ok, die Argument sind richtig, zu viel Aufwand mit den GRA-Funktionen.

:setColorBG geht nicht, weil ich das schon für invalide Eingaben verwenden möchte.

Ich hatte jetzt noch die Idee mit einem "Wander-Static". Ich erzeuge unsichtbar einen XbpStatic Rahmen und wenn es eine fehlende Eingabe in einem SLE gibt, dann lese ich aus dem SLE mit :currentPos() und :currentSize() dessen Daten aus und übertrage Position und Größe an das Static mit dem Rahmen, nur ein wenig angepasst auf die Größe und Position. Dann muss ich es nur noch mit :show() anzeigen. So "wandert" das Rahmen-Static von SLE zu SLE, wo noch eine Eingabe fehlt.

Re: XbpSLE mit rotem Rahmen

Verfasst: Mo, 05. Feb 2024 15:11
von Jan
Hallo Sebastian,

wie ich schrieb verwende ich das auch für zwei Zwecke. Halt mit unterschiedlichen Hintergrundfarben. Das könnte man auch weiter treiben und drei oder vier Farben nehmen. Was auch den Vorteil hätte das Hinweise immer gleich dargestellt werden - nur eben mit anderen Farben.

Jan

Re: XbpSLE mit rotem Rahmen

Verfasst: Mo, 05. Feb 2024 20:32
von Marcus Herz
In XClass++ malen wir um das aktive SLE (und alle anderen Editcontols) einen Rahmen.
Man kann das ganz einfach in einer abgeleiteten Klasse von xbpSLE integrieren.
INPUT_FOCUS malt den Rahmen,
KILL_FOCUS löscht ihn wieder.
Also doch nicht zu kompliziert

Re: XbpSLE mit rotem Rahmen

Verfasst: Di, 06. Feb 2024 7:52
von brandelh
Ich habe folgenden Button in einer meiner Anwendungen:
ZeigenÄndernButton.png
ZeigenÄndernButton.png (1.35 KiB) 2111 mal betrachtet
Das Fenster startet mit "Zeigen" alle SLE können nicht geändert werden (Systemvariable des Fensters wird durch Button gesetzt und geändert)
nach Klick auf "Zeigen" kommt "Ändern" mit rotem Rahmen.
Hier ist der Code dafür:

Code: Alles auswählen

in CLASS des Fensters
   VAR stInfoEditShowStatus
   VAR pbEditShow
...
in INIT
   ::stInfoEditShowStatus     := XbpStatic():new( ::drawingArea, , , , { { XBP_PP_BGCLR, GRA_CLR_GREEN } } )
   ::stInfoEditShowStatus:clipParent := .T.
   ::stInfoEditShowStatus:clipSiblings := .T.
   ::pbEditShow       := XbpPushButton():new( ::drawingArea, ,  , , { { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
   ::pbEditShow:caption := "zeigen"
   ::pbEditShow:clipParent := .T.
   ::pbEditShow:clipSiblings := .T.
   ::pbEditShow:tabStop := .T.
   ::pbEditShow:preSelect    := .F.
   ::pbEditShow:pointerFocus := .F.
*   ::pbEditShow:activate := {|| NIL }
... im Fenster, kann aber auch hier stehen
   ::pbEditShow:activate    := {|| ::EditShow() } // Methode des Fensters teile ich auf, da von mir nicht vom Painter Classcode
...
in CREATE
   ::stInfoEditShowStatus:create(, ,{nPosX-3,nPosY-3},;
                                    { nPBschmal+6, nPBHoehe+6 } ,;
                                    { { XBP_PP_BGCLR, GRA_CLR_GREEN } } )

   ::pbEditShow:create( , , {nPosX,nPosY}, { nPBschmal, nPBHoehe })
   
... im Fenster, kann aber auch bei diesem Code stehen

*---------------------------------------------------------------------------
METHOD ...:EditShow(lForce) 
   LOCAL nButton
   DEFAULT lForce to .F.  // .t. erzwingt das Ende ohne Speichern (meist bei Neterr())
   IF ::InEdit // steuert Anzeige oder Änderungsmodus
      ...
      ::InEdit := .F.
      ::stInfoEditShowStatus:setColorBG( GRA_CLR_GREEN )
      ::pbEditShow:setCaption("zeigen")
      aeval(::editControls , {|oXbp| oXbp:setEditable(.F.) } )
   ELSE
      IF ::RLockMaster()           // ist Sperre möglich ?
         ::InEdit := .T.
         ::stInfoEditShowStatus:setColorBG( GRA_CLR_RED )
         ::pbEditShow:setCaption("ändern")
         aeval(::editControls , {|oXbp| oXbp:setEditable(.T.) } )
      ENDIF * ansonsten wird nicht umgeschaltet
   ENDIF
   ::RefreshXbp()             // immer anzeigen
RETURN NIL
das RefreshXbp() lädt Daten und Anzeigen nach, sicher ist sicher.

Der Clou ist, dass es nur ein FT Feld ist, das gefärbt wird.
Durch die Einstellungen wird das innere Control (hier PB, SLE sollte auch gehen) ausgespart !

GraFunktionen sind viel zu umständlich.

Re: XbpSLE mit rotem Rahmen

Verfasst: Mi, 07. Feb 2024 12:34
von Tom
Das ist mit GRA-Funktionen überhaupt nicht kompliziert, und man löst es ganz simpel über SetInputFocus und KillInputFocus, was bei allen XbParts geht, weshalb man das einfach in einer Klasse machen könnte, die man kombiniert. Als eXpress++-Nutzer habe ich das mit der Option HILITEGETS aber sowieso an Bord, und ich kann die dazugehörige Funktion auch beliebig anderweitig nutzen.
Die Idee mit dem Static als Hintergrund ist nicht übel, aber man verdoppelt so die Menge der Objekte.

Re: XbpSLE mit rotem Rahmen

Verfasst: Di, 13. Feb 2024 14:45
von klammerauf
@Hubert,

ich habe deine Lösung ausprobiert, aber leider kann ich die so nicht verwenden.

Wenn ich das richtig sehe, dann erzeugst du beim :create() ein farbiges XbpStatic auf das du kurz darauf den Button "draufsetzt".

Ich muss mit einem vorhandenen Dialog leben, den ich lediglich mit einem Codeblock erweitern kann.

Weiß jemand, wie ich unter einen existierendes Xbp einen anderen Xbp "drunter- oder dahinterschieben" kann, so dass der gewünschte Rahmeneffekt zustandekommt?

Re: XbpSLE mit rotem Rahmen

Verfasst: Mi, 14. Feb 2024 17:08
von brandelh
Ich meine man kann alles im Codeblock dynamisch anlegen. Aber es wird natürlich schnell sehr unübersichtlich. Falls überhaupt genug Quellcode untergebracht werden kann

Re: XbpSLE mit rotem Rahmen

Verfasst: Mi, 14. Feb 2024 18:13
von klammerauf
Anlegen kann ich schon, das ist kein Problem. Aber mein SLE ist ja schon vorhanden. Und ein farbiges XbpStatic unter das XbpSLE drunter legen bekomme ich nicht hin.

Eigentlich ärgerlich, dass es XbpStatic nur immer gefüllt gibt. Oder hab ich das was übersehen?

Re: XbpSLE mit rotem Rahmen

Verfasst: Mi, 14. Feb 2024 18:33
von Marcus Herz
Das SLE muss das darunter liegende Static als drawingarea bekommen

Re: XbpSLE mit rotem Rahmen

Verfasst: Mi, 14. Feb 2024 18:43
von Jan
Hallo Marcus,

der Punkt ist ja: Wie bekomme ich im Fehlerfall (nachträglich) das farbige Static unter das SLE?

Ich vermute mal das geht nur, wenn man das Static grundsätzlich anlegt als Parent des SLE. Ohne Rahmen, mit der gleichen Farbe wie der normale Background - also unsichtbar. Und im Fehlerfall die Backgroundcolor ändert.

Jan

Re: XbpSLE mit rotem Rahmen [gelöst]

Verfasst: Mo, 19. Feb 2024 17:08
von klammerauf
Jetzt hab ichs:

Nachdem ich das XbpStatic mit roter Füllung erzeugt und mit leichtem Versatz über das XbpSLE gelegt habe, rufe ich anschließend XbpSLE:configure() auf. Das sorgt dafür, dass das XbpSLE nochmal gezeichnet wird, und zwar über das darunter liegende XbpStatic.

Dabei muss ich das Static gar nicht als Parent des XbpSLE erzeugen.

Re: XbpSLE mit rotem Rahmen

Verfasst: Di, 20. Feb 2024 9:25
von brandelh
eigentlich gruppiert man ja verschiedene SLE auf einem Static, dann ist der Parent wichtig, aber wie bei mir gezeigt geht es auch anders.

Wichtig ist aber die Einstellung des Static:

::stInfoEditShowStatus:clipParent := .T.
::stInfoEditShowStatus:clipSiblings := .T.

dadurch schneidet dieses schon alle "Geschwister" also alle Controls auf gleicher Ebene (Parent) aus.