Delphi-PRAXiS

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:22

Problem mit einfügen einer function in procedure
 
hallo
ich muss ein projekt erstellen in einer eigenen unit und habe schon jetzt einen fehler :|

hier der ausschnitt:

procedure TGaskosten.erdgaschecked;
var a: real;
begin
erdgaspreisberechnen(a : real): real;
end;


erdgaspreisberechnen ist eine function.
delphi hätte gerne eine ( anstatt eines doppelpunktes... und zwar bei ...(a : real):real;

was soll ich tun?
habe schon nach fehlern gesucht aber keine gefunden:(
vielen dank schonmal im vorraus für die hilfe!

Klaus01 14. Jan 2011 14:27

AW: Problem mit einfügen einer function in procedure
 
Das ist eine Funktion und diese willst Du benutzen (und nicht deklarieren)

Delphi-Quellcode:
procedure TGaskosten.erdgaschecked;
var a: real;
begin
  a:= erdgaspreisberechnen; // ob die Funktion nch Parameter hat ???
end;
Nachtrag: und viellecht das eine oder andere Grundlagentutorial durcharbeiten

Grüße
Klaus

DeddyH 14. Jan 2011 14:27

AW: Problem mit einfügen einer function in procedure
 
Delphi-Quellcode:
a := erdgaspreisberechnen;
So oder so ähnlich muss das aussehen (ich kenne ja den Funktionskopf nicht).

stahli 14. Jan 2011 14:31

AW: Problem mit einfügen einer function in procedure
 
Wenn die Funktion schon existiert, dann kannst Du sie z.B. so aufrufen:

Delphi-Quellcode:
procedure TGaskosten.erdgaschecked;
var a: real;
begin
  a := erdgaspreisberechnen(10);
  a := erdgaspreisberechnen(100);
end;
Und dann mit dem Ergebnis, das in a vorliegt weiter arbeiten.

Existiert die Funktion noch gar nicht, musst Du sie erst selbst definieren. Wie und wo genau, hängt davon ab, wie und wo Du die Funktion einsetzen möchtest...

wolfaa 14. Jan 2011 14:36

AW: Problem mit einfügen einer function in procedure
 
hey
die procedure soll ja auf die funktion zugreifen also in der funktion wird dann a ausgerechet.

hier mal bis zu dem problem ein auszug:

vielleicht hilfts ja:/

unit UEigeneGasrechner;

interface
type
TGaskosten = class
erdgas, stadtgas: real;
function erdgaspreisberechnen(a: real): real;
function stadtgaspreisberechnen(b: real): real;
procedure seterdgas(a: real);
procedure setstadtgas(b: real);
procedure erdgaschecked;
procedure stadtgaschecked;
end;


implementation

procedure TGaskosten.seterdgas(a: real);
begin
erdgas:= a;
end;

procedure TGaskosten.setstadtgas(b: real);
begin
stadtgas:= b;
end;

procedure TGaskosten.erdgaschecked;
var a: real;
begin
a:=erdgaspreisberechnen(a : real): real;
end;

achso und ich bin blutiger anfänger also wenn ihr noch mehr verbesserungsvorschläge habt raus damit;)

Sir Rufo 14. Jan 2011 14:42

AW: Problem mit einfügen einer function in procedure
 
Ja, bitte benutze die Delphi-Tags für den Quelltext

Ansonsten würde ich dir als Anfänger ein Grundlagen Tutorial empfehlen.

Das was ich bisher sehe ist doch sehr konfus

Erklär mal, was du mit der Klasse genau erreichen möchtest.

wolfaa 14. Jan 2011 14:46

AW: Problem mit einfügen einer function in procedure
 
ich solle einen gasrechner erstellen und der hat verschiedene tarife und es gibt verschiedene gassorten.
und das in einer eigenen unit also die soll man weiterverwenden können:/
und die procedure soll bewirken das wenn ein radiobutton "checked" ist das dann die rechnung ausgeführt wird...

DeddyH 14. Jan 2011 14:50

AW: Problem mit einfügen einer function in procedure
 
In die Funktion gehört nur die Berechnung des Preises auf Basis des übergebenen Parameters. Ob ein Radiobutton Checked ist, hat in der Unit nichts zu suchen.

wolfaa 14. Jan 2011 14:52

AW: Problem mit einfügen einer function in procedure
 
nein der radiobutton hat auch nichts mit der unit zu tun aber was meinst du was du gerade geschrieben hast das war zu hohes deutsch für mich :P

Sir Rufo 14. Jan 2011 14:53

AW: Problem mit einfügen einer function in procedure
 
Jetzt hast du uns beschrieben was das Formular machen soll, aber nicht, was die Berechnungsklasse machen soll.

Ob da ein RadioButton geklickt wird, ist der Berechnungsklasse sowas von egal. Das interessiert nur die Form, denn die muss ja jetzt etwas anderes anzeigen.

Was dann angezeigt werden soll, dass holt sich die Form von der Berechnungsklasse ab.

Also, was brauchen wir alles an Parametern für die Berechnung?
Und wie soll dann berechnet werden?

Wann berechnet werden soll ist dabei völlig unerheblich, denn die Berechnung muss ja immer stimmen ;)

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 15:12 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