Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem mit einfügen einer function in procedure (https://www.delphipraxis.net/157515-problem-mit-einfuegen-einer-function-procedure.html)

wolfaa 14. Jan 2011 14:57

AW: Problem mit einfügen einer function in procedure
 
also für die berechnung brauchen wir den gasverbrauch in meinem fall ist es hier a
dann wird ein tarif berechnet und der wird wieder zurück an die fensterklasse gesendet. in der fachklassewird ja nur der preis berechnet.

Klaus01 14. Jan 2011 15:05

AW: Problem mit einfügen einer function in procedure
 
Hallo,

im Prinzip könnte die Gasklasse so aussehen:

Delphi-Quellcode:
type
  TGasklasse = class
     private
       verbrauch : double;
       function berechneTarif:Integer;

     public
       setVerbrauch(AVerbrauch: double);
       getTarif:Integer;
  end;
Delphi-Quellcode:
function TGasklasse.berechneTarif:Integer;
begin
  // tue etwas mit Verbrauch um den günstigsten Tarif zu ermitteln
  // wobe die Tarifklasse ein integer ist
end;

procedure TGasklasse.setVerbrauch(AVerbrauch: double);
begin
  verbrauch := AVerbrauch;
end;

function TGasklasse.getTarif:Integer;
begin
  result := berechneTarif;
end;

Nachtrag:
Wo bekommt die Gasklasse die Preise der verschiedenen Gassorten her?


Grüße
Klaus

DeddyH 14. Jan 2011 15:08

AW: Problem mit einfügen einer function in procedure
 
Na also. Dann kann die Funktion z.B. so aussehen:
Delphi-Quellcode:
function erdgaspreisberechnen(a : real): real;
begin
  Result := a * Preis; //Preis ist anderweitig ermittelt worden
end;
Im Formular, welches diese Unit benutzt, geht dann so etwas:
Delphi-Quellcode:
procedure TDeinForm.ButtonBerechnenClick(Sender: TObject);
var Verbrauch, Preis: real;
begin
  if RadioButtonPreis.Checked then
    begin
      Verbrauch := StrToFloat(EditVerbauch.Text);
      Preis := erdgaspreisberechnen(Verbrauch);
      LabelPreis.Caption := FloatToStr(Preis);
    end;
end;

Sir Rufo 14. Jan 2011 15:12

AW: Problem mit einfügen einer function in procedure
 
Oder hier als abstraktes Beispiel drei Methoden zum Berechnen:
Delphi-Quellcode:
unit uFoo;

interface

type
  // Der Preis kann von beliebiger Stelle geändert werden
  TCalcClass1 = class
  private
    FPreis : Extended;
    procedure SetPreis( const Value : Extended );

  public
    property Preis : Extended read FPreis write SetPreis;
    function Calc( Menge : Extended ) : Extended;
  end;

  // Der Preis wird bei der Erzeugung festgelegt
  TCalcClass2 = class
  private
    FPreis : Extended;

  public
    property Preis : Extended read FPreis;
    function Calc( Menge : Extended ) : Extended;
    constructor Create( Preis : Extended );
  end;

  // Der Preis muss bei jeder Berechnung mit angegeben werden
function Calc( Menge, Preis : Extended ) : Extended;

implementation

function Calc( Menge, Preis : Extended ) : Extended;
  begin
    Result := Menge * Preis;
  end;

{ TCalcClass1 }

function TCalcClass1.Calc( Menge : Extended ) : Extended;
  begin
    Result := Calc( Menge, Preis );
  end;

procedure TCalcClass1.SetPreis( const Value : Extended );
  begin
    FPreis := Value;
  end;

{ TCalcClass2 }

function TCalcClass2.Calc( Menge : Extended ) : Extended;
  begin
    Result := Calc( Menge, Preis );
  end;

constructor TCalcClass2.Create( Preis : Extended );
  begin
    inherited Create;
    FPreis := Preis;
  end;

end.
Für welches Modell der Umsetzung man sich entscheidet, hängt davon ab, was man erreichen möchte.
Ist bei der Berechnung der Preis auch an dem Ort bekannt, von wo aus die Berechnung angestossen wird, dann bietet sich eine einfache
Delphi-Quellcode:
function Calc( Menge, Preis : Extended ):Extended;
an.

Ist der Preis nur einer völlig anderen Stelle bekannt und sind dort Änderungen zu erwarten (erlaubt), dann wie
Delphi-Quellcode:
TCalcClass1
.

Darf der Preis sich nicht ändern, dann wie
Delphi-Quellcode:
TCalcClass2
.

Werden diese Berechnungsklassen jetzt weiterverwendet, so ist durch das Design schon klar, wie diese verwendet werden dürfen.

Deep-Sea 14. Jan 2011 15:13

AW: Problem mit einfügen einer function in procedure
 
Den internen Variablen "erdgas" und "stadtgas" sollte man erst einmal ein "F" voranstellen und dann eine Property für jeden Wert anlegen und keine öffentliche Setter-Methode. Wir haben schließlich Delphi und net Java und Co. :wink:
(siehe Sir Rufo's Post ^^)

DeddyH 14. Jan 2011 15:15

AW: Problem mit einfügen einer function in procedure
 
Sind das jetzt nicht ein bisschen viel Infos? Ich fürchte, dass wir den TE gerade etwas überfordern.

wolfaa 14. Jan 2011 15:23

AW: Problem mit einfügen einer function in procedure
 
also dei verschiedenen tarife wollte ich in der rechnung ungefähr so machen:

nur eine überlegung da fehlen noch ein paar sachen:
Delphi-Quellcode:
        function TGaskosten.erdgaspreisberechnen(a: real): real;
        begin
           if a<151 then
              begin
              a:= a*0.344;
              a:= a + (a*0.19);
              a:= a + 210;
              result:= a;
              end
           else
           if a> 400 then
              a:= a*0.255;
              a:= a + (a* 0.19);
              a:= a +  210;
           if a> 1999 then
              a:= a - 210;
        end;
erklärung: die verschiedenen tarife : bis 150 cbm gas: 0.344 euro pro cbm
und über 400 cbm kostet es 0.255 euro
zusatz: ab 2000 fällt die grundgebühr in höhe von 210 euro weg. und die mehwertsteuer wird bei allen berechnet

DeddyH 14. Jan 2011 15:27

AW: Problem mit einfügen einer function in procedure
 
Im Großen und Ganzen sieht das schon ganz gut aus, aber
- da fehlen begins und ends
- zwischen 151 und 400 m^3 kostet es nichts (?)

wolfaa 14. Jan 2011 15:35

AW: Problem mit einfügen einer function in procedure
 
ist ja auch noch nicht fertig ;)
zwischen 150 und 400 muss noch was:P
jaa da fehlen ends!!

Sir Rufo 14. Jan 2011 15:36

AW: Problem mit einfügen einer function in procedure
 
Besser so:
Delphi-Quellcode:
function TGaskosten.erdgaspreisberechnen(a: real): real;
  begin
    Result := 0;

    // Grundgebühr
    if a < 2000 then
      Result := Result + 210;

    // Verbrauch
    if a > 400 then
      Result := Result + a * 0.255
    else if a > 150 then
      Result := Result + a * 0.000 // Nach deinen Vorgaben geschenkt
    else
      Result := Result + a * 0.344;

    // Mehrwertsteuer
    Result := Result * 1.19;

  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.
Seite 2 von 2     12   

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