Delphi-Rechner (Strom-Spannungs-Widerstands-Rechner)

Katzenstreu

Enthusiast
Thread Starter
Mitglied seit
21.11.2004
Beiträge
4.126
Ort
Hamburg
Hallo,

wir lernen gerade in der Schule die Grundkenntnisse von Delphi.

Wir sollen einen "Strom-Spannungs-Widerstands-Rechner" erstellen.

Man soll aus 2 beliebigen Angaben den dritten Wert berechnen.

=>

U=R*I
I=U/R
R=U/I

Außerdem sollen die möglichen Fehler (z.B: Division durch 0) mit EConvertError (try, except on, do begin) abgefangen werden.

Wünsche:
Ich möchte, dass der Wert, der nicht eingegeben wurde berechnet wird und in diesem Feld keine 0 drin stehen muss.

Hier erst ein Mal das Programm:

PHP:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    U_Eingabe_Ausgabe: TEdit;
    I_Eingabe_Ausgabe: TEdit;
    R_Eingabe_Ausgabe: TEdit;
    Beschriftung_Spannung: TLabel;
    Beschriftung_Stromstaerke: TLabel;
    Beschriftung_Widerstand_Leistung: TLabel;
    OK_Button: TButton;
    procedure OK_ButtonClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  U,I,R : real;

implementation

{$R *.dfm}

procedure TForm1.OK_ButtonClick(Sender: TObject);
begin
  try U:=StrToFloat(U_Eingabe_Ausgabe.Text);
   except on EConvertError do begin
    ShowMessage ('Bitte geben Sie in das angezeige Feld eine reelle Zahl ein!');
      U_Eingabe_Ausgabe.SetFocus;
   end;
  end;

    try I:=StrToFloat(I_Eingabe_Ausgabe.Text);
   except on EConvertError do begin
    ShowMessage ('Bitte geben Sie in das angezeige Feld eine reelle Zahl ein!');
      I_Eingabe_Ausgabe.SetFocus;
   end;
  end;

    try R:=StrToFloat(R_Eingabe_Ausgabe.Text);
   except on EConvertError do begin
    ShowMessage ('Bitte geben Sie in das angezeige Feld eine reelle Zahl ein!');
      R_Eingabe_Ausgabe.SetFocus;
   end;
  end;




    if (U=0) then U:=R*I;    // Wenn U=0 ist oder nichts ins Feld eingetragen ist, dann soll U:=R*I gerechnet werden. Wie geht das?
    if (I=0) then I:=U/R;
    if (R=0) then R:=U/I;

    {Erweiterungen:}

    if (U=0) and (I=0) and (R=0) then ShowMessage ('Bitte geben sie 2 Werte ungleich 0 an');

  U_Eingabe_Ausgabe.Text:=FloatToStr(U);
  I_Eingabe_Ausgabe.Text:=FloatToStr(I);
  R_Eingabe_Ausgabe.Text:=FloatToStr(R);


end;


end.

http://bp-freax.de/katzenstreu/Temp/Project1.exe

MfG
Tim ;)
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Statt die Variablen auf null zu überprüfen, wie du es gemacht hast:
Code:
if (U=0) then U:=R*I;
if (I=0) then I:=U/R;
if (R=0) then R:=U/I;

kannst du doch einfach prüfen, ob in den entsprechenden Edit Feldern etwas steht.
Code:
if (U_Eingabe_Ausgabe = '') then U := R * I;
//dasselbe dann noch für die anderen zwei
Wenn du willst kannst du die zwei Bedingungen natürlich auch mit einem logischen oder verbinden.
 
Das hier geht auch:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    txtR: TEdit;
    txtU: TEdit;
    txtI: TEdit;
    btnCalc: TButton;
    btnClose: TButton;
    lblR: TLabel;
    lblU: TLabel;
    lblI: TLabel;
    procedure btnCalcClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.btnCalcClick(Sender: TObject);
begin
  //Alle Felder sind leer
  if ((txtU.Text = '') and (txtR.Text = '') and (txtI.Text = '')) then
  begin
    ShowMessage('Bitte gültige Werte eingeben! Nur das Feld, welches berechnet werden soll, bleibt leer!');
    exit;
  end;

  //Das Feld für die Spannung ist leer -> berechne diese
  //Die beiden restlichen Felder müssen gültige Werte enthalten, ansonsten Warnung
  if (txtU.Text = '') then
  begin
    try
      txtU.Text := FloatToStr(StrToFloat(txtI.Text) * StrToFloat(txtR.Text));
    except
      on EConvertError do ShowMessage('Bitte gültige Werte eingeben! Nur das Feld, welches berechnet werden soll, bleibt leer!');
    end;
  end;

  //Das Feld für den Widerstand ist leer -> berechne diesen
  //Die beiden restlichen Felder müssen gültige Werte enthalten, ansonsten Warnung
  //Bei Divsion druch 0 ebenfalls Hinweis ausgeben!
  if (txtR.Text = '') then
  begin
    try
      txtR.Text := FloatToStr(StrToFloat(txtU.Text) / StrToFloat(txtI.Text));
    except
      on EConvertError do ShowMessage('Bitte gültige Werte eingeben! Nur das Feld, welches berechnet werden soll, bleibt leer!');
      on EZeroDivide do ShowMessage('Division durch Null: I darf nicht 0 sein!');
    end;
  end;

  //Das Feld für die Stromstärke ist leer -> berechne diese
  //Die beiden restlichen Felder müssen gültige Werte enthalten, ansonsten Warnung
  //Bei Divsion druch 0 ebenfalls Hinweis ausgeben!
  if (txtI.Text = '') then
  begin
    try
      txtI.Text := FloatToStr(StrToFloat(txtU.Text) / StrToFloat(txtR.Text));
    except
      on EConvertError do ShowMessage('Bitte gültige Werte eingeben! Nur das Feld, welches berechnet werden soll, bleibt leer!');
      on EZeroDivide do ShowMessage('Division durch Null: R darf nicht 0 sein!');
    end;
  end;
end;

end.
Ergebnis:

Project1.exe
 
Zuletzt bearbeitet:
Danke uch beiden!

Ich werde mir das gleich genauer ansehen ;)

Momentan brechne ich Zahlensysteme um (BIN, OCT, DEC, HEX). Das ist aber einfach nur Übung und hier sehr proaktisch vorgeführt. Man lässt rechnen und es wird der Rechenweg zu dem spezifischen Werten erkärt und beschrieben ;)

http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm

Kennt ihr eine Liste, in der steht, von wo nach wo man direkt umrechnen kann, und von wo bnnach wo man Umwege gehen muss?

Z.B. kann man direkt von DEC in HEX umrechen, aber nicht von BIN in HEX. Dafür benötigt man einen Zwischenschritt: BIN in DEZ in HEX.

MfG
Tim
 
Mal ein paar allg. Delphi Fragen:

Was sit die CASE-Anwendung?
Was sit eine Verbundanwendung?
 
Also
bei der Variablendeklaration heißt es nicht
Code:
U,I,R = real;
sondern
Code:
U,I,R: real;

Die Zeile
Code:
if (U=0) then R*I;
gibt keinen Sinn.
Richtig ist:
Code:
if (U=0) then U:=R*I;

und dann hast du irgendwas beim Speichern falsch gemacht. (immer "alles speichern" klicken).
So sollte die project1.dpr Datei eigentlich aussehen.
Code:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
dann klappts auch mit der .exe datei.

Case Anweisungen sind im Prinzip eine spezielle Art der if-Anweisung. Manch if Anweisungen lassen sich durch Case vereinfachen. Am besten liest du dazu die Hilfe.
 
Zuletzt bearbeitet:
Danke an euch beide ;)

Morgen werden wir die passenden Arbeit hierzu schreiben. Das sollte klappen ;)

MfG
Tim
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh