Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Edit-Feld im Exit-Ereignis prüfen (https://www.delphipraxis.net/75730-edit-feld-im-exit-ereignis-pruefen.html)

Ati 24. Aug 2006 07:41


Edit-Feld im Exit-Ereignis prüfen
 
Moin,

ich möchte den Text in einem Edit-Feld beim verlassen auf gewisse Sachen prüfen/untersuchen.
In diesem Feld darf nur unser Lieferantenkürzel stehen. Unser Lieferantenkürzel setzt sich aus den ersten vier Buchstaben und einer fortlaufenden Nummer (Bsp. Siemens = Siem01). Leider kann ich bei Lazarus ein MaskEdit-Feld nicht so einstellen das die blöden Unterstriche nicht erscheinen (zumindest habe ich es nicht rausgefunden). Also nehme ich ein normales Edit-Feld. Ich hatte es mal mit folgendem Code versucht:
Delphi-Quellcode:
if lief[1] not in ['A'..'Z'] then
    showmessage('Fehlerhafter Lieferant. Bitte prüfen!!');
Doch meckert hier der Compiler das "Then" erwartet aber "not" gefunden. Wie muß der Code richitg aussehen??

Ati

Mavarik 24. Aug 2006 07:46

Re: Edit-Feld im Exit-Ereignis prüfen
 
hmm

Delphi-Quellcode:
if not(lief[1] in ['A'..'Z']) then
    showmessage('Fehlerhafter Lieferant. Bitte prüfen!!');
So? Ungetestet

Ati 24. Aug 2006 07:49

Re: Edit-Feld im Exit-Ereignis prüfen
 
Danke klappt!!

Hawkeye219 24. Aug 2006 07:57

Re: Edit-Feld im Exit-Ereignis prüfen
 
Ich würde zuvor prüfen, ob der String leer ist. Bei Leerstrings führt der Zugriff auf ein Zeichen zu einer AV.

Delphi-Quellcode:
if (lief = '') or (not (lief[1] in ['A'..'Z'])) then
  showmessage('Fehlerhafter Lieferant. Bitte prüfen!!');
Der Code setzt den Vorgabewert für die Kurzschlußauswertung ({$B-} oder {$BOOLEVAL OFF}) voraus.

Gruß Hawkeye

Jelly 24. Aug 2006 08:00

Re: Edit-Feld im Exit-Ereignis prüfen
 
Man beachte aber, dass das OnExit Ereignis nicht immer auftritt. Wenn Du z.B. ein Speedbutton nutzt, um irgendeine Aktion auszuführen (z.b. Datensatz in einer Datenbank speichern), so bleibt der Fokus auf dem Edit Feld, und löst kein OnExit aus...

Ati 24. Aug 2006 08:08

Re: Edit-Feld im Exit-Ereignis prüfen
 
Danke für eure Anregungen. Habe mal versucht den Fehler mit dem leeren String zu provozieren, hat aber insofern nicht funktioniert, das ich erstens mit der Tab-Taste sofort weitergegangen bin und gar keine Fehlermeldung kam. Zweistens ich einfach mit Leerzeichen in die Mitte des Edit-Feldes gegangen bin und dann das Feld verlassen habe. Hier kam sofort die vorgefertigte Fehlermeldung. Also auch in Ordnung so. Ich werde aber beim Speichern des DS sowieso nochmal alle Pflichtfelder überprüfen, ob Eingaben gemacht wurden.

Helmi 24. Aug 2006 08:10

Re: Edit-Feld im Exit-Ereignis prüfen
 
Hallo,

du kannst natürlich auch ein MaskEdit verwenden (mit Trick was ich grad rausgefunden habe).

Nimm ein MaskEdit und mach im OnCreate der Form folgendes:

Delphi-Quellcode:
var
  S: String;

begin
  S := #32;                                 //Leerzeichen

  MaskEdit1.EditMask := 'AAA00;1;' + S;    //A = Buchstaben-Eingabe erforderlich, 0=Zahl-Eingabe erforderlich
end;
So werden die Unterstriche ausgeblendet (da nicht mehr Unterstriche sondern Leerzeichen angezeigt werden)

[edit]
es geht auch so:

Delphi-Quellcode:
begin
  MaskEdit1.EditMask := 'AAA00;1;' + #32;   //A = Buchstaben-Eingabe erforderlich, 0=Zahl-Eingabe erforderlich + Leerzeichen
[/edit]

Hawkeye219 24. Aug 2006 08:19

Re: Edit-Feld im Exit-Ereignis prüfen
 
Zitat:

Zitat von Ati
Habe mal versucht den Fehler mit dem leeren String zu provozieren, hat aber insofern nicht funktioniert, das ich erstens mit der Tab-Taste sofort weitergegangen bin und gar keine Fehlermeldung kam.

Das läßt darauf schließen, daß du ShortStrings (also Strings mit einer festen Längenangabe) verwendest. In diesem Fall ist der Zugriff auf die Zeichen möglich, der gelieferte Wert ist aber unter Umständen undefiniert. Bei dynamischen Strings (string - ohne Längenangabe) wird der Fehler auch bei einem Wechsel mit der Tab-Taste auftreten.

Gruß Hawkeye

Ati 24. Aug 2006 08:43

Re: Edit-Feld im Exit-Ereignis prüfen
 
@Helmi
Stimmt das würde auch unter Lazarus so funktionieren.

@Hawkeye
Stimmt ich prüfe auch auf die Länge und verlange 6 Zeichen.

Ich schätze es ist jetzt mehr eine philosophische Frage was ich wie mache. Ich denke aber ich benutze die bisherige Variante, da sie ja ohne Probleme funktioniert (zumindest bis jetzt)

Ati 24. Aug 2006 11:11

Re: Edit-Feld im Exit-Ereignis prüfen
 
Leider muß ich dieses Thema nochmal aufrollen. Ich bin jetzt schon erheblich weiter mit meinem Programm und nun habe ich einen Button eingefügt, welcher alle Text-Elemente löschen soll. Wenn jetzt aber das vorhergenannte Feld den Fokus hat und ich den Clean-Button drücke, dann kommen natürlich die ganzen Fehlermeldungen. Kann ich das in diesem Fall umgehen??

mkinzler 24. Aug 2006 11:14

Re: Edit-Feld im Exit-Ereignis prüfen
 
Zitat:

Kann ich das in diesem Fall umgehen??
Beim Klicken des claen-Buttons, den Focus wechseln.

Jürgen Thomas 24. Aug 2006 11:18

Re: Edit-Feld im Exit-Ereignis prüfen
 
Zitat:

Zitat von mkinzler
Zitat:

Kann ich das in diesem Fall umgehen??
Beim Klicken des claen-Buttons, den Focus wechseln.

Und zwar zuerst SetFocus, erst danach aufräumen!

Außerdem kann in OnExit geprüft werden, ob Sender <> CleanButton usw. ist.

Jürgen

Ati 24. Aug 2006 11:35

Re: Edit-Feld im Exit-Ereignis prüfen
 
SetFocus klappt nicht. Aber wie kann ich den Sender ermittlen??

mkinzler 24. Aug 2006 11:39

Re: Edit-Feld im Exit-Ereignis prüfen
 
Zitat:

Aber wie kann ich den Sender ermittlen??
Parameter Sender :)

Ati 24. Aug 2006 11:55

Re: Edit-Feld im Exit-Ereignis prüfen
 
:wiejetzt:

oldmax 24. Aug 2006 12:06

Re: Edit-Feld im Exit-Ereignis prüfen
 
Hi
Wie wär's einfach mit einem Ausblenden der OnExit _ Ereignisprocedure ?
Delphi-Quellcode:
Procedure MyForm.MyButtonClick(Sender: Tobject);
Begin
  MyEdit.OnExit:=Nil;
   ....
    aufräumen
   ....
  MyEdit.OnExit:=MyEditExit;
end;
oder so ungefähr, da ich deinen Quellcode nicht kenne.
Gruß oldmax

Ati 24. Aug 2006 12:12

Re: Edit-Feld im Exit-Ereignis prüfen
 
Hat leider auch nicht geklappt. Hier mal der Code des onExit-Ereignisses:
Delphi-Quellcode:
procedure TfrmMain.edliefExit(Sender: TObject);
var i,j:Integer;
    lief:String;
begin
  lief:= edlief.text;
  j:=length(lief);
  if j <> 6 then
  begin
  showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
  edlief.clear;
  edlief.SetFocus;
  exit;
  end;
  for i := 1 to length(lief) do
  begin
    if not (lief[1] in ['A'..'Z']) then
    begin
    showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
    edlief.Clear;
    edlief.SetFocus;
    exit;
    end;
    if not (lief[2] in ['A'..'Z']) then
    begin
    showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
    edlief.Clear;
    edlief.SetFocus;
    exit;
    end;
    if not (lief[3] in ['A'..'Z']) then
    begin
    showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
    edlief.Clear;
    edlief.SetFocus;
    exit;
    end;
    if not (lief[4] in ['A'..'Z']) then
    begin
    showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
    edlief.Clear;
    edlief.SetFocus;
    exit;
    end;
    if not (lief[5] in ['0'..'9']) then
    begin
    showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
    edlief.Clear;
    edlief.SetFocus;
    exit;
    end;
    if not (lief[6] in ['0'..'9']) then
    begin
    showmessage('Fehlerhafte Lieferanteneingabe. Bitte prüfen!!');
    edlief.Clear;
    edlief.SetFocus;
    exit;
    end;
  end;
end;
Die Clear-Prozedur sieht wie folgt aus:

Delphi-Quellcode:
Procedure TfrmMain.clear();
var i:Integer;
begin
  for i := 0 to frmMain.ComponentCount -1 do
  begin
  if (Components[i] is TEdit) then
  begin
    (TEdit(frmMain.Components[i]).Clear);
  end;
  end;
  dcb.Text:='';
end;

Christian Seehase 24. Aug 2006 12:35

Re: Edit-Feld im Exit-Ereignis prüfen
 
Moin Ati,

also ich würde die Prüfung erst einmal in eine eigene Funktion auslagern:

Delphi-Quellcode:
function IsValidLieferantenNummer(const AsLiefNr : string) : boolean;

var
  i : integer;

begin
  Result := false;
  if length(AsLiefNr) <> 6 then exit;
  for i := 1 to length(AsLiefNr) do begin
    if i <= 4 then begin
      if not (AsLiefNr[i] in ['A'..'Z']) then exit;
    end else begin
      if not (AsLiefNr[i] in ['0'..'9']) then exit;
    end;
  end;
  Result := true;
end;

Ati 24. Aug 2006 12:41

Re: Edit-Feld im Exit-Ereignis prüfen
 
Das hatte ich jetzt gerade auch schon gemacht...wobei Deine Funktion um ein vielfaches einfacher/besser ist als meine. Danke!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz