unit Main; //07.01.2011

{$mode objfpc}{$H+}

interface

uses Classes,SysUtils,FileUtil,Forms,Controls,Dialogs,StdCtrls;

type TFormGleichstrom=class(TForm)
      ButtonEnde       :TButton;
      ButtonBerechnen  :TButton;
      EditStatus       :TEdit;
      EditSpannung     :TEdit;
      EditStromstaerke :TEdit;
      EditLeistung     :TEdit;
      EditWiderstand   :TEdit;
      LabelSpannung    :TLabel;
      LabelStromstaerke:TLabel;
      LabelLeistung    :TLabel;
      LabelWiderstand  :TLabel;
      procedure ButtonBerechnenClick(Sender:TObject);
      procedure ButtonEndeClick(Sender:TObject);
     end;

var  FormGleichstrom:TFormGleichstrom;

implementation

{$R *.lfm}

procedure TFormGleichstrom.ButtonBerechnenClick(Sender:TObject);
Const ErgebnisFalsch=1E+30;
      Min           =1E-06;
      Max           =1E+06;
      DurchlaufMax  =10;
      MinWerte      =2;
Var   Spannung,Stromstaerke,Widerstand,Leistung:Boolean;
      U,I,R,P                                  :Extended;
      Durchlauf                                :Byte;
 Function IvonUundR(U,R:Extended):Extended;
 Begin
  If R<>0 Then Begin Stromstaerke:=True;IvonUundR:=U/R End
          Else IvonUundR:=ErgebnisFalsch
 End;
 Function IvonUundP(U,P:Extended):Extended;
 Begin
  If U<>0 Then Begin Stromstaerke:=True;IvonUundP:=P/U End
          Else IvonUundP:=ErgebnisFalsch
 End;
 Function IvonRundP(R,P:Extended):Extended;
 Begin
  If R<>0 Then Begin Stromstaerke:=True;IvonRundP:=Sqrt(P/R) End
          Else IvonRundP:=ErgebnisFalsch
 End;
 Function PvonUundI(U,I:Extended):Extended;
 Begin Leistung:=True;PvonUundI:=U*I End;
 Function PvonUundR(U,R:Extended):Extended;
 Begin
  If R<>0 Then Begin Leistung:=True;PvonUundR:=U*U/R End
          Else PvonUundR:=ErgebnisFalsch
 End;
 Function PvonIundR(I,R:Extended):Extended;
 Begin Leistung:=True;PvonIundR:=Sqr(I)*R End;
 Function RvonUundI(U,I:Extended):Extended;
 Begin
  If I<>0 Then Begin Widerstand:=True;RvonUundI:=U/I End
          Else RvonUundI:=ErgebnisFalsch
 End;
 Function RvonUundP(U,P:Extended):Extended;
 Begin
  If P<>0 Then Begin Widerstand:=True;RvonUundP:=Sqr(U)/P End
          Else RvonUundP:=ErgebnisFalsch
 End;
 Function RvonIundP(I,P:Extended):Extended;
 Begin
  If I<>0 Then Begin Widerstand:=True;RvonIundP:=P/Sqr(I) End
          Else RvonIundP:=ErgebnisFalsch
 End;
 Function UvonIundR(I,R:Extended):Extended;
 Begin Spannung:=True;UvonIundR:=I*R End;
 Function UvonIundP(I,P:Extended):Extended;
 Begin
  If I<>0 Then Begin Spannung:=True;UvonIundP:=P/I End
          Else UvonIundP:=ErgebnisFalsch
 End;
 Function UvonRundP(R,P:Extended):Extended;
 Begin Spannung:=True;UvonRundP:=Sqrt(P*R) End;
 Procedure Berechnung;
 Begin
  Durchlauf:=0;
  Repeat
   If Not(Widerstand) And Spannung And Stromstaerke Then R:=RvonUundI(U,I);
   If Not(Leistung) And Spannung And Stromstaerke Then P:=PvonUundI(U,I);
   If Not(Stromstaerke) And Spannung And Widerstand Then I:=IvonUundR(U,R);
   If Not(Leistung) And Spannung And Widerstand Then P:=PvonUundR(U,R);
   If Not(Stromstaerke) And Spannung And Leistung Then I:=IvonUundP(U,P);
   If Not(Widerstand) And Spannung And Leistung Then R:=RvonUundP(U,P);
   If Not(Spannung) And Stromstaerke And Widerstand Then U:=UvonIundR(I,R);
   If Not(Leistung) And Stromstaerke And Widerstand Then P:=PvonIundR(I,R);
   If Not(Spannung) And Stromstaerke And Leistung Then U:=UvonIundP(I,P);
   If Not(Widerstand) And Stromstaerke And Leistung Then R:=RvonIundP(I,P);
   If Not(Spannung) And Widerstand And Leistung Then U:=UvonRundP(R,P);
   If Not(Stromstaerke) And Widerstand And Leistung Then I:=IvonRundP(R,P);
   Inc(Durchlauf)
  Until (Spannung And Stromstaerke And Widerstand And Leistung) Or
        (Durchlauf=DurchlaufMax)
 End;
 Procedure ErgebnisseAusgeben;
 Const F='Rechenfehler!!!';
 Var   Fehler:Boolean;
 Begin
  Fehler:=False;
  If Spannung And (U>=Min) And (U<=Max) Then
   EditSpannung.Text:=FloatToStrF(U,ffFixed,18,3)
                                        Else
   Begin EditSpannung.Text:=F;Fehler:=True End;
  If Stromstaerke And (I>=Min) And (I<=Max) Then
   EditStromstaerke.Text:=FloatToStrF(I,ffFixed,18,3)
                                            Else
   Begin EditStromstaerke.Text:=F;Fehler:=True End;
  If Widerstand And (R>=Min) And (R<=Max) Then
   EditWiderstand.Text:=FloatToStrF(R,ffFixed,18,3)
                                          Else
   Begin EditWiderstand.Text:=F;Fehler:=True End;
  If Leistung And (P>=Min) And (P<=Max) Then
   EditLeistung.Text:=FloatToStrF(P,ffFixed,18,3)
                                        Else
   Begin EditLeistung.Text:=F;Fehler:=True End;
  If Durchlauf>=DurchlaufMax Then
   EditStatus.Text:='Die Berechnung ist nicht lösbar!'
                             Else
   If Fehler Then EditStatus.Text:=F
             Else EditStatus.Text:='Die Berechnung ist in Ordnung!'
 End;
 Function DatenKontrolle:Boolean;
  Function Wert(WertString:String;Min,Max:Extended):Extended;
  Var i     :Byte;
      Fehler:Integer;
      Zahl  :Extended;
  Begin
   For i:=1 To Length(WertString) Do
    If WertString[i]=',' Then WertString[i]:='.';
   Val(WertString,Zahl,Fehler);
   If (Fehler<>0) Or (Zahl<Min) Or (Zahl>Max) Then
    Wert:=ErgebnisFalsch Else Wert:=Zahl
  End;
 Const F='Fehler!';
 Var Zaehler:Integer;
 Begin
  DatenKontrolle:=True;Zaehler:=0;
  Spannung:=False;Stromstaerke:=False;Widerstand:=False;Leistung:=False;
  If (Zaehler<MinWerte) And (EditSpannung.Text<>'') Then
   Begin
    U:=Wert(EditSpannung.Text,Min,Max);
    If U<>ErgebnisFalsch Then Begin Inc(Zaehler);Spannung:=True End
                         Else EditSpannung.Text:=F
   End;
  If (Zaehler<MinWerte) And (EditStromstaerke.Text<>'') Then
   Begin
    I:=Wert(EditStromstaerke.Text,Min,Max);
    If I<>ErgebnisFalsch Then Begin Inc(Zaehler);Stromstaerke:=True End
                         Else EditStromstaerke.Text:=F
   End;
  If (Zaehler<MinWerte) And (EditWiderstand.Text<>'') Then
   Begin
    R:=Wert(EditWiderstand.Text,Min,Max);
    If R<>ErgebnisFalsch Then Begin Inc(Zaehler);Widerstand:=True End
                         Else EditWiderstand.Text:=F
   End;
  If (Zaehler<MinWerte) And (EditLeistung.Text<>'') Then
   Begin
    P:=Wert(EditLeistung.Text,Min,Max);
    If P<>ErgebnisFalsch Then Begin Inc(Zaehler);Leistung:=True End
                         Else EditLeistung.Text:=F
   End;
  If Zaehler<MinWerte Then DatenKontrolle:=False
 End;
begin
 If DatenKontrolle Then Begin Berechnung;ErgebnisseAusgeben End
                   Else
  EditStatus.Text:='Mindestens '+IntToStr(MinWerte)+' Werte eingeben!'
end;

procedure TFormGleichstrom.ButtonEndeClick(Sender:TObject);
begin Close end;

end.
