Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abfrage von Eingabefeldern... Problem (https://www.delphipraxis.net/50929-abfrage-von-eingabefeldern-problem.html)

Kara 3. Aug 2005 07:18


Abfrage von Eingabefeldern... Problem
 
Hallo!

Ich mach momentan ein Praktikum und habe zur Aufgabe, ein in Delphi II mit ObjektPascal geschriebenes Programm anzupassen und zu aktualisieren.
Unter anderem soll ich eine Abfrage schreiben, die überprüft, ob in einem Eingabeformular alle Felder gefüllt sind. Das krieg ich ja noch hin. Aber ich schaffe es nicht, dass bei Feststellung eines leeren Feldes (was nicht sein darf), wieder zum Eingabeformular zurückgesprungen wird, nachdem der Hinweis "Geben Sie... ein" gekommen ist.
Ich hab einfach keine Ahnung, wie das gehen soll. Ich bin nicht so tief drin in Delphi...

Ich häng mal den Codeabschnitt an. Hoffentlich könnt ihr mir helfen.
Momentan kommt das Hinweisfenster, dass eines der Felder nicht ausgefüllt ist und wenn man auf OK klickt, startet trotzdem normal das eigentliche Programm. Das sollte nicht sein, sondern das Eingabefenster sollte wieder erscheinen oder alternativ das Programm komplett schließen.

Und nun der Code:
Delphi-Quellcode:
procedure TFormIdentPunktEingabe.BitBtnOKClick(Sender: TObject);
begin
  TimerSec.Enabled:=false;
  Label2.Visible:=false;
  LabelSekunden.Visible:=false;
  Label4.Visible:=false;
  try
     if (EditIdentPunkt.Text = '') then
        begin
             MessageDlg('Bitte Ident Punkt eingeben!', mtWarning, [mbOk], 0);
             EditIdentPunkt.SetFocus;
        end
        else if (EditEIP.Text = '') then
             begin
                  MessageDlg('Bitte eigene IP-Adresse eingeben!', mtWarning, [mbOk], 0);
                  EditEIP.SetFocus;
             end
             else if (EditFIP.Text = '') then
                  begin
                       MessageDlg('Bitte fremde IP-Adresse eingeben!', mtWarning, [mbOk], 0);
                       EditFIP.SetFocus;
                  end
                  else if (EditSubnet.Text = '') then
                       begin
                            MessageDlg('Bitte Subnetmask-Nummer eingeben!', mtWarning, [mbOk], 0);
                            EditSubnet.SetFocus;
                       end
                       else if (EditGateway.Text = '')then
                            begin
                                 MessageDlg('Bitte Gateway Nummer eingeben!', mtWarning, [mbOk], 0);
                                 EditGateway.SetFocus;
                            end
        else
       IdentPunkt:=EditIdentPunkt.Text;
       IP_CRS:=EditEIP.Text;
       IP_SPS:=EditFIP.Text;
       Subnet_CRS:=EditSubnet.Text;
       Gateway_CRS:=EditGateway.Text;
       NurTNR:=Label11.Caption;
       Close;
  except
    MessageDlg('Bitte Programm neu starten und alle Felder ausfüllen!', mtWarning,[mbOk], 0);
  end
end;

RavenIV 3. Aug 2005 07:22

Re: Abfrage von Eingabefeldern... Problem
 
servus

zur Übung gibst du den quellcode mit delphi-Tags ein.
so wie der code ist, kann den kein mensch lesen...

gruessle

Kara 3. Aug 2005 07:26

Re: Abfrage von Eingabefeldern... Problem
 
Ah, sowas gibts :-D

Jasocul 3. Aug 2005 07:33

Re: Abfrage von Eingabefeldern... Problem
 
Wenn du nach der Prüfung ein "Close" machst, kann es auch nicht funktionieren.
Ich vermute, dass du beim "else" das begin..end vergessen hast.

RavenIV 3. Aug 2005 07:33

Re: Abfrage von Eingabefeldern... Problem
 
Zitat:

Zitat von Kara
Ah, sowas gibts :-D

ja, genau.
in dem Fenster, wo du den Beitrag editierst, ist eine Zeile mit verschiedenen Buttons.
einer davon heisst "Delphi-Code", wenn du damit arbeitest, sieht das ergebnis so aus:
Delphi-Quellcode:
function test(parameter: string);
begin
  testcode;
end;
gruessle

Kara 3. Aug 2005 07:35

Re: Abfrage von Eingabefeldern... Problem
 
Hast du nicht geschaut? Ich habs schon gemacht.
Jetzt kannst du ja mal schauen, ob mir zu helfen ist :mrgreen:

Jasocul 3. Aug 2005 07:42

Re: Abfrage von Eingabefeldern... Problem
 
Dir ist nicht zu helfen. :roll: :zwinker:
Ich habe dir dich schon einen Hinweis gegeben.

Kara 3. Aug 2005 07:45

Re: Abfrage von Eingabefeldern... Problem
 
Oh! :oops:
Vor lauter Tags übersehen.
Ich probiers mal. Also Close weglassen...
*rumtüdel*

Edit: jetzt gehts.
Aber ich hab ein weiteres Problem entdeckt: Wenn ich auf Abbrechen gehe, sollte er das gesamte Programm schließen, schließt aber mit Close wieder nur das Eingabefenster.
:gruebel: Ich bin echt nicht für Delphi geschaffen, fürcht ich.

Jasocul 3. Aug 2005 07:52

Re: Abfrage von Eingabefeldern... Problem
 
Close bezieht sich immer nur auf das aktuelle Fenster.
Für deinen Fall benötigst du Application.Terminate.
Obwohl ich es geschickter fände, das Eingabe-Fenster Modal (ShowModal statt Show) zu machen und das ModalResult im Hauptfenster zu prüfen und dort das Programm zu beenden.

Kara 3. Aug 2005 08:01

Re: Abfrage von Eingabefeldern... Problem
 
:shock:
Ok. Aber mit Application.Terminate würde es gehen?

(Danke übrigens schon mal für die schnelle Hilfe!!)

Die Muhkuh 3. Aug 2005 08:03

Re: Abfrage von Eingabefeldern... Problem
 
Zitat:

Zitat von Kara
:shock:
Ok. Aber mit Application.Terminate würde es gehen?

Ja

Sharky 3. Aug 2005 08:14

Re: Abfrage von Eingabefeldern... Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hai Kara,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXis" :hi:

Es würde zwar gehen ist aber keine schöne Lösung ;-)

Im Anhang ist mal ein ganz einfaches Demo:

Kara 3. Aug 2005 08:32

Re: Abfrage von Eingabefeldern... Problem
 
Danke :)
Ich bin sehr froh, dass ich euch gefunden habe.

Leider krieg ich bei deiner Demo den Fehler "ungültiges Streamformat" und kanns nicht laufen lassen.
Aber es klappt mit Application.Terminate tatsächlich. :hello:

Ich habs sogar hingekriegt, dass er nach Ablauf des Timers und bei Drücken des Abbrechen-Buttons alles zumacht, wenn ein Feld nicht ausgefüllt ist.

Delphi-Quellcode:
procedure TFormIdentPunktEingabe.BitBtnAbbruchClick(Sender: TObject);
begin
  TimerSec.Enabled:=false;
  Label2.Visible:=false;
  LabelSekunden.Visible:=false;
  Label4.Visible:=false;
  if (EditIdentPunkt.Text = '') or (EditEIP.Text = '') or (EditFIP.Text = '') or (EditSubnet.Text = '') or (EditGateway.Text = '') then
          begin
            Application.terminate;
          end
       else
  Close;
end;

procedure TFormIdentPunktEingabe.TimerSecTimer(Sender: TObject);
var
  SekAkt:integer;
begin
  SekAkt:=StrToInt(LabelSekunden.Caption)-1;
  if SekAkt <=0 then
  begin
    TimerSec.Enabled:=false;
       if (EditIdentPunkt.Text = '') or (EditEIP.Text = '') or (EditFIP.Text = '') or (EditSubnet.Text = '') or (EditGateway.Text = '') then
          begin
            Application.terminate;
          end
       else
          Close;
  end
  else
      begin
      LabelSekunden.Caption:=IntToStr(SekAkt);
      end;
end;
Jetzt müsste ich nur vielleicht vorher noch ein Hinweisfenster aufmachen, das sagt, dass das Programm neu gestartet werden soll, und alle Felder gefüllt werden sollen. Aber irgendwie ist das umständlich.

Khabarakh 3. Aug 2005 08:38

Re: Abfrage von Eingabefeldern... Problem
 
Eines musst du beachten: Application.Terminate überspringt im Gegensatz zu Close die Events beim Schließen wie z.B. OnClose.

Kara 3. Aug 2005 08:43

Re: Abfrage von Eingabefeldern... Problem
 
Was heißt das für mich konkret?

Ich hab im Code jetzt einfach ein "MessageDlg('Bitte Programm neu starten und alle Felder ausfüllen', MtWarning, [mbOk], 0) vor Application.Terminate gesetzt. (Beim Timer und Abbruch)
Das ist zwar nicht der feine Weg, aber es klappt.

Khabarakh 3. Aug 2005 09:09

Re: Abfrage von Eingabefeldern... Problem
 
Wenn du irgendeinen Eventhandler hast, der auf das Schließen einer Form o.Ä. reagiert, wird dieser einfach übersprungen. Falls du keinen hast oder es so beabsichtigt ist, kannst du ruhig Application.Terminate verwenden (bloß nicht Delphi-Referenz durchsuchenHalt :wink: ).

Kara 3. Aug 2005 09:13

Re: Abfrage von Eingabefeldern... Problem
 
Achso, nein hab ich keinen.
Damit ist meine Frage auch schon beantwortet.
Vielen Dank!

Kara 3. Aug 2005 10:49

Re: Abfrage von Eingabefeldern... Problem
 
Jetzt habe ich doch noch eine Frage: Wie kann ich mit Delphi bzw Pascal den PC rebooten?

Sharky 3. Aug 2005 11:02

Re: Abfrage von Eingabefeldern... Problem
 
Zitat:

Zitat von Kara
Jetzt habe ich doch noch eine Frage: Wie kann ich mit Delphi bzw Pascal den PC rebooten?

Hai Kara,

mache bitte für jede Frage einen eigenen Thread auf. Danke.

BTW: zum rebooten wirst Du in der DP sicher etwas finden.

Kara 3. Aug 2005 11:04

Re: Abfrage von Eingabefeldern... Problem
 
ok, dann schau ich erstmal da

Kara 3. Aug 2005 13:41

Re: Abfrage von Eingabefeldern... Problem
 
Mist!
Jetzt hab ich grad festgestellt, dass ich ein anderes Problem habe:
Jasocul hat mir geraten das Close wegzumachen. Aber das ist ja schlecht, denn das Dialogfenster soll sich ja schließen, wenn in alle Felder etwas eingetragen ist. Es soll nur dann offen bleiben, wenn in irgendeinem der Felder nichts drin steht.

Hab ich das Close im Code, schließt das Fenster immer, hab ich es nicht dring, schließt es gar nicht (bei Klick auf OK).

Nochmal den Code:
Delphi-Quellcode:
procedure TFormIdentPunktEingabe.BitBtnOKClick(Sender: TObject);
begin
  TimerSec.Enabled:=false;
  Label2.Visible:=false;
  LabelSekunden.Visible:=false;
  Label4.Visible:=false;
  try
     if (EditIdentPunkt.Text = '') then
        begin
             MessageDlg('Bitte Ident Punkt eingeben!', mtWarning, [mbOk], 0);
             EditIdentPunkt.SetFocus;
        end
        else if (EditEIP.Text = '') then
             begin
                  MessageDlg('Bitte eigene IP-Adresse eingeben!', mtWarning, [mbOk], 0);
                  EditEIP.SetFocus;
             end
             else if (EditFIP.Text = '') then
                  begin
                       MessageDlg('Bitte fremde IP-Adresse eingeben!', mtWarning, [mbOk], 0);
                       EditFIP.SetFocus;
                  end
                  else if (EditSubnet.Text = '') then
                       begin
                            MessageDlg('Bitte Subnetmask-Nummer eingeben!', mtWarning, [mbOk], 0);
                            EditSubnet.SetFocus;
                       end
                       else if (EditGateway.Text = '')then
                            begin
                                 MessageDlg('Bitte Gateway Nummer eingeben!', mtWarning, [mbOk], 0);
                                 EditGateway.SetFocus;
                            end
        else
       IdentPunkt:=EditIdentPunkt.Text;
       IP_CRS:=EditEIP.Text;
       IP_SPS:=EditFIP.Text;
       Subnet_CRS:=EditSubnet.Text;
       Gateway_CRS:=EditGateway.Text;
       NurTNR:=Label11.Caption;
       Close;                  <---------------------------------------<<
  except
    MessageDlg('Bitte Programm neu starten und alle Felder ausfüllen!', mtWarning,[mbOk], 0);
  end
end;

Kara 8. Aug 2005 08:04

Re: Abfrage von Eingabefeldern... Problem
 
<-- blind...
Hat sich erledigt, danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 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