XbpSLE mit rotem Rahmen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

XbpSLE mit rotem Rahmen

Beitrag 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?
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 836
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 38 Mal
Danksagung erhalten: 188 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

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

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14636
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: XbpSLE mit rotem Rahmen

Beitrag 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.
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14636
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 836
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 38 Mal
Danksagung erhalten: 188 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag 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
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15687
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 64 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag von brandelh »

Ich habe folgenden Button in einer meiner Anwendungen:
ZeigenÄndernButton.png
ZeigenÄndernButton.png (1.35 KiB) 784 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.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9334
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 98 Mal
Danksagung erhalten: 355 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: XbpSLE mit rotem Rahmen

Beitrag 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?
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15687
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 64 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag 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
Gruß
Hubert
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: XbpSLE mit rotem Rahmen

Beitrag 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?
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 836
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 38 Mal
Danksagung erhalten: 188 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag von Marcus Herz »

Das SLE muss das darunter liegende Static als drawingarea bekommen
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14636
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: XbpSLE mit rotem Rahmen [gelöst]

Beitrag 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.
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15687
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 64 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpSLE mit rotem Rahmen

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