Author | Topic: killInputFocus - checkValid | |
---|---|---|
Ralf | killInputFocus - checkValid on Mon, 03 Jul 2006 21:06:10 +0200 Hallo, ich bin dabei mich in Alaska einzuarbeiten. Zum Testen habe ich ein kleines Formular mit xbpSLE-Feldern. in diese sollen Numerische Werte eingetragen werden. Also dachte ich an eine Überprüfung des Wertes beim verlassen des Objektes. xbpSLE:killInputFocus := { | nil1,nil2,self |; if( checkValid(self),,SetAppFocus(self)) } function checkValid(oDummy) if(!isNumber(oDummy:getData()) return .f. endif return .t. Wenn ich das ganze jetzt starte, passiert nichts wenn es eien Zahl ist, so wie es sein soll. Aber wenn es keine Zahl ist wird das gesamte Programm beendet und ich befinde mich wieder im Win/Dos. Eigentlich sollte nur eine Meldung (hier nicht mit angegeben) erscheinen und der Focus wieder auf das Edit-Feld gesetzt werden. Ist an dieser Konstruktion irgendetwas falsch? Vielen Dank schon mal, Ralf... | |
Martin Altmann | Re: killInputFocus - checkValid on Mon, 03 Jul 2006 21:07:15 +0200 Hallo Ralf, wird denn eine XPPFATAL.LOG erzeugt? Noch ein kleiner Hinweis: Du wirst mit Deinem Konstrukt Probleme bekommen, wenn Du mehr als ein Eingabefeld in Deiner Maske so prfst!! Bedenke, dass der killInputFocus() erst feuert, wenn das Objekt den Fokus komplett verloren (und somit ein anderes Objekt den Fokus bekommen) hat!! Wenn der User nun das erste Feld, das so geprft wird, verlsst, indem er in das andere Feld, das so geprft wird, klickt, und beide Felder gegen die Prfregeln verstossen (also Deine Funktion in beiden Fllen .F. liefert), so wird dein Cursor wild zwischen beiden Feldern hin- und herhpfen!! Viele Gre, Martin ______________________________ Deutschsprachiges Xbase-Forum: http://www.xbaseforum.de/ ______________________________ | |
Ralf | Re: killInputFocus - checkValid on Tue, 04 Jul 2006 17:24:17 +0200 Hallo Martin, >Noch ein kleiner Hinweis: Du wirst mit Deinem Konstrukt Probleme bekommen, >wenn Du mehr als ein Eingabefeld in Deiner Maske so prüfst!! > ... >Viele Grüße, >Martin Ich habe 7 Eingabefelder und das Problem noch nicht gehabt bis jetzt. Werde morgen mal etwas testen ob dieser Fall eintritt. Danke für den Hinweis! MfG, Ralf... | |
Ralf | Re: killInputFocus - checkValid on Mon, 03 Jul 2006 21:11:09 +0200 >ist, so wie es sein soll. Aber wenn es keine Zahl ist wird das gesamte >Programm beendet und ich befinde mich wieder im Win/Dos. Ohne jegliche Fehlermeldung oder Error-Codes... | |
AUGE_OHR | Re: killInputFocus - checkValid on Mon, 03 Jul 2006 21:52:21 +0200 hi, a.) eigendlich ist dafr der mySLE:validate slot zustndig b.) siehe dir mal C:\ALASKA\XPPW32\SOURCE\samples\solution\xbpget\ an. c.) SLEPic von James Loughner gruss by OHR Jimmy | |
Ralf | Re: killInputFocus - checkValid on Tue, 04 Jul 2006 17:19:02 +0200 Hi! >a.) eigendlich ist dafür der mySLE:validate slot zuständig >b.) siehe dir mal C:\ALASKA\XPPW32\SOURCE\samples\solution\xbpget\ an. >c.) SLEPic von James Loughner werde ich mal studieren, danke! | |
Alfred Janssen | Re: killInputFocus - checkValid on Tue, 04 Jul 2006 13:33:01 +0200 Hallo Ralf, wenn man mit normalen SLE's arbeitet, dann ist das so einfach nicht machbar. Ich habe das vor Jahren in mehreren Schritten erreicht, weil ich nicht mit dem xbpGet nicht arbeiten wollte. Denn der FD generiert nur SLE's. Weiterhin muß man beachten, das, wenn mit Komma eingegeben wird, das der Wert hinter dem Komma einfach angeschnitten wird. Also muß man beim Abspeichern im :datalink-Block das Komma durch einen Punkt ersetzen. 1.verschiedene Keyboard-Blocks definieren: ::aKeyBoard := { | mp1,mp2,obj | handleKey( mp1 , obj , self , "SLE" ) } ::bKeyBoard := { | mp1,mp2,obj | handleKey( mp1 , obj , self , "PUSH" ) } ::cKeyBoard := { | mp1,mp2,obj | handleKey( mp1 , obj , self , "MEMO" ) } 2. in create() weise ich je SLE, welches später auf ein Datanbankfeld zugreift die Feld-Informationen zu. Dann kann ich später aufgrund dieser Info die Feldüberprüfung vornehmen. for i = 1 to FCount() IF IsMemberVar( self , FieldName( i ) ) IF FieldInfo( i , FLD_TYPE_AS_NUMERIC ) == XPP_MEMO self:&(FieldName( i )):keyBoard := self:cKeyBoard && Hier werden die Keyboard-Blocks den SLE's zugewiesen ELSE self:&(FieldName( i )):keyBoard := self:aKeyBoard && Hier werden die Keyboard-Blocks den SLE's zugewiesen endif FeldInfo := STR( FieldInfo( i , FLD_TYPE_AS_NUMERIC ) ,1,0 ) + ; STR( FieldInfo( i , FLD_LEN ) ,2,0 ) + ; STR( FieldInfo( i , FLD_DEC ) ,2,0 ) self:&(FieldName( i )):ValiDate := FeldInfo IF i == 1 self:&(FieldName( i )):Disable() self:&(FieldName( i )):setPresParam( { { XBP_PP_DISABLED_FGCLR, GRA_CLR_BLACK } } ) ENDIF self:&(FieldName( i )):cargo := self:HelpFile + FieldName( i ) self:&(FieldName( i )):helprequest := {|mp1,mp2,oXbp| HelpObject():showHelp( oXbp:cargo ) } ENDIF next 3. Hier die eigentliche Function für den Keyboard-Handle: Aber hier nur ein ganz kleiner Auszug. Mein Keyboard-Handle geht über 8000 Zeilen. Ich steuer alle Eingaben vom ganzen Programm in dieser Function. Auch kann man durch oXbp:Classname die aufrufende Klasse abfragen. Auch die Feld-Reihenfolge könnte hier verändert werden. ***** KeyBoard.Prg *************************************** ********************************************************** #include "AppEvent.ch" #include "Xbp.ch" #include "Set.ch" #include "Gra.ch" #include "Types.ch" #include "DmLb.ch" #include "Font.ch" ********************************************************** Function handleKey( nKey, keyButton, obj, Name, DatenObj, Variante ) Local i, ii local aFeldNamen local imax LOCAL LenZiffer Local BewegungsTaste := .F. Local NuLae := 0 Local NuNk := 0 Local OldFocus := SetAppFocus(), nButton Local aMarked := {} Local SumHlf, HlfMenge, HlfMenge1 := 0 Local mp1Mouse, mp2Mouse, oXbpMouse, nEventMouse IF obj == NIL; obj := SetAppWindow(); Endif CASE CASE "SLE" $ NAME .AND. ; && Abprüfen, ob Variablen richtig eingegeben wurden (( nKey > 41 .and. nKey < 256 .OR. nKey == 32) ; .OR. BewegungsTaste ) .AND. keyButton:ValiDate <> NIL IF substr( keyButton:ValiDate ,1,1 ) == Str(XPP_NUMERIC,1,0) .AND. ; .not. BewegungsTaste LenZiffer := VAL( substr( keyButton:ValiDate ,2,2 ) ) - ; VAL( substr( keyButton:ValiDate ,4,2 ) ) - ; IF(VAL( substr( keyButton:ValiDate ,4,2 )) <> 0 , 1 , 0 ) && -1 für Kommastelle NkZiffer := val( substr( keyButton:ValiDate, 4, 2 ) ) DO CASE CASE nKey > 57 WarnMeldung("Hier sind nur nummerische Eingaben möglich !" , obj ) keyButton:SetData("") SetAppFocus( keyButton ) OldFocus := NIL return( NIL ) CASE VAL( keyButton:editBuffer() ) > VAL( replicate( "9" , LenZiffer ) + "." + replicate( "9" , NkZiffer ) ) WarnMeldung("Der höchste Wert darf nur " + replicate( "9" , LenZiffer ) + "." + replicate( "9" , NkZiffer ) + " betragen !",; obj ) keyButton:SetData( substr( alltrim( keyButton:editBuffer() ), 1, LenZiffer ) ) SetAppFocus( keyButton ) OldFocus := NIL return( NIL ) CASE VAL( keyButton:editBuffer() ) < ( VAL( replicate( "9" , LenZiffer -1 ) + "." + replicate( "9" , NkZiffer ) ) / -1 ) WarnMeldung("Der kleinste Wert darf nur " + ltrim(STR(val(replicate( "9" , LenZiffer -1) + "." + replicate( "9" , NkZiffer ) ) / -1)) + " betragen !",; obj ) keyButton:SetData( substr( alltrim( keyButton:editBuffer() ), 1, LenZiffer ) ) SetAppFocus( keyButton ) OldFocus := NIL return( NIL ) ENDCASE ELSE ********************************************************************** *** Nur dann SetData() ausführen, wenn das Feld verlassen wird ******* ********************************************************************** IF BewegungsTaste .AND. substr( keyButton:ValiDate ,1,1 ) == Str(XPP_NUMERIC,1,0) keyButton:SetData( str(vall( keyButton:EditBuffer() ), NuLae, NuNk) ) ENDIF ENDIF ENDCASE mfg, alfred >Hallo, > >ich bin dabei mich in Alaska einzuarbeiten. Zum Testen habe ich ein >kleines Formular mit xbpSLE-Feldern. in diese sollen Numerische Werte >eingetragen werden. Also dachte ich an eine Überprüfung des Wertes >beim verlassen des Objektes. > >xbpSLE:killInputFocus := { | nil1,nil2,self |; > if( checkValid(self),,SetAppFocus(self)) } > >function checkValid(oDummy) >if(!isNumber(oDummy:getData()) > return .f. >endif >return .t. > >Wenn ich das ganze jetzt starte, passiert nichts wenn es eien Zahl >ist, so wie es sein soll. Aber wenn es keine Zahl ist wird das gesamte >Programm beendet und ich befinde mich wieder im Win/Dos. Eigentlich >sollte nur eine Meldung (hier nicht mit angegeben) erscheinen und der >Focus wieder auf das Edit-Feld gesetzt werden. > >Ist an dieser Konstruktion irgendetwas falsch? > >Vielen Dank schon mal, Ralf... > > | |
Ralf | Re: killInputFocus - checkValid on Tue, 04 Jul 2006 17:21:00 +0200 Hallo Alfred, danke fuer die ausfuehrliche Nachricht! Das muss ich jetzt erst einmal verdauen (Habe erst vor 2 Wochen mit Clipper angefangen...) MfG, Ralf... | |
Wolfgang Ciriack | Re: killInputFocus - checkValid on Tue, 04 Jul 2006 17:45:17 +0200 Hallo Ralf, dann kann ich dir fr schnelle Erfolge mit Xbase nur eXpress++ von Roger Donnay empfehlen. Solltest du dir unbedingt die Demo herunterladen. Auerdem solltest du dir mal das deutsche Xbase-Forum ansehen Viele Gre Wolfgang "Ralf" <RalfWeb1@gmx.de> schrieb im Newsbeitrag news:nn1la2dmdu0quspf2vsrul6qr8nuguband@4ax.com... > Hallo Alfred, > > danke fuer die ausfuehrliche Nachricht! > Das muss ich jetzt erst einmal verdauen > (Habe erst vor 2 Wochen mit Clipper angefangen...) > > MfG, Ralf... | |
Ralf | Re: killInputFocus - checkValid on Tue, 04 Jul 2006 17:10:37 +0200 >Wenn ich das ganze jetzt starte, passiert nichts wenn es eien Zahl >ist, so wie es sein soll. Aber wenn es keine Zahl ist wird das gesamte >Programm beendet und ich befinde mich wieder im Win/Dos. Sorry für das Posting - habe einen Fehler im Code gehabt, der dazu führte, dass gleich ans Ende des Programms gesprungen wird. ... |