Seite 1 von 1

xbpSLE:vaild?

Verfasst: Fr, 14. Mai 2021 18:30
von Wolfgang_B
Hi,
irgendwo habe ich mal gelesen, daß man ein oXbpSLE mittels Codeblock validieren kann. Finde das aber nicht mehr.

Ich möchte direkt bei der Eingabe prüfen, ob die Eingabe ein gültiges Datum ist. Kann mir jemand mal ein Beispiel eines entsprechenden Codeblocks zeigen. (Wobei ich Codeblocks nach jetzt nach doch schon einigen Jahren immer noch nicht verstanden habe :-( )

Re: xbpSLE:vaild?

Verfasst: Fr, 14. Mai 2021 19:19
von georg
Hallo, Wolfgang -


meinst Du eventuell die iVar validate?

Re: xbpSLE:vaild?

Verfasst: Fr, 14. Mai 2021 19:23
von Wolfgang_B
hm. mir ist der Unterschied zwischen iVar validate und validate() method nicht klar. Ich vermute aber mal, daß ich validate() method brauche?!

Re: xbpSLE:vaild?

Verfasst: Fr, 14. Mai 2021 21:13
von georg
Hallo, Wolfgang -


beides, iVar wie Methode, leiten sich von DataRaf her. Ich vermute mal, dass Du die iVar mit einem Codeblock zur Prüfung beschicken musst, und dann mittels der Methode den Codeblock ausführen lassen kannst.

Re: xbpSLE:vaild?

Verfasst: Sa, 15. Mai 2021 0:57
von Werner_Bayern
Ein Codeblock ist nichts anderes als Code in einer Funktion. Nur kannst keine Befehle verwenden. Aufgerufen wird ein Codeblock mittels eval().

Beispiel:

Code: Alles auswählen

local bTuwas := {||dbGotop(), rec_lock(), adresse->name := “Hanswurscht”, dbunlock()}	// bayrische Schreibweise
Ausführung:

Code: Alles auswählen

eval(bTuwas)
ist die einfachste Form. In Xbase++ gibt’s viele Slots für Codeblöcke, also z. B. den Validate-Slot bei SLEs. Dort kannst einen Codeblock hinterlegen.

Code: Alles auswählen

oSLE:validate := bTuwas
Besonderheit: Hier wird ein Parameter an einen Codeblock übergeben. Ist nichts anderes, als ein Parameter an eine Funktion. Willst Du den Parameter im Codeblock nutzen, musst Du ihn – wie in einer Funktion – mit einer Variable belegen. Das macht man zwischen den zwei |:

Code: Alles auswählen

local bTuwas := {|oMeinSLE|dbGotop(), rec_lock(), adresse->name := oMeinSLE:editBuffer(), dbunlock()}
oder auch:

Code: Alles auswählen

local bTuwas := {|self|dbGotop(), rec_lock(), adresse->name := self:editBuffer(), dbunlock()}
dann kannst innerhalb (!) des Codeblocks mit der Variable auch arbeiten.

Ok?

Beim Validate wird intern die Rückgabe Deines Codeblocks geprüft, diese muss logisch sein. Ist sie .t., darf das Eingabefeld verlassen werden, ist sie .f., hat der Benutzer Pech gehabt.

Bei mir sieht z. B. einer so aus:

Code: Alles auswählen

oXbp:validate := {||plz(.T., aEditControls[9], aEditControls[8])}
In der Funktion plz wird dann geprüft, ob Ort und oder PLZ bekannt sind und entsprechend automatisch ersetzt. PLZ() gibt bei mir dann immer .t. zurück.

2. Beispiel:

Code: Alles auswählen

   oXbp := xbpSLE():new( drawingArea, , {LINKS4, nY}, {80, SLE[2]})
   oXbp:bufferLength := 6
   oXbp:tabStop := .f.
   oXbp:dataLink := {|x| if(x == NIL, str(adresse->KUNDEN_NR), adresse->KUNDEN_NR := val(x))}
   oXbp:validate := {|self|.not. empty(self:editBuffer())}
   oXbp:create():setData()
Vorsicht: Der Validate-Slot wird nicht automatisch aufgerufen, das musst Du selbst übernehmen! Z. B. im killInputFocus-Slot oder beim Speichern Deiner SLEs.

Siehe dazu auch https://www.xbaseforum.de/viewtopic.php?p=57683#p57683

Re: xbpSLE:vaild?

Verfasst: Sa, 15. Mai 2021 10:47
von Tom
Der Validate-Slot ist vor allem dann hilfreich, wenn man Klassen von XbpSLE ableitet, etwa für Datumseingaben, numerische Eingaben usw., und dort dann schon beim Initialisieren der Klasse den richtigen Code etwa für eine Prüfung der Datumseingaben hinterlegt (oder in einer anderen Ableitung den für numerische Eingaben, oder in einer Sammelklasse abhängig davon, wie etwa eine iVar "SLEtyp" belegt wird). Und dort füllt man auch KillInputFocus vor, wenn man möchte. Dann muss man im konkreten Code nur noch wenig tun. Wenn man diese Slots dann allerdings ergänzend oder abweichend bestücken will, muss man aufpassen. Oder Codeblöcke mergen.

Muss man nicht so machen, kommt mir aber eleganter vor.

Re: xbpSLE:vaild?

Verfasst: Sa, 15. Mai 2021 15:09
von Wolfgang_B
Herzlichen Dank an alle für die ausführlichen Antworten. Hat jetzt mehr Sinn sich damit zu beschäftigen ... :)

Re: xbpSLE:vaild?

Verfasst: Sa, 15. Mai 2021 19:35
von ramses
Schau dir doch mal das Beispiel von Alaska an:

c:\alaska2\source\samples\solution\xbpget

Re: xbpSLE:vaild?

Verfasst: Sa, 15. Mai 2021 21:40
von AUGE_OHR
hi,

XbpGet arbeitet mit dem GET System was ein VALID hat
gefragt ist aber XbpSLE = WC_EDIT also das Windows Control und nicht das "überladene GET"

validate() ist die Method die man ausführt was dann als Ergebnis in validate dann steht

Code: Alles auswählen

   oXbp:Validate := { | o | ValidDate( o ) }
die Function könnte so aussehen

Code: Alles auswählen

FUNCTION ValidDate( oObj )
LOCAL dDate := oObj:getdata()
LOCAL cDate, lRet := .T.
   cDate := DTOC(dDate)
   dDate := CTOD(cDate)
   IF EMPTY(dDate)
      lRet := .F.     
      oObj:SetFocus()   // zurück auf das Object
   ENDIF
RETURN lRe
t