Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mehre Edit Felder auf Inhalt prüfen? (https://www.delphipraxis.net/121466-mehre-edit-felder-auf-inhalt-pruefen.html)

Johnny Bravo 28. Sep 2008 10:59


Mehre Edit Felder auf Inhalt prüfen?
 
Hi leute,
ich stehe vor einen Problem bzw. einem Denkfehler. Ich habe 3 Edit Felder. Wenn man auf einen Button klickt, sollen die Werte von 2 Edit Felder berechnet werden - dabei wird das 3te Edit deaktiviert - man kann also immer nur in 2 Edits eine Eingabe machen, egal in welche die zahlen eingetippt werden.
Es sollen sich in mindestens 2 Edits Werte befinden, ansonsten kommt ein Hinweis.

Das Problem sieht folgendermaßen aus:
Ein Edit auf den Inhalt zu Prüfen ist ja nicht schwer. Doch wie mache ich das mit mehreren Feldern?
Mein Code sieht folgendermaßen aus: (Hab nur etwas rumprobiert, also bitte nicht wundern ;) )


Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);                                
var Strom, Spannung, Widerstand: integer;
begin
  if Edit1.Text = '' then
  if Edit2.Text = '' then
     MessageDlg('Bitte geben sie mindestens 2 Werte an!',mtInformation, [mbYes], 0)
else begin
  if Edit1.GetTextLen >= 1 then
  if Edit2.GetTextLen >= 1 then
     Spannung        := StrToInt(Edit1.Text);
     Strom           := StrToInt(Edit2.Text);
     Ergebnis.Caption := FloatToStr(StrToFloat(Edit1.Text) / StrToFloat(Edit2.Text));
   end

else
  if Edit1.Text = '' then
  if Edit3.Text = '' then
     MessageDlg('Bitte geben sie mindestens 2 Werte an!',mtInformation, [mbYes], 0)
else begin
  if Edit1.GetTextLen >= 1 then
  if Edit3.GetTextLen >= 1 then
     Spannung        := StrToInt(Edit1.Text);
     Widerstand      := StrToInt(Edit3.Text);
     Ergebnis.Caption := FloatToStr(StrToFloat(Edit1.Text) / StrToFloat(Edit3.Text));
   end

else
  if Edit2.Text = '' then
  if Edit3.Text = '' then
     MessageDlg('Bitte geben sie mindestens 2 Werte an!',mtInformation, [mbYes], 0)
else begin
  if Edit2.GetTextLen >= 1 then
  if Edit3.GetTextLen >= 1 then
     Strom           := StrToInt(Edit2.Text);
     Widerstand      := StrToInt(Edit3.Text);
     Ergebnis.Caption := FloatToStr(StrToFloat(Edit2.Text) * StrToFloat(Edit3.Text));
   end
end;
Ich wäre euch dankbar wenn ihr mir helfen könntet.

mfg

Apollonius 28. Sep 2008 11:02

Re: Mehre Edit Felder auf Inhalt prüfen?
 
Anscheinend bist du mit den Operatoren zur Bearbeitung von Wahrheitswerten nicht vertraut. Hier benötigst du or:
Delphi-Quellcode:
if (Edit1.Text = '') or (Edit2.Text = '') then
Außerdem fehlen einige begin-end-Paare.

Hawkeye219 28. Sep 2008 11:18

Re: Mehre Edit Felder auf Inhalt prüfen?
 
Hallo,

was hältst du vom folgenden Ansatz?

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);                                
const
  flagSpannung  = 1;
  flagStrom     = 2;
  flagWiderstand = 4;
var
  Flags, Strom, Spannung, Widerstand : Integer;
begin
  Flags := 0;
  if TryStrToInt(Edit1.Text, Spannung) then
    Flags := Flags or flagSpannung;
  if TryStrToInt(Edit2.Text, Strom) then
    Flags := Flags or flagStrom;
  if TryStrToInt(Edit3.Text, Widerstand) then
    Flags := Flags or flagWiderstand;

  case Flags of
 
    flagSpannung or flagStrom:
      Ergebnis.Caption := FloatToStr(Spannung / Strom);

    flagSpannung or flagWiderstand:
      Ergebnis.Caption := FloatToStr(Spannung / Widerstand);

    flagStrom or flagWiderstand:
      Ergebnis.Caption := FloatToStr(Strom * Widerstand);

  else
    // hier Fehlerbehandlung einfügen
  end;
end;
Die Feinheiten (Validierung der Eingabewerte, Fehlerbehandlung, bessere Ausgabe) überlasse ich dir.

Gruß Hawkeye

Sharky 28. Sep 2008 11:20

Re: Mehre Edit Felder auf Inhalt prüfen?
 
Hai ohnny Bravo,

wenn Du das öfters in deinem Code brauchst würde ich eventuell eine Funktion zum prüfen verwenden. z.B. so:
Delphi-Quellcode:
function OneEditIsEmpty(aEdits: array of TEdit): Boolean;
var
  i: Integer;
begin
  i := Low(aEdits);
  result := False;
  repeat
    result := Length(aEdits[i].Text) = 0;
    inc(i);
  until (i = High(aEdits) + 1) or (result);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if OneEditIsEmpty([edit1, edit2]) then
  begin
    ShowMessage('Edit1 oder Edit2 sind leer');
  end;
end;

Johnny Bravo 28. Sep 2008 11:30

Re: Mehre Edit Felder auf Inhalt prüfen?
 
Hey Leute, danke für eure Antworten. Mit And und Or hab ich es schon versucht - hat aber nicht geklappt, keine ahnung warum.

@Hawkeye219
Danke, genauso hab ich mir das vorgestellt, das funktioniert wunderbar. Irgendwie hab ich einen falschen ansatz gewählt. Wieso einfach wenns auch schwer geht? :stupid:

@Sharky
Das wäre nützlich, das stimmt. Is aber das einzige mal wo ich das benötige. :wink:

Danke leute, ihr habt mir sehr geholfen - und das an einem sonnigen Sonntag :hello:

Johnny Bravo 28. Sep 2008 15:22

Re: Mehre Edit Felder auf Inhalt prüfen?
 
Hi,
Ich hab noch ein kleinen Schönheitsfehler :cry:

Funktioniert auch alles wunderbar, doch leider zeigt das Label das Ergebnis unschön an.
Ich habe per
Delphi-Quellcode:
Ergebnis.Constraints.MaxWidth := 125;
die max. größe eingestellt.

Ausserdem hab ich den Editfeldern eine max. Länge von 4 Zeichen gegeben, und den Code von Hawkeye219 hab ich folgendermaßen ergänzt:
Delphi-Quellcode:
Ergebnis.Caption := FloatToStr(Spannung / Widerstand) + ' A'
Damit wird dem Ergebnis automatisch die Maßeinheit angehangen.

Wenn ich jetzt große werte eingebe, wird das Ergebnis inkorrekt dargestellt. In den eigenschaften des Labels hab ich Autosize und WordWrap deaktivert.

Mit
Delphi-Quellcode:
Ergebnis.Caption := FloatToStr(Round(Spannung / Widerstand)) + ' A'
hab ich es auch schon versucht,das klappt halbwegs, allerdings brauch ich mindestens 3 nachkomma stellen.

Was kann ich da machen?
Würde mich über Hilfe freuen :)

mfg


EDIT:
Habs jetzt folgendermaßen gelöst:
Delphi-Quellcode:
Ergebnis.Caption := FloatToStr((Round((Spannung / Widerstand)*1000))/1000) + ' A';


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