Alaska Software Inc. - killInputFocus - checkValid
Username: Password:
AuthorTopic: 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 AltmannRe: 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_OHRRe: 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 CiriackRe: 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.

...