![]() |
Alle Edit-Felder auf Eingaben prüfen
Mahlzeit,
auch zu diesem Thema habe ich einiges gefunden und auch etliches schon ausprobiert, jedoch funktioniert nichts so wie ich es gerne hätte. Ziel ist es in meiner Anwendung alle Edit-Felder auf Eingaben zu prüfen. Es gibt insgesamt 9 Felder, wovon 8 quasi Pflichtfelder sind. Ich habe es schon mit verschachtelten IF-Then-Abfragen versucht jedoch geht das nur beim ersten Feld. Ist das zweite leer so tut sich nichts (es erscheint allerdings auch nicht meine Nachricht). Dann habe ich die Überprüfung für jedes Feld bei "OnExit" durchgeführt. Das hat soweit funktioniert, nur habe ich Buttons plaziert, wo a) alle Eingaben gelöscht werden können und b) die Anwendung beendet werden kann. Diese Buttons verursachen dann allerdings meine Fehlermeldung und ich kann die Anwendung nicht unterbrechen bzw. beenden. Wie kann ich hier weiter vorgehen!! Ati |
Re: Alle Edit-Felder auf Eingaben prüfen
mach doch einen "Übernehmen" oder "Bestätigen" Button unter die ganzen Edits.
Darin rufst du eine Prüf-Funktion auf, die prüft ob alle Text ungleich '' sind. Dazu kannst du entweder jedes TEdit.Text einzeln prüfen lassen, oder in einer For-Schleife (siehe dazu die Hilfe FindComponent). |
Re: Alle Edit-Felder auf Eingaben prüfen
So in etwa aus dem Kopf gegriffen habe ich mal etwas gelöst.
Zwar kompliziert, aber in PHP hat es wunderbar geklappt!
Delphi-Quellcode:
...
var bErrFeld1, bErrFeld2, bErrFeld3, bErrFeld4, bErrFeld5, bErrFeld6, bErrFeld7, bErrFeld8: boolean; //hier alle auf true setzen! ... sErrMsg1, sErrMsg2, sErrMsg3, sErrMsg4, sErrMsg5, sErrMsg6, sErrMsg7, sErrMsg8: string; sErrAll: string; begin if (edit1.text <> '') then begin bErrFeld1 := false; end else begin sErrMsg1 = 'Feldname'; end; ... if (bErrFeld1 = true) OR (bErrFeld2 = true) OR (bErrFeld3 = true).... then begin if (bErrFeld1 = true) then sErrAll := 'Name des Ersten Feldes'; if (bErrFeld2 = true) then sErrAll := sErrAll+#13#10+'Name des zweiten Feldes'; ... Showmessage('Nachfolgende Felder müssen auf Ihren Inhalt geprüft werden:' + #13#10+ sErrAll); end; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
mahlzeit,
nachfolgender code müßte dein problem lösen. er läst sich noch optimieren wie z.b. ein forzeitiger abbruch oder das nich das ganze formular abgefragt wird. aber das prinzip sollte klar sein.
Delphi-Quellcode:
var a, i: integer;
begin a := 1; for i := 0 to Form1.ComponentCount -1 do begin if Form1.Components[i] is TEdit then a := a * (Length(TEdit(Form1.Components[i]).Text)); end; if a = 0 then ShowMessage('Bitte Eingabe überprüfen'); |
Re: Alle Edit-Felder auf Eingaben prüfen
Danke Andreas. Dein Code funktioniert schon zu gut. Ein Problem gibt es da aber noch. Das letzte Edit-Feld ist optional. D.h. es muß nicht ausgefüllt werden. Wie kann ich das einbauen??
Ati |
Re: Alle Edit-Felder auf Eingaben prüfen
du könntest es entweder direkt überprüfen (also ob das TEdit in der schleife auftaucht) oder du weist ihm bspw. den Tag 1 zu. alle TEdits mit diesem Tag werden ignoriert.
|
Re: Alle Edit-Felder auf Eingaben prüfen
@dahead den ersten Teil habe ich noch nicht ganz verstanden. Das mit Tag=1 funktioniert so ohne weiteres nicht.
|
Re: Alle Edit-Felder auf Eingaben prüfen
mahlzeit,
was dahead meint ist das du dem 9. edit über den oi den tag 1 (oder ein anderen wert) zuweist und du den code entsprechend abänderst das dieses edit nicht geprüft wird:
Delphi-Quellcode:
if (Form1.Components[i] is TEdit) and (Form1.Components[i].Tag <> 1) then
|
Re: Alle Edit-Felder auf Eingaben prüfen
Ach so. Sorry. Habe ich jetzt mal so eingebaut, jedoch ist die überprüfungsfunktion damit ausgehebelt. Habe mal nur das erste Edit-Feld eingetragen und er hat den DS trotzdem ohne meckern gespeichert!!
Hier mla mein aktueller Code
Delphi-Quellcode:
a := 1;
for i := 0 to Form1.ComponentCount -1 do begin if (Form1.Components[i] is TEdit) and (Form1.Components[i].Tag = 0) then a := a * (Length(TEdit(Form1.Components[i]).Text)); end; if a = 0 then begin ShowMessage('Bitte Eingabe überprüfen'); exit; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
kann es sein, dass du vergessen hast den tag auf 1 zu setzen?
|
Re: Alle Edit-Felder auf Eingaben prüfen
mahlzeit,
mit = 0 wird doch im normal fall alle edits geprüft, deshalb der forschlag mit edit = 1. |
Re: Alle Edit-Felder auf Eingaben prüfen
Hai Ati,
hier mal mein Quick and Dirty Code. Es werden alle TEdits beachtet deren Tag <> 1 ist.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var test: Boolean; i : integer; begin test := True; for i := 0 to Form1.ComponentCount -1 do begin if (Components[i] is TEdit) and (Components[i].Tag <> 1) then begin if Length((Components[i] as TEdit).Text) = 0 then begin test := False; break; end; end; end; if not (Test) then begin ShowMessage('Fehler bei der Eingabe'); end; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
@dahead :wink: Nein :wink:
@Andreas hoffentlich versteh ich Deine Aussage jetzt nicht falsch. Du beziehst Dich wohl darauf das ich hinten mit einer =0 arbeite und nicht <>1. Aber beides hat nicht funktioniert |
Re: Alle Edit-Felder auf Eingaben prüfen
Das Eine Edit-Feld,was nur Optional ist hat ja nen bestimmten namen(in meinen Beispiel hat das Edit Feld den Namen Test).
dann frag den doch einfach ab:
Delphi-Quellcode:
a := 1;
for i := 0 to Form1.ComponentCount -1 do begin if (Form1.Components[i] is TEdit) and (Form1.Components[i].Tag = 0) and (Form1.Components[i].name<>'Test') then a := a * (Length(TEdit(Form1.Components[i]).Text)); end; if a = 0 then begin ShowMessage('Bitte Eingabe überprüfen'); exit; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
HAAAAAAAAllllllllllllllllltttt Stoooopppp
Bevor ihr euch jetzt Gedanken macht!!! Ich habe nur 1 wirkliches TEdit-Feld. Die anderen sind entweder TMaskEdit oder TDateEdit. Mein Gott ist mir das peinlich. |
Re: Alle Edit-Felder auf Eingaben prüfen
loool
ist aber eigentlich auch kein problem musst nur die If Abfrage für alle felder, die du abfragen möchtest erweitern so z.b
Delphi-Quellcode:
kann nur sein, das du das net mit dem or Abfragen kannst, sondern das du
a := 1;
for i := 0 to Form1.ComponentCount -1 do begin if ((Form1.Components[i] is TEdit) or (Form1.Components[i] is TMaskEdit) or (weiter Felder) and (Form1.Components[i].Tag = 0) and (Form1.Components[i].name<>'Test') then a := a * (Length(TEdit(Form1.Components[i]).Text)); end; if a = 0 then begin ShowMessage('Bitte Eingabe überprüfen'); exit; end;
Delphi-Quellcode:
Musst halt alle sachen, die mit .text arbeiten in eine If-Abfrage packen und alle die z.b mit .value arbeiten in eine if-abfrage.
if(Form1.Components[i].Tag = 0) and (Form1.Components[i].name<>'Test') then
if (Form1.Components[i] is TEdit) then a := a * (Length(TEdit(Form1.Components[i]).Text)); else Abfrag für die anderen Typen then a := a * (Length(TEdit(Form1.Components[i]).Value)); wenn die allerdings alle mit .text arbeiten, würd ich die obere variante nehmen. |
Re: Alle Edit-Felder auf Eingaben prüfen
Kann mir jemand helfen wie ich diesen Code den Umbauen muß.
Ich habe 5 xTMaskEdit, 2xTDateEdit und eine TCombobox. |
Re: Alle Edit-Felder auf Eingaben prüfen
Hai Ati,
ich würde es so machen:
Delphi-Quellcode:
Ich habe also für jede zu prüfende Komponente eine Testfunktion welche man sich noch ausprogrammieren muss.
function EditTest(const aEdit : TEdit): boolean;
begin result := Length (aEdit.Text) > 0; end; function DateEditTest(aDateEdit : TJvDateEdit): Boolean; begin result := true; // Ein Passender Code end; function MaskEditTest(aMaskEdit : TMaskEdit): Boolean; begin result := true; // und noch ein Code; end; procedure TForm1.Button1Click(Sender: TObject); var test: Boolean; i : integer; tmpComponent : TComponent; begin test := True; for i := 0 to ComponentCount -1 do begin tmpComponent := Components[i]; if (tmpComponent is TEdit) then // Test des Edit begin test := EditTest (tmpComponent as TEdit); end; if (tmpComponent is TJvDateEdit) then // Test des DateEdit begin test := DateEditTest (tmpComponent as TJvDateEdit); end; if (tmpComponent is TMaskEdit) then // Test des MaskEdit begin test := MaskEditTest (tmpComponent as TMaskEdit); end; if not (test) then begin break; end; end; if not (Test) then begin ShowMessage('Fehler bei der Eingabe'); end; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
Irgendeinen kleinen Fehler habe ich noch. Hier nochmal die Funktionen und die Procedure:
Delphi-Quellcode:
function ComboTest(const acombo : TCombobox): boolean;
begin result := Length (acombo.Text) > 0; end; function DateEditTest( const aDateEdit : TDateEdit): Boolean; begin result := Length (aDateEdit.Text) >0; // Ein Passender Code end; function MaskEditTest(const aMaskEdit : TMaskEdit): Boolean; begin result := Length (aMaskEdit.text) >0; // und noch ein Code; end;
Delphi-Quellcode:
Wenn ich jetzt alle Pflichteingaben gemacht habe meldet er mir trotzdem einen Eingabefehler......oder hast Du mir eine kleine Falle gestellt Sharky :???:
procedure TForm1.btnspeichernClick(Sender: TObject);
var datum:TDate; zeit:TTime; i: integer; test:boolean; tmpComponent : TComponent; begin for i := 0 to Form1.ComponentCount -1 do begin if (tmpComponent is TMaskEdit) then // Test des MaskEdit begin test := MaskEditTest (tmpComponent as TMaskEdit); end; if (tmpComponent is TDateEdit) then // Test des DateEdit begin test := DateEditTest (tmpComponent as TDateEdit); end; if (tmpComponent is TCombobox) then // Test der ComboBox begin test := ComboTest (tmpComponent as TCombobox); end; end; if not (Test) then begin ShowMessage('Fehler bei der Eingabe'); exit; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
sieht so aus als hättest du vergessen, das "Test" zu initialisieren (test := True;), s. Sharkys Code.
|
Re: Alle Edit-Felder auf Eingaben prüfen
Man Man Man. Klar hatte ich das vergessen. Und tmpComponent := Components[i]; hatte ich auch nicht eingetragen.
Aber jetzt nimmt er wieder alle Eingaben auch die leeren!!!!!!! |
Re: Alle Edit-Felder auf Eingaben prüfen
Hai Ati,
ich vermisse in deinem Code diese Zeilen aus meinem:
Delphi-Quellcode:
Bei dir ist der Wert von Test ja nur von der letzten überprüften Componente abhängig. Wenn in dieser etwas steht ist test bei Dir True. Darum breche ich ja sobald die erste Componente ohne Inhalt gefunden wurde die FOR-DO-Schleife ab.
if not (test) then
begin break; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
Stimmt hatte ich übersehen. Jetzt meckert er Dein "break" an
|
Re: Alle Edit-Felder auf Eingaben prüfen
Zitat:
Delphi-Quellcode:
begin
for i := 1 to 100 do begin if not (test) then begin break; // Hier ist es Okay; end; end; // Ende der Schleife if not (test) then begin break; // Hier würde der Compiler meckern weil wir ausser halb einer Schleife sind. end; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
Jetzt scheint es endlich zu funktionieren. Mußte nur noch ein "exit" hinter dem Showmessage-Befehl setzen, weil nach der Prüfung der Datensatz in eine DB geschrieben wird und das muß ja unbedingt verhindert werden.
Werde morgen noch mal alles ausprobieren und dann bescheid sagen. Will jetzt einfach nur noch nach Hause. Danke Ati |
Re: Alle Edit-Felder auf Eingaben prüfen
Zitat:
![]() |
Re: Alle Edit-Felder auf Eingaben prüfen
Da ich ja ein gelehriger Schüler bin habe ich versucht Deinen Tip umzusetzen. Und den Prüfcode in das "BeforePost"-Ereignis des Query´s eingebaut. Wie auch nicht anders zu erwarten funktioniert das bei mir nicht.
Es werden wieder halbe Datensätze gespeichert. Wo muß ich genau DataSet.Cancel einsetzen? Welcher Teil vom Prüfcode muß in dem BeforePost-Ereignis und was muß im Button-Ereignis bleiben? |
Re: Alle Edit-Felder auf Eingaben prüfen
Hai Ati,
so würde es bei mir wohl aussehen (ungetestet):
Delphi-Quellcode:
function TForm1.CheckInput: Boolean;
var datum:TDate; zeit:TTime; i: integer; test:boolean; tmpComponent : TComponent; begin test := True; for i := 0 to Form1.ComponentCount -1 do begin if (tmpComponent is TMaskEdit) then // Test des MaskEdit begin test := MaskEditTest (tmpComponent as TMaskEdit); end; if (tmpComponent is TDateEdit) then // Test des DateEdit begin test := DateEditTest (tmpComponent as TDateEdit); end; if (tmpComponent is TCombobox) then // Test der ComboBox begin test := ComboTest (tmpComponent as TCombobox); end; if not (test) then begin break; end; end; result := test; end; procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet); begin if not (CheckInput) then begin DataSet.Cancel; ShowMessage('Bitte prüfen sie die Eingabe'); end; end; procedure TForm1.Button1Click(Sender: TObject); begin ADOQuery1.Post; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
Wie Du ja vor kurzem mitbekommen hast bin ich gerade am Anfang bezüglich der Datenbankprogrammierung unter Delphi. Daher kann ich so gewisse Sachen noch nicht ganz miteinander in Beziehung bringen. Auch auf die Gefahr hin das sich hier einige gleich ausschütten werden vor Lachen anbei mal mein gesamter Quelltext.
Delphi-Quellcode:
Ich denke mal das Verfahren zum löschen der Eingabefelder geht auch "eleganter". Also habt ein bischen Gnade mit mir.
public
procedure clear; { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} function ComboTest(const acombo : TCombobox): boolean; begin result := Length (acombo.Text) > 0; end; function DateEditTest( const aDateEdit : TDateEdit): Boolean; begin result := Length (aDateEdit.Text) >0; // Ein Passender Code end; function MaskEditTest(const aMaskEdit : TMaskEdit): Boolean; begin result := Length (aMaskEdit.text) >0; // und noch ein Code; end; procedure TForm1.clear; begin edvim.text:=''; edbenr.Text:=''; edlief.Text:=''; delterm.Text:=''; edkunde.Text:=''; edabnr.Text:=''; cbaufgabe.Text:=''; dekterm.Text:=''; edbemerk.Text:=''; edvim.SetFocus; end; procedure TForm1.btnspeichernClick(Sender: TObject); var datum:TDate; zeit:TTime; begin datum:=date; zeit:=time; qrmain.Sql.Clear; qrmain.Sql.Text:='Insert into Anforderungen (vim,benr,lieferant,ltermin,kunde,'+ 'abnr,aufgabe,ktermin,bemerkung,anfdat,anfuhr)' + 'VALUES ('+quotedstr(edvim.text)+','+quotedstr(edbenr.text)+','+ quotedstr(edlief.text)+','+quotedstr(delterm.text)+','+ quotedstr(edkunde.text)+','+quotedstr(edabnr.text)+','+ quotedstr(cbaufgabe.text)+','+quotedstr(dekterm.text)+','+ quotedstr(edbemerk.text)+','+quotedstr(datetostr(datum))+','+ quotedstr(timetostr(zeit))+');'; qrmain.ExecSql; body.Clear; body.Lines.Add('VIM: '+edvim.text); body.Lines.Add('BE_NR: '+edbenr.text); smtp.MailMessage:=body.Lines; smtp.Mail; clear; end; procedure TForm1.btnabbruchClick(Sender: TObject); begin clear; end; procedure TForm1.btnendeClick(Sender: TObject); begin application.Terminate; end; procedure TForm1.FormCreate(Sender: TObject); begin smtp.Connect; end; procedure TForm1.qrmainBeforePost(DataSet: TDataSet); var i: integer; test:boolean; tmpComponent : TComponent; begin test:=true; for i := 0 to Form1.ComponentCount -1 do begin tmpComponent := Components[i]; if (tmpComponent is TMaskEdit) then // Test des MaskEdit begin test := MaskEditTest (tmpComponent as TMaskEdit); end; if (tmpComponent is TDateEdit) then // Test des DateEdit begin test := DateEditTest (tmpComponent as TDateEdit); end; if (tmpComponent is TCombobox) then // Test der VomboBox begin test := ComboTest (tmpComponent as TCombobox); end; if not (test) then begin break; end; end; if not (Test) then begin ShowMessage('Fehler bei der Eingabe'); Dataset.Cancel; end; end; end. Ati |
Re: Alle Edit-Felder auf Eingaben prüfen
Wenn ich mit der Post-Methode arbeite meckert er das die Datenmenge sich nicht im Editier bzw Einfügemodus befinden.
|
Re: Alle Edit-Felder auf Eingaben prüfen
Zitat:
So, jetzt zu dem "Problem" Das mit dem AfterPost kann natürlich nicht gehen da Du das Query ja ganz anders benutzt als ich dachte (ist aber auch gut so). Die Ereignisse BeforPost, AfterPost usw. würde nur ausgelöst werden wenn Du über eine TDataSource irgendwelche DBxxxx-Komponenten verwendest oder im Code so etwas stehen hast:
Delphi-Quellcode:
Du arbeitest aber "direkt" mit SQL-Kommandos (INSTERT,UPDATE).
begin
Query1.Edit Query1.FieldByName ('blubb').AsString := Edit1.Text Query1.FieldByName ('meow').AsInteger := 0815; Query1.Post; end Bei dir müsstest Du also nur, wie von mir vorgeschlagen eine Funktion schreiben welche die Fehler prüft. Wenn diese TRUE liefert führst Du deinen Code im OnClick des Buttons aus und wenn FALSE kommt dann gibst Du die Meldung aus. Ich würde den ganzen Code zum Eintragen der Daten aber auch noch in eine Funktion auslagern. So das Du diesen Pseudocode hast:
Delphi-Quellcode:
procedure TForm1.btnspeichernClick(Sender: TObject); begin if (EingabeTest) then begin SpeicherenNeuenDatensatz; end else begin Fehlermeldung; end; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
Es funktioniert mit einer kleiner Ausnahme. Ich benutze zur Datumseingabe das TDateEdit der RXLib. Hier ist Standardmäßig als Text " . . " hinterlegt. Bei der Prüfung der Textlänge >0 zählt er (so vermute ich jedenfalls) die Punkte. D.h. wenn alle anderen ausgefüllt sind aber die Terminangaben fehlen so nimmt er den Datensatz. Obwohl die Felder in der DB als NotNull deklariert sind (sollte dann nicht wenigstens hier Firebird meckern??). Ich benutze diese Objekte, da ich sie einfach "Benutzerfreundlich" finde und somit ein Datumsformat erzwinge.
P.S. selbst wenn ich die Prüflänge auf >2 setze nimmt er eine leeres TDateEdit-Feld. |
Re: Alle Edit-Felder auf Eingaben prüfen
Hai Ati,
du könntest mal prüfen was genau in einem lehren TDateEdit steht. Im notfall versuche in einem try-except Block eine Umwandlung in ein TDate versuchen. Wenn diese fehlschlägt gibt deine Testfunktion ein False zurück. |
Re: Alle Edit-Felder auf Eingaben prüfen
Hai Sharky,
nicht das Du denkst ich habe Deinen Tip unter dem Tisch fallen lassen. Hier mal meine Prüffunktion für das Datumsfeld:
Delphi-Quellcode:
Wenn man das eleganter lösen kann bitte ich um Korrektur!!!
function DateEditTest( const aDateEdit : TDateEdit): Boolean;
var dat:Tdate; begin result:=true; try dat:= strtodate(aDateEdit.Text); except result:=false; end; end; Ati |
Re: Alle Edit-Felder auf Eingaben prüfen
Zitat:
Alternativ könntest Du noch prüfen ob in der Eigenschaft .Text (wenn es die bei dem DateEdit gibt) etwas eingetragen wurde. |
Re: Alle Edit-Felder auf Eingaben prüfen
Das habe ich ja als erstes versucht. Nur vermute ich das die Pünktchen als Eingabe gewertet werden.
Aus Deiner Antwort schliesse ich aber das Du mit meiner aktuellen Lösung "zufrieden" bist. Ati |
Re: Alle Edit-Felder auf Eingaben prüfen
Zitat:
Delphi-Quellcode:
Aber ich finde das mit dem try-except besser da so auch falsch Eingaben abgefangen werden.
function DateEditTest( const aDateEdit : TDateEdit): Boolean;
begin result := StringReplace(aDateEdit.Text,' ','',[rfReplaceAll]) <> '..'; end; |
Re: Alle Edit-Felder auf Eingaben prüfen
Danke für die Blumen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz