Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion richtig deklarieren (https://www.delphipraxis.net/152732-funktion-richtig-deklarieren.html)

AlexII 4. Jul 2010 11:04

Delphi-Version: 2005

Funktion richtig deklarieren
 
Hallo,

ich hab eine Funktion geschrieben, aber irgendwie bekomme ich sie nicht zum laufen, wer kann mir da helfen?

Delphi-Quellcode:
  private
    { Private-Deklarationen }
    function VolumeChange(Position: Integer): Integer;


function TForm1.VolumeChange(Position: Integer): Integer;
begin
if Position=0 then
begin
VolumeLow.Visible:=False;
VolumeMedium.Visible:=False;
VolumeHigh.Visible:=False;
VolumeMuted.Visible:=True;
end else if (Position>0) and (Position<=33) then
         begin
         VolumeLow.Visible:=True;
         VolumeMedium.Visible:=False;
         VolumeHigh.Visible:=False;
         VolumeMuted.Visible:=False;
         end else if (Position>33) and (Position<=66) then
                  begin
                  VolumeLow.Visible:=False;
                  VolumeMedium.Visible:=True;
                  VolumeHigh.Visible:=False;
                  VolumeMuted.Visible:=False;
                  end else
                      begin
                      VolumeLow.Visible:=False;
                      VolumeMedium.Visible:=False;
                      VolumeHigh.Visible:=True;
                      VolumeMuted.Visible:=False;
                      end;

BASS_ChannelSetAttribute(chan, BASS_ATTRIB_VOL, Position/100);
end;

procedure TForm1.VolumeBarChange(Sender: TObject);
begin
VolumeBarChange(VolumeBar.Position); <-- hier ist der Fehler "Inkompatible Typen: 'TObject' und 'Integer'"
end;
Muss dazu noch sage, dass mich noch ein bisschen schlecht mit Funktionen auskenne.

jfheins 4. Jul 2010 11:08

AW: Komme mit einer Funktion nicht weiter
 
-- vergiss es, ich sehe die Fehlermeldung jetzt --- :oops:

Vielleicht noch ein Hinweis, damit mein Post nicht ganz für die Katz ist: Die Codeeinrückung gefällt mir gar nicht. :mrgreen:

Matze 4. Jul 2010 11:09

AW: Komme mit einer Funktion nicht weiter
 
Delphi-Quellcode:
VolumeBarChange(VolumeBar.Position); <-- hier ist der Fehler "Inkompatible Typen: 'TObject' und 'Integer'"
Deine Funktion heißt "VolumeChange". "VolumeBarChange" ist die Methode von der TTrackBar o.ä. ;)

@Julius: Die Fehlereldung steht im Code. Ich habe sie auch erst übersehen.
@Alex: Da du keinen Wert in der Funktion zurück gibst (kein "Result := ..."), kannst du eine Prozedur daraus machen:

Delphi-Quellcode:
procedure TForm1.VolumeChange(Position: Integer);

mkinzler 4. Jul 2010 11:09

AW: Komme mit einer Funktion nicht weiter
 
Wolltest du nicht VolumeChange() statt .VolumeBarChange() aufrufen?

BTW. Auch das neue Forum unterstützt den Delphi-Tag!

SirThornberry 4. Jul 2010 11:11

AW: Komme mit einer Funktion nicht weiter
 
@AlexII: Bitte gib dem Thema einen aussagekräftigen Titel. :)

guinnes 4. Jul 2010 11:13

AW: Komme mit einer Funktion nicht weiter
 
Warum eigentlich eine Function, wenn du kein Ergebnis zurücklieferst ?

AlexII 4. Jul 2010 11:15

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von SirThornberry (Beitrag 1033371)
@AlexII: Bitte gib dem Thema einen aussagekräftigen Titel. :)

Wo mache ich das? Blicke hier nicht durch :roteyes:

AlexII 4. Jul 2010 11:16

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von guinnes (Beitrag 1033373)
Warum eigentlich eine Function, wenn du kein Ergebnis zurücklieferst ?

Ja... ok ich ändere das. :thumb:

Und sonst ist alles ok? auch die Deklaration der Funktion in "Private"?

mkinzler 4. Jul 2010 11:17

AW: Komme mit einer Funktion nicht weiter
 
Antwort Bearbeiten-> Erweiteter Editor

AlexII 4. Jul 2010 11:17

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von jfheins (Beitrag 1033368)
Vielleicht noch ein Hinweis, damit mein Post nicht ganz für die Katz ist: Die Codeeinrückung gefällt mir gar nicht. :mrgreen:

Also für mich ist es besser so, voll Übersichtlich. :thumb:

AlexII 4. Jul 2010 11:18

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von mkinzler (Beitrag 1033370)
Wolltest du nicht VolumeChange() statt .VolumeBarChange() aufrufen?

Ok danke, war mein Fehler. :roteyes:

jfheins 4. Jul 2010 11:21

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von AlexII (Beitrag 1033379)
Also für mich ist es besser so, voll Übersichtlich. :thumb:

Ich finde ein
Delphi-Quellcode:
end
else if (x < 33)
begin
übersichtlicher. Aber ich rücke auch niemals das begin ein, sondern immer nur das Zeug zwischen begin und end wird eine Ebene weiter eingerückt. In der Hinsicht bin ich konsequent.

Aber wir wollen hier ja keinen OT-Streit vom Zaun brechen. Zumal sich ein case hier geradezu aufdrängt ;)

AlexII 4. Jul 2010 11:25

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von jfheins (Beitrag 1033381)
übersichtlicher. Aber ich rücke auch niemals das begin ein, sondern immer nur das Zeug zwischen begin und end wird eine Ebene weiter eingerückt. In der Hinsicht bin ich konsequent.

Aber wir wollen hier ja keinen OT-Streit vom Zaun brechen. Zumal sich ein case hier geradezu aufdrängt ;)

Bei mir kann ich aber gleicht sehen welches "if" zur welchem "begin" gehört. :thumb:

Bei "case" kann ich doch den Wertebereich zwischen zwei Zahlen so abfragen: "0-33:", oder?

mkinzler 4. Jul 2010 11:27

AW: Funktion richtig deklarieren
 
Zitat:

Bei mir kann ich aber gleicht sehen welches "if" zur welchem "begin" gehört.
Aber auf die Schnelle nicht mehr, welches
Delphi-Quellcode:
end
zu welchem
Delphi-Quellcode:
begin
, was ich als wichtiger erachte

jfheins 4. Jul 2010 11:29

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von AlexII (Beitrag 1033383)
Bei "case" kann ich doch den Wertebereich zwischen zwei Zahlen so abfragen: "0-33:", oder?

Nein. Das geht mit 0..33: ;)

himitsu 4. Jul 2010 11:30

AW: Komme mit einer Funktion nicht weiter
 
Zitat:

Zitat von Matze (Beitrag 1033369)
Da du keinen Wert in der Funktion zurück gibst (kein "Result := ..."), kannst du eine Prozedur daraus machen:

Delphi-Quellcode:
procedure TForm1.VolumeChange(Position: Integer);

Zitat:

Zitat von guinnes (Beitrag 1033373)
Warum eigentlich eine Function, wenn du kein Ergebnis zurücklieferst ?

Hier sollte sich Delphi ja sowieso beschweren, da das Funtionsergebnis (Result) nicht gesetzt wird und somit undefiniert/zufällig ist.

AlexII 4. Jul 2010 11:30

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von mkinzler (Beitrag 1033386)
Zitat:

Bei mir kann ich aber gleicht sehen welches "if" zur welchem "begin" gehört.
Aber auf die Schnelle nicht mehr, welches
Delphi-Quellcode:
end
zu welchem
Delphi-Quellcode:
begin
, was ich als wichtiger erachte

Na doch, bei mir kann man das gerade sehr gut.
Jaaa ich hab da in der Schule so gelernt, ne andere Struktur verwirrt mich nur.

AlexII 4. Jul 2010 11:32

AW: Funktion richtig deklarieren
 
Also hab schon ne Procedure daraus gemacht.

Code:
procedure TForm1.VolumeChange(Position: Integer);
Und das ich diese in der private deklariert habe, ist das ok? Oder lieber public?

Matze 4. Jul 2010 11:37

AW: Funktion richtig deklarieren
 
Wenn du sie nicht "public" braucht, dann gehört sie da auch nicht hin, wieso auch ...

Edit: Was, du hast diese Formatierung in der Schule gelernt?! :shock:

Ich finde es so o.ä. deutlich angenehmer. Bei vielen Verzweigungen geht so der Code nicht "auseinander":
Delphi-Quellcode:
procedure TForm1.VolumeChange(Position: Integer);
begin
  if Position = 0 then
  begin
    VolumeLow.Visible := false;
    VolumeMedium.Visible := false;
    VolumeHigh.Visible := false;
    VolumeMuted.Visible := true;
  end
  else if (Position > 0) and (Position <= 33) then
  begin
    VolumeLow.Visible := true;
    VolumeMedium.Visible := false;
    VolumeHigh.Visible := false;
    VolumeMuted.Visible := false;
  end
  else if (Position > 33) and (Position <= 66) then
  begin
    VolumeLow.Visible := false;
    VolumeMedium.Visible := true;
    VolumeHigh.Visible := false;
    VolumeMuted.Visible := false;
  end
  else
  begin
    VolumeLow.Visible := false;
    VolumeMedium.Visible := false;
    VolumeHigh.Visible := true;
    VolumeMuted.Visible := false;
  end;

  BASS_ChannelSetAttribute(chan, BASS_ATTRIB_VOL, Position / 100);
end;
Aber gut, die Formatierungsdiskussion müssen wir hier nicht wiederholen. Sonderlich gut ist die deines Lehrers jedoch nicht.
Solltest du an einen zukünftigen Arbeitgeber Beispielcode schicken, der so formatiert ist wie deiner, wirst du vermutlich keine allzu guten Chancen haben, genommen zu werden.

Folgende Verzweigung wäre übrigens auch denkbar, wenn die Werte immer positiv sind (im Prinzip sind die Verzweigungen auch nicht nötig, nur ob boolsche Verknüpfungen übersichtlicher sind, ist die andere Frage). Schneller ist's vermutlich wie du's hast.
Delphi-Quellcode:
if Position = 0 then
  // ...
else if Position <= 33 then
  // ...
else if Position <= 66 then
  // ...
else
  // ...

mkinzler 4. Jul 2010 11:39

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von AlexII (Beitrag 1033391)
Also hab schon ne Procedure daraus gemacht.

Code:
procedure TForm1.VolumeChange(Position: Integer);
Und das ich diese in der private deklariert habe, ist das ok? Oder lieber public?

Rede ich gegen eine Wand :wall:
Zitat:

BTW. Auch das neue Forum unterstützt den Delphi-Tag!

AlexII 4. Jul 2010 11:45

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von mkinzler (Beitrag 1033395)
Rede ich gegen eine Wand :wall:

Was denn? :gruebel:

Matze 4. Jul 2010 11:46

AW: Funktion richtig deklarieren
 
Du sollst bei Delphi-Code die [delphi]-Tags nutzen und nicht die [code]-Tags, damit das Syntax-Highlighting auch korrekt erfolgt.

AlexII 4. Jul 2010 11:48

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von Matze (Beitrag 1033404)
Du sollst bei Delphi-Code die [delphi]-Tags nutzen und nicht die [code]-Tags, damit das Syntax-Highlighting auch korrekt erfolgt.

Delphi-Quellcode:
ShowMessage('Ja das neue Design hier verwirrt ein bisschen.');

mkinzler 4. Jul 2010 11:49

AW: Funktion richtig deklarieren
 
Warum, dass das Delphi-Icon für Delphi steht finde ich recht einleuchtend

AlexII 4. Jul 2010 11:53

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von mkinzler (Beitrag 1033407)
Warum, dass das Delphi-Icon für Delphi steht finde ich recht einleuchtend

Ab jetzt schon. :thumb:

idefix2 4. Jul 2010 15:17

AW: Funktion richtig deklarieren
 
So ein Sequenz von if then else ist nicht wirklich übersichtlich. Wenn schon so kompliziert, dann wenigstens ein case:
Delphi-Quellcode:
case Position of
0:
  begin
    VolumeLow.Visible := false;
    VolumeMedium.Visible := false;
    VolumeHigh.Visible := false;
    VolumeMuted.Visible := true;
  end;
1..33:
  begin
    VolumeLow.Visible := true;
    VolumeMedium.Visible := false;
    VolumeHigh.Visible := false;
    VolumeMuted.Visible := false;
  end;
34..66:
  begin
    VolumeLow.Visible := false;
    VolumeMedium.Visible := true;
    VolumeHigh.Visible := false;
    VolumeMuted.Visible := false;
  end;
else
  begin
    VolumeLow.Visible := false;
    VolumeMedium.Visible := false;
    VolumeHigh.Visible := true;
    VolumeMuted.Visible := false;
  end;
end (* case *);
aber noch viel besser, weil man auf einen Blick sieht, was passiert:

Delphi-Quellcode:
VolumeMuted.Visible := position = 0;
VolumeLow.Visible := position in [1..33];
VolumeMedium.Visible := position in [34..66];
VolumeHigh.Visible := position > 66;
Aber die erste Lösung ist natürlich besser, wenn Du für die Anzahl der Codezeilen in Deinem Programm bezahlt wirst. :)

himitsu 4. Jul 2010 16:41

AW: Funktion richtig deklarieren
 
[edit]
ach, hatte ja schon jemand geschrieben

Matze 4. Jul 2010 17:27

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von idefix2 (Beitrag 1033459)
aber noch viel besser, weil man auf einen Blick sieht, was passiert:

Delphi-Quellcode:
VolumeMuted.Visible := position = 0;
VolumeLow.Visible := position in [1..33];
VolumeMedium.Visible := position in [34..66];
VolumeHigh.Visible := position > 66;

Genau das meinte ich vorher. Ich habe nur nicht gesehen, dass pro Case-Fall immer nur 1 "Dingens" sichtbar gesetzt wird. In dem Fall ist es folglich sehr übersichtlich. :)
Es wäre etwas anderes, wenn die Sichtbarkeit für mehrere Fälle gesetzt werden soll.

Teekeks 4. Jul 2010 18:09

AW: Funktion richtig deklarieren
 
Eine andere Möglichkeit wäre es zuerst alles auf false zu setzen und dann im case immer nur noch das entsprechende auf true.
Spart auch Zeilen...

AlexII 4. Jul 2010 18:54

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von idefix2 (Beitrag 1033459)

Delphi-Quellcode:
VolumeMuted.Visible := position = 0;
VolumeLow.Visible := position in [1..33];
VolumeMedium.Visible := position in [34..66];
VolumeHigh.Visible := position > 66;

Du hast aber das Ausschalten der Images vergessen. :warn:

mkinzler 4. Jul 2010 19:07

AW: Funktion richtig deklarieren
 
Es geht auch nicht darum, dir Musterlösungen zu liefern! :wall:
Ich sehe dich auch absolut nicht in der Position andere Benutzer zu ver:warn:en.!

Matze 4. Jul 2010 19:25

AW: Funktion richtig deklarieren
 
Zitat:

Zitat von AlexII (Beitrag 1033496)
Du hast aber das Ausschalten der Images vergessen. :warn:

Und außerdem ist das bereits integriert. Sobald die boolsche Bedingung false ist, wird der Eigenschaft "Visible" ebenfalls "false" zugewiesen.
Also nicht in dem Tonfall. Du kannst auch mal selbst etwas machen bzw. versuchen, den Code zu verstehen, denn das hast du nicht.

So habe ich überhaupt keine Lust mehr, dir zukünftig zu helfen. Auch wenn deine Fragen noch so banal sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.

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