Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Temperatur Umrechner (https://www.delphipraxis.net/140582-temperatur-umrechner.html)

DeddyH 22. Sep 2009 16:33

Re: Temperatur Umrechner
 
Also gut, für alle Fälle eine kleine Einweisung in Parameter (eigentlich: Argumente). Nehmen wir einmal folgende Funktionsdeklaration:
Delphi-Quellcode:
function MyFunc(const InputString: string; var InputInt: integer; out OutputDouble: double): Boolean;
Diese Funktion erwartet 3 Argumente:
- einen String
- eine Integer
- eine Double
und gibt als Ergebnis Boolean zurück (also entweder true oder false). Alle 3 werden unterschiedlich gehandhabt. Das const vor InputString bedeutet, dass das Argument innerhalb der Funktion nicht geändert wird/werden soll. Das var vor InputInt bedeutet, dass das übergebene Argument innerhalb der Funktion ausgewertet und evtl. geändert werden kann. Das out vor OutputDouble bedeutet, dass das Argument innerhalb der Funktion nicht berücksichtigt, sondern als reines Ausgabeargument behandelt werden soll. Von allen 3 Argumenten wird innerhalb der Funktion keine lokale Kopie angelegt, da diese als Referenzen übergeben werden (call by reference). Anders verhält sich dies, wenn ein Argument ohne const, var oder out entgegegenommen wird. In diesem Fall wird mit einer lokalen Kopie des Wertes gearbeitet, das Original bleibt davon unberührt (call by value). Auch hierfür ein Beispiel:
Delphi-Quellcode:
procedure Proc1(InputInt: integer);
begin
  InputInt := 42;
end;

procedure Proc2(var InputInt: integer);
begin
  InputInt := 42;
end;

procedure TFormMain.TestProcs;
var MyInt: integer;
begin
  MyInt := 100;
  Proc1(MyInt); //call by value
  ShowMessage(IntToStr(MyInt)); //Ausgabe: 100
  Proc2(MyInt); //call by reference
  ShowMessage(IntToStr(MyInt)); //Ausgabe: 42
end;
Übrigens muss man wegen der evtl. Veränderlichkeit des Wertes bei var- und out-Parametern immer eine Variable deklarieren und diese übergeben. So würde sich dieser Aufruf nicht kompilieren lassen:
Delphi-Quellcode:
procedure TFormMain.TestProcs;
begin
  Proc2(42);
end;
Wieso dies? 42 ist eine Konstante, Proc2 erwartet aber eine Variable, da der Wert veränderlich sein soll, was eine Konstante ja nun einmal nicht ist.
Zum Schluss noch ein paar Worte zu überladenen Routinen und Default-Argumenten. Seit Delphi 4 kann man Routinen überladen, d.h. eine Routine mit dem selben Namen kann unterschiedlichste Argumente entgegennehmen. Das Einzige, was dabei zu beachten ist, ist, dass der Compiler klar unterscheiden können muss, welche Version denn nun gemeint ist. Auch dazu ein Beispiel:
Delphi-Quellcode:
function EineFunc(const s: string): Boolean; overload;
function EineFunc(const d: Double): Boolean; overload;
function EineFunc(const d: Double; var i: integer; const Bla: string='Wuppdi'): Boolean; overload;
Das Schlüsselwort "overload" kennzeichnet so eine überladene Routine und sagt Delphi, dass man das mit Absicht so macht und nicht etwa, weil man nicht aufgepasst hat ;). Wir können dieser Funktion entweder einen String, eine Double oder eine Double und eine Integer (plus ggf. einen String) übergeben. Durch die Eindeutigkeit ist sichergestellt, dass immer die richtige Version aufgerufen wird. In der 3. Version gibt es die Besonderheit mit dem vorbelegten String "Bla". Dieses Argument kann, muss aber nicht übergeben werden. Wird es nicht übergeben, nimmt die Funktion automatisch die Vorgabe (in diesem Fall "Wuppdi").

So, ich hoffe, das war ausführlich genug und ich habe keinen größeren Quatsch erzählt. Bei Fragen einfach noch einmal nachhaken.

jens106 22. Sep 2009 17:26

Re: Temperatur Umrechner
 
Ich habe Matze's Beitrag nicht negativ gesehen. Hanz im Gegenteil... Er hat doch recht.

Jetzt aber noch ein Frage: Ich habe jetzt noch ein Funktion " in alles Umwandeln" hinzugefügt aber ich bekomme jetzt ganz ganz unter bei

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Mehrere Fehler:

[Error] Unit1.dpr(308): Statement expected but 'PROCEDURE' found
[Warning] Unit1.dpr(318): Text after final 'END.' - ignored by compiler
[Fatal Error] mit_frage.dpr(5): Could not compile used unit 'Unit1.dpr'

Ich komme nach einer Stunde immernoch nicht dahinter, wo der Fehler ist. Aber wenn ich habe das Gefühl, dass irgendwo ein Semikolon oder ähnliches Fehlt.
Bevor ich die den letzten Teil (fänngt mit
Delphi-Quellcode:
 //----Celsius---
an) "geschrieben" habe, kam deer Fehler noch nicht.

Woran kann das Blos liegen.

Hier der Ganze Quelltext (im moment noch ohne eine Try-Anweisung;) )
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label9: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var zahl, ergebnis : Real;
// var myFloat: Extended;
begin

//   if TryStrToFloat('Zahl', myFloat) then
//      ShowMessage(FloatToStr(myFloat))
//   else
//      ShowMessage('Ungültige Eingabe');

   zahl :=StrToFloat(Edit1.text);

   Label9.Caption := FloatToStr(zahl);
   // ------------------- Grad Celsius -----------------------------
   // Von C° auf K

   if ComboBox1.text='C° (Celsius)' then
      begin
         if ComboBox2.text='K (Kelvin)' then
            begin
               ergebnis:=zahl+273.15;
               Edit1.Text:= FloatToStr(ergebnis);
            end
         else
            begin
            end
       end
   else
      begin
      end;

   // Von C° auf Fahrenheit

   if ComboBox1.text='C° (Celsius)' then
      begin
         if ComboBox2.text='F° (Fahrenheit)' then
            begin
               ergebnis:=zahl*9/5+32;
               Edit1.Text:= FloatToStr(ergebnis);
            end
         else
            begin
            end
       end
   else
      begin
      end;

       // Von C° auf C°

   if ComboBox1.text='C° (Celsius)' then
      begin
         if ComboBox2.text='C° (Celsius)' then
            begin
               Edit1.Text:= 'Selbe Einheit';
            end
         else
            begin
            end
       end
   else
      begin
      end;

   // ------------------------- Ende Grad Celsius ---------------------------

   // ------------------------- Start Fahrenheit -----------------------------
   // Von F° auf K

   if ComboBox1.text='F° (Fahrenheit)' then
      begin
         if ComboBox2.text='K (Kelvin)' then
            begin
               ergebnis:=(zahl + 459.67) / 1.8;
               Edit1.Text:= FloatToStr(ergebnis);
            end
         else
            begin
            end
       end
   else
      begin
      end;

   // Von F° auf Fahrenheit

   if ComboBox1.text='F° (Fahrenheit)' then
      begin
         if ComboBox2.text='F° (Fahrenheit)' then
            begin
               Edit1.Text:= 'Selbe Einheit';
            end
         else
            begin
            end
       end
   else
      begin
      end;

       // Von C° auf C°

   if ComboBox1.text='F° (Fahrenheit)' then
      begin
         if ComboBox2.text='C° (Celsius)' then
            begin
               ergebnis:=(zahl - 32) / 1.8;
               Edit1.Text:= FloatToStr(ergebnis);
            end
         else
            begin
            end
       end
   else
      begin
      end;

   // -------------------------Ende Fahrenheit ---------------------------
   // ------------------------- Start Kelvin -----------------------------
   // Von F° auf K

   if ComboBox1.text='K (Kelvin)' then
      begin
         if ComboBox2.text='K (Kelvin)' then
            begin
               Edit1.Text:= 'Selbe Einheit';
            end
         else
            begin
            end
       end
   else
      begin
      end;

   // Von K° auf Fahrenheit

   if ComboBox1.text='K (Kelvin)' then
      begin
         if ComboBox2.text='F° (Fahrenheit)' then
            begin
               ergebnis:=zahl*1.8-459.67;
               Edit1.Text:= FloatToStr(ergebnis);
            end
         else
            begin
            end
       end
   else
      begin
      end;

       // Von K° auf C°

   if ComboBox1.text='K (Kelvin)' then
      begin
         if ComboBox2.text='C° (Celsius)' then
            begin
               ergebnis:=zahl-273.15;
               Edit1.Text:= FloatToStr(ergebnis);
            end
         else
            begin
            end
       end
   else
      begin
      end;

   // -------------------------Ende Kelvin ---------------------------
   // ------------------------ Alles Start -------------------------------
       //----Kelvin---

   if ComboBox1.text='K (Kelvin)' then
      begin
         if ComboBox2.text='Alle (C° F° K)' then
            begin

            Label5.Visible := True;
            Label6.Visible := True;
            Label7.Visible := True;

            // In Celsius umwandeln

               ergebnis:=zahl-273.15;
               Edit1.Text:= FloatToStr(ergebnis);

            // In Fahrenheit umwandeln

               Edit2.Visible := TRUE;
               ergebnis:=zahl*1.8-459.67;
               Edit2.Text:= FloatToStr(ergebnis);

            // In Kelvin umwandeln

               Edit3.Visible := TRUE;
               Edit3.Text:= 'Selbe Einheit';

   //----Fahrenheit---

   if ComboBox1.text='F° (Fahrenheit)' then
      begin
         if ComboBox2.text='Alle (C° F° K)' then
            begin

            Label5.Visible := True;
            Label6.Visible := True;
            Label7.Visible := True;

            // In Celsius umwandeln

               ergebnis:=(zahl - 32) / 1.8;
               Edit1.Text:= FloatToStr(ergebnis);

            // In Fahrenheit umwandeln

               Edit2.Visible := TRUE;
               Edit2.Text:= 'Selbe Einheit';


            // In Kelvin umwandeln

               Edit3.Visible := TRUE;
               ergebnis:=(zahl + 459.67) / 1.8;
               Edit3.Text:= FloatToStr(ergebnis);


   //----Celsius---

   if ComboBox1.text='C° (Celsius)' then
      begin
         if ComboBox2.text='Alle (C° F° K)' then
            begin

            Label5.Visible := True;
            Label6.Visible := True;
            Label7.Visible := True;

            // In Celsius umwandeln

               Edit2.Text:= 'Selbe Einheit';

            // In Fahrenheit umwandeln

               Edit2.Visible := TRUE;
               ergebnis:=zahl*9/5+32;
               Edit2.Text:= FloatToStr(ergebnis);


            // In Kelvin umwandeln

               Edit3.Visible := TRUE;
               ergebnis:=zahl+273.15;
               Edit3.Text:= FloatToStr(ergebnis);


            end
         else
            begin
            end
       end
   else
      begin
      end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
   Edit2.Visible := FALSE;
   Edit3.Visible := FALSE;
   Label5.Visible := FALSE;
   Label6.Visible := FALSE;
   Label7.Visible := FALSE;
end;

end.
end;

end.
P.S.: danke DeddyH für deine ausführlich Erläuterung. Ich werde sie mir heute abend einmal gründlich durchlesen/studieren ;)

Vasco da Gama 22. Sep 2009 17:28

Re: Temperatur Umrechner
 
Hi, du hast nicht ganz unten,(ganz unten stimmts)
Delphi-Quellcode:
end.
statt
Delphi-Quellcode:
end;

jens106 22. Sep 2009 17:36

Re: Temperatur Umrechner
 
Delphi-Quellcode:
 else
      begin
      end;

end; // <-- muss hier ein . anstelle eines ; hin? so habe ich das verstanden. Aber ads klappt nicht.


procedure TForm1.FormCreate(Sender: TObject);
begin
   Edit2.Visible := FALSE;
   Edit3.Visible := FALSE;
   Label5.Visible := FALSE;
   Label6.Visible := FALSE;
   Label7.Visible := FALSE;
end;

end.
end;

end.

Vasco da Gama 22. Sep 2009 17:39

Re: Temperatur Umrechner
 
nicht ganz:
bei Delphi darf end. nur ganz am ende einer Unit stehen, also folgendes:
Delphi-Quellcode:
else
      begin
      end;

end; // <-- Hier stimmts


procedure TForm1.FormCreate(Sender: TObject);
begin
   Edit2.Visible := FALSE;
   Edit3.Visible := FALSE;
   Label5.Visible := FALSE;
   Label6.Visible := FALSE;
   Label7.Visible := FALSE;
end;

end. // <-- Hier muss ein Semikolon hin, also end; statt end.
end;

end.

jens106 22. Sep 2009 17:45

Re: Temperatur Umrechner
 
Liste der Anhänge anzeigen (Anzahl: 1)
jo das war auch ein Fehler sehe ich gerade ;)
aber der eigentlich Fehler besteht weiter hin.

Ich habe mal zur Veranschaulichung ein Screenshot gemacht

Mithrandir 22. Sep 2009 17:48

Re: Temperatur Umrechner
 
Du hast zuviele Ends am Ende. Oder du hast die Prozedur in eine anderen reingeschrieben. Du solltest den Quelltext mal sauber einrücken und gucken, ob du zu jedem Begin; auch das passende End; hast. ;)

jens106 22. Sep 2009 18:45

Re: Temperatur Umrechner
 
so jetzt erstmal ein großes Danke an alle die mir geholfen haben.

Aber jetzt kommt ein Problem, dass ich noch nie hatte. Wenn ich mein Projekt speichern will speichert der nur 3 dateien (auch keine exe) und wenn man die datei delphi projekt öffnen will kommen fehler meldungen

Was soll ich tun?

DeddyH 22. Sep 2009 19:02

Re: Temperatur Umrechner
 
Zunächst könntest Du uns einmal sagen, welche Fehlermeldungen.

jens106 22. Sep 2009 19:18

Re: Temperatur Umrechner
 
Liste der Anhänge anzeigen (Anzahl: 2)
hier sind 2 screenshots von den Fehlern und im Hintergrund die Daten die gespeichert wurden nachdem ich save projekt durchgeführt hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
Seite 5 von 6   « Erste     345 6      

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