Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TEdit-Feld MUSS einen Wert enthalten!! (https://www.delphipraxis.net/840-tedit-feld-muss-einen-wert-enthalten.html)

m-werk 14. Sep 2002 18:57


TEdit-Feld MUSS einen Wert enthalten!!
 
Hi Leute, ich habe einige Edit-Felder in meinem Programm und bei einem möchte ich es so machen, dass der User aufgefordert wird, in dieses etwas zu schreiben.

Es ist ein TEdit-Feld, was auf eine Datenbank zugreift. In dieses Feld wird das Geburtstatum geschrieben.
Wenn der User nun den Datensatz speichern möchte, dann soll überprüft werden, ob das TEdit3-Feld einen Wert enthällt oder nicht. Wenn kein Wert drinn steht, dann soll eine MessageBox erscheinen mit der Aufforderung, dass der User einen Geburtstag eingeben MUSS.

Wie kann ich das machen?

Chewie 14. Sep 2002 19:08

Wenn Edit1 keinen Text enthält, ist Edit1.Text ein Leerstring.
Also sieht das so aus:

Code:
if Edit.Text = '' then MessageDlg('Du hast keinen Wert eingegeben', mtError, mbOK, 0)
else
begin
  //In Datenbank reinschreiben
end;

Luckie 14. Sep 2002 19:21

Und wenn ich das Datum nicht weiß, werde ich gezwungen was falsches rein zu schreiben? :roll:

m-werk 14. Sep 2002 19:24

Hi, danke für den code. Der funktioniert prima.

Es muß ein Geburtsdatum rein. Es handelt sich hierbei um eine Kundendatenbank. Da weiss man das Geburtsdatum. Es lässt sich nicht anders lösen, da sonst der Geburtstagsfilter nicht funktioniert!

Luckie 14. Sep 2002 19:38

Stürzt der Filter ab, wenn er über ein leeres Feld gehen muß? dann würde ich den noch mal überarbeiten.

m-werk 15. Sep 2002 18:33

Hi, nein der Filter stürtz mir nicht ab.

Es ist so. Ich habe da einen Filter, der mir alle Personen anzeigt, die von Heute weg bis in einer Woche, Geburtstag haben. Wenn jetzt aber im Geburtstagsfeld kein Wert steht, dann kommt, wenn ich mir die Geburtstagskinder ansehen will, immer die Meldung: '2002' ist kein gültiges Datum.

Und angezeigt bekomme ich dabei auch keine Geburtstagsliste.

Darum wird das Feld benötigt.

Luckie 15. Sep 2002 18:48

Wie wäre es mit einer Abfrage
Code:
if Edit.Text = '' then ...
Oder auch einem try-except-Block.

m-werk 15. Sep 2002 18:55

Hi, ich habe ja einen code zusammengeschnipselt:

Code:
procedure TKundendaten.SpeichernClick(Sender: TObject);                        
begin
 if DBEdit38.Text = '' then
 MessageDlg('Sie haben das Geburtsdatum nicht eingetragen. Bitte tragen Sie jetzt ein Geburtsdatum ein!', mtError,[mbOK], 0)
 else
  try
  DM.ADOSHaupt.Post; //DM.ADOSHaupt.Refresh;
  except
    on exception do
      MessageDlg('Keinen Wert zum speichern gefunden oder der Datensatz wurde bereits gespeichert!',
      mtWarning,[mbOk],0);
    end
end;
So sieht der Code zur Zeit aus.

Hast du da einen besseren vorschlag?

Luckie 15. Sep 2002 19:07

Das ist aber nicht der Filter oder?

Wenn jemand kein Geburtsdatum einträgt dann, dann trag doch 01.01.1899 ein und beim Anzeigen der Datensätze filters du das mit einer if-Abfrage wieder raus, damit es nicht dargestellt wird.

m-werk 15. Sep 2002 19:14

Klingt gut, nur wie mache ich das genau?

MathiasSimmack 16. Sep 2002 06:46

Re: TEdit-Feld MUSS einen Wert enthalten!!
 
Zitat:

Zitat von m-werk
Klingt gut, nur wie mache ich das genau?

:? Du wirst doch wohl wissen, wie man das von Luckie vorgeschlagene Dummy-Datum in die Datei schreibt, oder? Und wenn du die Datensätze anzeigen lässt, dann musst du doch nur prüfen, ob das jeweilige Datum mit diesem Dummy-Datum identisch ist. Oder habe ich da jetzt was nicht mitbekommen? Oder du? ...

Zitat:

Hi Leute, ich habe einige Edit-Felder in meinem Programm und bei einem möchte ich es so machen, dass der User aufgefordert wird, in dieses etwas zu schreiben.

(...)

Wenn der User nun den Datensatz speichern möchte, dann soll überprüft werden, ob das TEdit3-Feld einen Wert enthällt oder nicht. Wenn kein Wert drinn steht, dann soll eine MessageBox erscheinen mit der Aufforderung, dass der User einen Geburtstag eingeben MUSS.
Wie wär´s denn mit folgender Idee: die Datensätze werden doch bestimmt erst gespeichert, wenn der Anwender auf einen Button klickt oder so?! Dann mach doch den Buttonstatus vom Vorhandensein von einer Eingabe abhängig.
Code:
Button1.Enabled := (Edit3.Text <> '');
Das gehört ins "OnChange"-Ereignis von "TEdit3", dann hast du eine Echtzeitprüfung, die den Button aktiviert oder eben wieder deaktiviert. A n der Stelle könnte (!) man auch bereits ansetzen und die Eingabe mit dem erforderlichen Datumsformat vergleichen, so dass bei einer Fehleingabe der Button ebenfalls nicht aktiviert wird.

Ich ahne, was jetzt kommen wird:
Zitat:

Zitat von m-werk
Klingt gut, nur wie mache ich das genau?

:wink:

Luckie 16. Sep 2002 06:55

Wenn er den Vorschlag mit dem Dummydatum nimmt, dann ist das aber überflüssig, denn genau das wollen wir ja vermeiden. :wink:

MathiasSimmack 16. Sep 2002 09:15

Noch mal langsam, Luckie :twisted: -

Wenn das Geburtsdatum nicht eingetragen ist, dann wäre der Button nach meiner Idee deaktiviert und kann überhaupt nicht angeklickt werden. Auf die Weise kann auch kein Dummydatum eingetragen werden und die Speicherung eines evtl. leeren Feldes findet gar nicht erst statt.

So hatte ich das gemeint. :)

Luckie 16. Sep 2002 09:18

Dann wird der Benutzer aber wieder gezwungen ein falsches datum einzugeben, sonst geht es nicht weiter. :(

Ich wollte dass, wenn das Feld leer bleibt das Programm ein Dummydatum eingibt, welches beim Anzeigen unterdrückt wird.

MathiasSimmack 16. Sep 2002 09:28

Zitat:

Zitat von Luckie
Dann wird der Benutzer aber wieder gezwungen ein falsches datum einzugeben, sonst geht es nicht weiter.

Ist richtig, lässt sich aber z.B. mit dem TMaskEdit und einer Datumsmaske umgehen, weil du da keine andere Möglichkeit hast, als das Format einzuhalten. Und dann gibt´s da ja noch das "OnChange"-Event, in dem du das Format auch schon mal prüfen kannst.

Zitat:

Ich wollte dass, wenn das Feld leer bleibt das Programm ein Dummydatum eingibt, welches beim Anzeigen unterdrückt wird.
Das verstehe ich schon, lieber Luckie. :) - Aber was will eigentlich m-werk? :wink:

btw: Ich orientiere mich bei solchen Dingen aber lieber an professioneller Software, die Buttons usw. erst aktiviert, wenn die entsprechenden Bedingungen erfüllt sind. Sagen wir als kleines Beispiel:

Eine Adressdatenbank (:roll:) nutzt eine CHM-Hilfedatei über den "ShellExecute"-Befehl. Das wird unter Win95 und NT4 ohne Html-Help-Update nicht klappen. Der Befehl ist aber dennoch verfügbar und kann ausprobiert werden.
Mit der Html-Help-API von den JEDIs kann man allerdings mit einer Bool-Variable prüfen, ob die CHM-Hilfe überhaupt möglich ist und den Befehl abhängig davon aktivieren oder deaktivieren.

Hat zwar nichts mit dem Thema zu tun, verdeutlicht aber den Weg, den ich versuche zu gehen.


Aber mal was anderes -
Was bedeutet
Zitat:

falsches datum
in dem Zusammenhang? Wenn ich als Geburtsdatum z.B. den 29. Februar 2379 eingebe, dann ist das Datumsformat korrekt - nur es liegt in der Zukunft. 8) Reagiert das Programm eigentlich auf solch offensichtlichen Unsinn?

Luckie 16. Sep 2002 09:32

Redest du von einer bestimmten Adressdatenbank? :angle2:

MathiasSimmack 16. Sep 2002 11:10

Äh, ... nein, das war nur ein fi(c)ktives Beispiel. :wink:

Luckie 16. Sep 2002 11:19

Na dann bin ich aber beruhigt. :mrgreen:

Hansa 16. Sep 2002 11:48

Hallo Leute,

habe so ein ähnliches Problem. Das hier jetzt mit dem Datum habe ich so gelöst : Bei einem neuen Datensatz belege ich die Felder mit einem Datum, das es nicht gibt. Das mit 1899 ein guter Vorschlag. Hab es aber umgekehrt gemacht. Nehme MaxDate (Konstante), glaube es ist der 31.12.2078. Ist so etwas in Delphi nicht schon vordefiniert?

Jetzt aber meine Frage : Bei mir soll ein nicht gefülltes Editfeld auch nicht verlassen werden, außer in einem Fall, wenn der ENDE Button gedrückt wird. Habe hierfür Edit1.Setfocus verwendet, solange bis etwas drin steht. Weiß der User aber gar keinen Wert, wird er gezwungen irgendeinen einzugeben, um dann ENDE zu clicken. Andernfalls kommt er nicht dran.

Gefällt mir nicht besonders. Der ENDE Button ist eigentlich dafür gedacht, diesen Programmteil zu verlassen.

Gruß
Hansa

City Light 18. Sep 2002 10:29

Hallo Hansa!

Was soll denn in deiner Edit für Wert eingeben werdern?

Hansa 18. Sep 2002 11:11

Hallo City Light,

Es soll in einer Schleife laufen :

1. Eingabe Art.Nr. (das ist das besagte Feld)
2. Editieren der anderen Felder
3. wieder bei 1. anfangen

Damit ich hier keine Endlosschleife produziere ist die Ende-Bedingung halt mein Ende-Button. Da ich keinen Preis ändern kann, sofern die Art.Nr. noch gar nicht bekannt ist, darf das Feld nicht leer sein. NUR in einem Fall : ich will etwas anderes machen ! Z.B. weil ich die Nr. gar nicht weiß.

Code:
procedure TKGeingabe.Edit1Exit(Sender: TObject);
begin
  IF StrVorhanden (Edit1.Text) THEN BEGIN
    Edit1.Enabled := false; // KG-Nr. nicht editierbar
    WITH DataModule2.KGdatenSatz DO BEGIN
                             // hier wird der Datensatz gesucht usw.
    END;
    DBedit2.SetFocus;       // Focus auf erstes DB-Feld
  END
  ELSE
    Edit1.SetFocus;
end;

Wie man sieht, wird Edit1.SetFocus immer aufgerufen, falls Edit1.text leer ist und jemand versucht, das Feld trotzdem zu verlassen. Dadurch erreiche ich einerseits, daß die Felder erst benutzt werden können, sofern ein Datensatz verfügbar ist, aber an den Ende Button komme ich so auch nicht dran. Das SetFocus funktioniert zwar, aber es ist in diesem Fall zu "streng".

Gruß
Hansa

@Admin : obiger Quelltext ließ sich bei mir nicht in ein Code - Fenster bringen. ?????

Syntax hinzugefügt&UBBCode entdeaktiviert :mrgreen: - FuckRacism

RomanK 18. Sep 2002 11:20

Du hattest den UBBCode deaktiviert!!!!

Code machst du mit
Code:
 dein Code

Hansa 18. Sep 2002 11:46

@FuckRacism : Aha. Prompte Antwort.

City Light 18. Sep 2002 14:35

Hi Hansa!

Ich sitze noch immer dran!! was ich bisher erreicht ist das hier

Code:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text = '' Then
  if MessageDlg('Es wurden keine Eingaben gemacht'#13#10#13#10'Eingabe fortzetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
   begin
     Edit1.Enabled := False;
     Edit1.Color := ClBtnFace;
     Button1.SetFocus;
   end
   else
     Edit1.SetFocus;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 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-2025 by Thomas Breitkreuz