Fehlerüberpüfung

meste

Erfahrenes Mitglied
Hy @ all!

Ich möchte einige Textfelder vor´m abschicken überprüfen ob diese leer sind.

Code:
on (release) {
	var prüfe:Boolean = true;

	function prüfeFelder(){
		if(mail eq ""){mail ="darf nicht leer sein!"; return false}		
		if(nächstes Feld usw.; return false}	
	}
	prüfe = prüfeFelder(); 
	if (prüfe ==true){
		loadVariables("check.php4", "", "GET");
	}
}

allerdings wird´s auch weggeschickt wenn ein Feld leer ist.
Ich wäre für einen kleinen sehr dankbar.

Ahja, wie kann mann wenn in ein Eingabetext schon ein vordeffiniertes Text steht, diese dann gelöscht wird wenn der Benutzer in das Feld hineinklickt.
m.e.s.t.e
 
Zuletzt bearbeitet:
Hallo,

ich empfehl dir, Funktionen nicht in Funktionen zu definieren, wenn es anders möglich ist

Code:
function prüfeFeld (txt:TextField): Boolean {
    var str: String = txt.text;
    if (str == "" || str == undefined) {
        return false;
        txt.text = "Eingabe erforderlich!";
    } else return true;
} 

meinButton.onRelease = function () {

    var checked: Boolean = true;
    checked = this._parent.prüfeFelder (this._parent.meinTextfeld_1);
    checked = this._parent.prüfeFelder (this._parent.meinTextfeld_2);
    //usw
    if (checked == false) trace ("Bitte markierte Felder ausfüllen");
    else loadVariables("check.php4", "", "GET");
}

Das Problem mit dem Entfernen des Starttextes löst du wie folgt:

Code:
meinTextfeld.initText = "E-Mail Adresse"
meinTextfeld.text = meinTextfeld.initText;

meinTextfeld.onSetFocus = function () {
    if (this.text == this.initText) this.text = "";
}

gruss
 
Hallo,

hab das Skript auch mal ausprobiert.
Um mehrere Textfelder zu überprüfen hab ich noch weitere Variablen angelegt.
Jetzt siehts so aus:

PHP:
function prüfeFeld(txt:TextField):Boolean {
	var str:String = txt.text;
	if (str == "" || str == undefined) {
		return false;
		txt.text = "Eingabe erforderlich!";
	} else {
		return true;
	}
}
meinButton.onRelease = function() {
	var checked:Boolean = true;
	var checked2:Boolean = true;
	var checked3:Boolean = true;
	checked = _root.prüfeFeld(this._parent.meinTextfeld_1);
	checked2 = _root.prüfeFeld(this._parent.meinTextfeld_2);
	checked3 = _root.prüfeFeld(this._parent.meinTextfeld_3);
	//usw
	if (checked == false || checked2 == false || checked3 == false) {
		trace("Bitte markierte Felder ausfüllen");
	} else {
		trace("Es wurden alle markierten Felder ausgefüllt");
		//loadVariables("check.php4", "", "GET");
	}
};
Gibts eine möglichkeit das Skript zu vereinfachen wenn man zB 10 Textfelder hat und alle
geprüft werden sollen ob dort etwas eingetragen ist?
Wäre etwas umständlich dafür 10 Variablen anzulegen,oder?

Das zweite Problem ist das in den Textfeldern in denen nichts eingetragen ist die meldung "Eingabe erforderlich!" nicht erscheint. Obwohl es nach dem Skript so sein sollte.
Was könnte der Grund dafür sein? Hab alles auf root liegen und schriften hab ich auch eingebettet.
 
Hallo!

Gibts eine möglichkeit das Skript zu vereinfachen wenn man zB 10 Textfelder hat und alle geprüft werden sollen ob dort etwas eingetragen ist?

Latürnich gibt es das ;).
Mit einer for-Schlaufe lässt sich eine beliebige Anzahl von Textfeldern überprüfen, die aber dann den Iterator im Instanznamen haben müssen. Gehen wir mal von 10 Textfeldern aus, die da heissen "text_1", "text_" usw. Die kann man nun wie folgt überprüfen:

Code:
function prüfeFeld(txt:TextField):Boolean {
    var str: String = txt.text;
    if (str == "" || str == undefined) {
        txt.text = "Eingabe erforderlich!";
        return false;
    } else {
        return true;
    }
} 

function formCheck (): Void {
    var checked: Boolean = true;
    for (var i: Number = 0; i < 10; i++) checked = prüfeFeld(this["text_"+i]);
    if (checked == false) trace ("Bitte markierte Felder ausfüllen");
    else loadVariables("check.php4", "", "GET");
}

meinButton.onRelease = function() {
    this._parent.formCheck();
}

Hinweis: Du musst nicht für jede Textfeldprüfung eine eigene Kontrollvariable anlegen, sondern immer nur die gleiche aktualisieren, da es ja keine Rolle spielt, ob nun ein oder drei Textfelder den Test nicht bestanden haben.
Der Fehler, den du beschieben hast, lag daran, dass die return-Anweisung vor der Textzuweisung lag, ein Fehler meinerseits. Nix für ungut also!

gruss
 
Hallo,

Du musst nicht für jede Textfeldprüfung eine eigene Kontrollvariable anlegen, sondern immer nur die gleiche aktualisieren, da es ja keine Rolle spielt, ob nun ein oder drei Textfelder den Test nicht bestanden haben.

Sry, aber wenn ich nur eine prüfvariable anlege und zB. 2 Textfelder erstelle dann geht das doch nicht. Im ersten Feld trag ich nichts ein und "checked" wird ja somit false. Wenn ich aber im zweiten Feld was eintrage wird doch "checked" überschrieben und auf true gesetzt und die load Methode ausgeführt obwohl in Feld 1 nichts eingetragen ist.


Oder mach ich irgendwo ein fehler
 
Hallo,

nein, da hast du recht. Da hab ich einen Denkfehler gemacht. Trotzdem reicht eine Kontrollvariable, nämlich wenn man es so löst:
Code:
function formCheck (): Void {
    var checked: Boolean = true;
    for (var i: Number = 0; i < 10; i++) if (!prüfeFeld(this["text_"+i])) checked = false;
    
    if (checked == false) trace ("Bitte markierte Felder ausfüllen");
    else loadVariables("check.php4", "", "GET");
}

gruss
 
Sorry gleich vor weg wenn der Beitrag zu lang sein sollte.

Ich habe begonnen, das ich dies über eine Klasse löse. Samt Konstruktor und Properties. Keine Ahnung ob das eine gute Idee ist, aber vielleicht tu ich mir so leichter Flash zu verstehen. Da ich in Flash zum ersten mal Objektorientiert arbeite bin ich auf eure Hilfe angewiesen.
Ich habe diese Klasse in eine *.as - Datei gespeichert.
Code:
class chk {
	private var vn:String;
	private var nn:String;
	private var email:String;
	private var betreff:String;
	private var text:String;
	
    public function chk(_vn:String,_nn:String,_email:String,_betreff:String,_text:String) {
        this.vn = _vn;
		this.nn = _nn;
		this.email = _email;
		this.betreff = _betreff;
		this.text = _text;
    }
    public function getvn():String {
        return vn;
    }
    public function setvn(value:String):Void {
		if (value=="" || value==undefined){
	        vn = "Eingabe erforderlich!";
		}else{vn = value};
    }
}
oder vielleicht so die set-Methode
Code:
    public function setvn(value:String):Void {
		this.vn = value;
    }
Dann habe ich mir gedacht das ich einen neuen Zeiger anlege. Das problem im unteren Code ist, das die Zeile "arr.übergabe("Eingabe erforderlich!");" ein Funktionsaufruf ist statt die set methode. Denn dann könnte man doch falls die Eigenschaft leer ist, den neuen Wert an die Klasse übergeben um später von dort die Eigenschaften wieder zu holen. Logischerweise funktioniert das nicht so wie ich es mir vorgestellt habe.
Code:
function prüfeFeld (): Boolean {
        var prüf:Boolean=true;
	var arr:chk = new chk(vn,nn,mail,betreff,text);
	var i:Number;
	for(i in arr){		
		if (arr[i] == "" || arr[i] == undefined){
			var übergabe:String = "set" + i;
			arr.übergabe("Eingabe erforderlich!");
			prüf = false;
		}
	}	
	return prüf
}
Naja, falls das nicht so wie ich´s mir gedacht habe funktionieren soll, wollte ich noch wissen wie man eine einfache For each - Scleife in Flash schreibt.
Beispiel:
Code:
Dim textB as textbox

        For Each textB As Control In Controls
            If textB.GetType Is GetType(TextBox) Then
                If CType(textB, TextBox).Text = "" OrElse CType(textB, TextBox).Text = Nothing Then
                    textB.Text = "Eingabe erforderlich!"
                End If
            End If
        Next

Ich bin mir sicher das da einige Fehler im Flashscript liegen, aber ich wäre sehr dankbar dafür wenn mir jemand die Code´s von vb.net in Flash erklären kann bzw. worauf man achten muss bzw. ob es so funktionieren würde. Nochmals sorry für das ganze hier und danke im vorraus.
 
Hallo,

meine (wie immer) subjektive Meinung:
Ich brauche Klassen, um Objekt-Konstrukte, die ich immer wieder brauche, zu verallgemeinern, zusammenzufassen, auf den kleinsten gemeinsamen Nenner zusammenzustreichen, damit ich sie in jedem möglichen Fall einsetzen kann, ohne jedesmal die Klasse anzupassen.
Die Idee, einen Formcheck in eine Klasse zu packen, find ich genial, sowas braucht man schliesslich immer wieder mal, aber so wie du das anstellst, macht es die Sache in meinen Augen eher komplizierter als einfacher.
Als erstes würd ich mir mal überlegen, was passiert, wenn du die Klasse mal im Zusammenhang mit einem anderen Formular verwenden willst, dass vielleicht noch eine Adress-Eingabe verlangt. Dann müsstest du bereits wieder ein Feld hinzufügen. Das zumindest müsste man dynamisch lösen. Was auch keinesfalls in der Klasse definiert sein darf, ist das Feedback, denn das kann je nach Anweisung anders ausfallen.

Ich an deiner Stelle würde für den Formcheck keine Klasse, sondern eine TextField-Prototype schreiben, eine neue Klassen-Methode, die für alle Instanzen gilt:

Code:
TextField.prototype.checkText = function (newText: String, errorText: String, doesContain: Array, doesNotContain: Array): Void {
    var ctrl: Boolean = true;
    if (newText == undefined || newText == "") ctr = false;
    
    if (doesContain) {
        var l: Number = doesContain.length;
        for (var i: Number = 0; i < l; i++)  if (newText.indexOf (doesContain[i]) < 1) ctrl = false; 
    } 
    if (doesNotContain) {
        var l: Number = doesNotContain.length;
        for (var i: Number = 0; i < l; i++)  if (newText.indexOf (doesNotContain[i]) > 0) ctrl = false; 
    }
    if (ctrl) this.text = newText;
    else this.text = errorText;
}

Das E-Mail-Eingabefeld "emailTxt" könnte man dann z.B. so überprüfen:
Code:
emailTxt.checkText (this.text, "Ungültige E-Mail Adresse", ["@", "."], ["ü", "Ü", "ä", "Ä", "ö", "Ö"]);

Für das Erfassen und Behandeln der Formular-Daten könnte man eine Klasse bauen, allerdings muss man sich hier wieder überlegen, was genau bei jedem Formular gleich ist, worin der Vorteil besteht, alle Textfeld-Inhalte in einer Klasse zu speichern.

for each ist in der Form wie man es aus PHP oder vb kennt, nicht in Flash enthalten, man kann aber aus einer Kombination aus for..in und typeof zumindest eine ähnliche Schlaufe ausführen lassen.

gruss
 
Zuletzt bearbeitet:
Zurück