Autor Beitrag
wicked
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 29.07.08 09:25 
Hallo,

ich bin grade dabei mir mit hilfe eines buches etwas programmieren beizubringen.. es stellt sich als relativ schwierig heraus.. deshalb habe ich ein paar fragen!
im moment bin cih bei funktionen.. im buch steht nicht richtig erklärt, wie man so eine funktion in den quelltext schreibt bzw. wo.. ich habe es mal an einem ganz einfachen beispiel zur kreisberechnung versucht, allerdings klappt es nicht =( aber ich verstehe wie gesagt auch noch nicht wirklich den sinn

hier der quelltext:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    RadiusEdit: TEdit;
    FlaecheEdit: TEdit;

    Label1: TLabel;
    Label2: TLabel;
    RechnenButton: TButton;
    procedure RechnenButtonClick(Sender: TObject);
    function Kreisflaeche(Radius:Real) : Real;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Kreisflaeche(Radius:Real) : Real;
begin
  Result:=Pi*Radius*Radius;
end;

procedure TForm1.RechnenButtonClick(Sender: TObject);
begin
 Kreisflaeche;
 FlaecheEdit.Text:=FloatToStr(Result)
end;

end.



kann mir jemand erklären, was ich alles falsch gemacht habe?

... übrigens kommt bei "kreisflaeche;" die fehlermeldung "nicht genügend wirkliche parameter"

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Di 29.07.08 09:43 
Hi und :welcome:

in solchen Fällen empfiehlt sich immer der Crashkurs von Christian.

Viele Grüße
ImbaPanda
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: Di 29.07.08 09:44 
Du musst der Funktion (Kreisflaeche) ja überhaupt erstmal einen Parameter übergeben, mit dem dann gearbeitet werden kann. Die Funktion an sich ist soweit korrekt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Function Kreisflaeche(Radius:Real):Real;
Begin
Result:=Pi * Radius * Radius;
End;


Ich nehme mal an du möchstest, dass man für x beliebige Radien den Flächeninhalt des Kreises bekommst. Das könntest du dann z.B. so machen, indem du ein Eingabefeld (Edit) nimmst
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Procedure TForm1.RechnenButtonClick(Sender: TObject);
Begin
FlaecheEdit.Text:=FloatToStr(Kreisfläche(StrToFloat(Eingabefeld.Text)));    
End;


Funktioniert ganz einfach, du gibst in das "Eingabefeld" deinen beliebigen Radius ein und per Druck auf den Button bekommst du das Ergebnis.
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Di 29.07.08 09:50 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Kreisflaeche(Radius:Real) : Real;         //soweit richtig
begin
Result:=Pi*sqr(Radius);           //sqr (square) zum quadrieren von Radius
end;

procedure TForm1.RechnenButtonClick(Sender: TObject);
begin
//Kreisflaeche;                                      //falsch eine function kann nich wie eine procedure aufgerufen werden
FlaecheEdit.Text:=FloatToStr(Kreisfläche(Parameter{Radius});//so gehts richtig
end;
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Di 29.07.08 10:03 
user profile iconhuuuuuh hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Kreisflaeche(Radius:Real) : Real;         //soweit richtig
begin
Result:=Pi*sqr(Radius);           //sqr (square) zum quadrieren von Radius
end;

procedure TForm1.RechnenButtonClick(Sender: TObject);
begin
//Kreisflaeche;                                      //falsch eine function kann nich wie eine procedure aufgerufen werden
FlaecheEdit.Text:=FloatToStr(Kreisfläche(Parameter{Radius});//so gehts richtig
end;


Wat?

Du hast ne Klammer vergessen..

Und was soll an user profile iconImbaPandas Beispiel falsch sein??

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
wicked Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 29.07.08 10:29 
vielen dank!! jetzt hab ich das prinzip verstanden =)
.. ist total logisch, aber am anfang sieht man die einfachsten dinge nicht..

ich werd mich bestimmt noch öfters hier melden..
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Di 29.07.08 10:39 
ImbaPandas Beispiel is nich falsch, hab ich auch nie gesagt.
hab auf antworten gedrückt bevor ImbaPandas Beitrag da war, beitrag geschrieben und dann auf absenden und ziemlich sofort bildschirm aus...als ich dann wiederkam war der beitrag immanoch auf dem bildschirm, also nochma abgesendet...
zwischendurch is halt der andre beitrag gekommen...
ImbaPanda
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: Di 29.07.08 11:28 
Jepp ist meistens so^^ Einer ist immer schneller
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 15:17 
Um Vielleicht noch ein bisschen Systematik in deine Fragen zu bringen:

1. Prozeduren und Funktionen schreibt man in den implementation-Teil. Das ist der Teil zwischen dem Wort implementation und dem abschließenden end. der Unit.

2. Funktionen haben einen Rückgabewert, Prozeduren nicht. Trotzdem darf man mit den üblichen Compiler-Einstellungen aber Funktionen auch wie Prozeduren aufrufen (der Rückgabewert wird dann verworfen). Viele Windows-Api-Funktionen z.B. arbeiten wie Prozeduren.

3. Möchte man seine Prozeduren auch aus anderen Units aufrufen, so müssen diese im interface-Abschnitt deklariert werden. Geschrieben werden sie aber trotzdem immer im implementation-Abschnitt.

Grüße,
Tilman

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Di 29.07.08 15:46 
user profile iconTilman hat folgendes geschrieben:
Um Vielleicht noch ein bisschen Systematik in deine Fragen zu bringen:

1. Prozeduren und Funktionen schreibt man in den implementation-Teil. Das ist der Teil zwischen dem Wort implementation und dem abschließenden end. der Unit.

2. Funktionen haben einen Rückgabewert, Prozeduren nicht. Trotzdem darf man mit den üblichen Compiler-Einstellungen aber Funktionen auch wie Prozeduren aufrufen (der Rückgabewert wird dann verworfen). Viele Windows-Api-Funktionen z.B. arbeiten wie Prozeduren.

3. Möchte man seine Prozeduren auch aus anderen Units aufrufen, so müssen diese im interface-Abschnitt deklariert werden. Geschrieben werden sie aber trotzdem immer im implementation-Abschnitt.

Grüße,
Tilman


Was meint ihr, wozu das Public und Private gut ist?

Funktionen und Prozeduren, die nur in der eigenen Unit verwendet werden sind privat, die anderen publik.

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 15:50 
user profile iconZeitGeist87 hat folgendes geschrieben:

Was meint ihr, wozu das Public und Private gut ist?

Funktionen und Prozeduren, die nur in der eigenen Unit verwendet werden sind privat, die anderen publik.


Meiner Meinung nach Falsch. Methoden die nur in der eigenen Klasse verwendet werden sind Privat, die anderen publik.

Für Funktionen und Prozeduren gilt oben gesagtes - deklaration im interface-Teil: zugriff von aussen möglich, ansonsten nur aus der unit.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Di 29.07.08 15:51 
Ja probier mal ne Funktion aufzurufen, die im Privat deklariert ist.

Ich find das so viel übersichtlicher und einfacher..

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 16:00 
user profile iconZeitGeist87 hat folgendes geschrieben:
Ja probier mal ne Funktion aufzurufen, die im Privat deklariert ist.

Ich find das so viel übersichtlicher und einfacher..


Ja, aber dann sind es Methoden (von Form1 z.B.). Nicht in jeder Unit hat man eine Klasse - soll man dann jedesmal extra eine anlegen?

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 29.07.08 16:00 
user profile iconTilman hat folgendes geschrieben:
user profile iconZeitGeist87 hat folgendes geschrieben:

Was meint ihr, wozu das Public und Private gut ist?

Funktionen und Prozeduren, die nur in der eigenen Unit verwendet werden sind privat, die anderen publik.


Meiner Meinung nach Falsch. Methoden die nur in der eigenen Klasse verwendet werden sind Privat, die anderen publik.

Für Funktionen und Prozeduren gilt oben gesagtes - deklaration im interface-Teil: zugriff von aussen möglich, ansonsten nur aus der unit.


Dann probier mal sowas:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
type TKlasse1 = Class
         private
            procedure Tuwas;
         public
     end;

    TKlasse2 = Class
         public
            procedure Tuwas;
     end;

implementation


procedure TKlasse1.Tuwas;
begin
  showmessage('eins');
end;

procedure TKlasse2.Tuwas;
begin
  With TKlasse1.Create do
  begin
      TuWas;
      Free;
  end;
  showmessage('Zwei');
end;
Klappt ohne Probleme, zumindest bei D7 Personal. Private-Methoden sind innerhalb einer Unit sichtbar. Igendwann nach D7 wurde iirc Strict Private eingeführt - die sind dann nur innerhalb der Klasse sichtbar.

_________________
We are, we were and will not be.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 16:05 
@Gausi ja das weiß ich schon. Ich wollte doch nur ZeitGeist darauf hinweisen, dass seine Funktionen und Prozeduren dann Methoden einer Klasse sind, und dass man private/public in Units als taucht-im-interface-Teil-auf und taucht-im-interface-teil-nicht-auf schreibt.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Di 29.07.08 16:11 
Jup Tilman, da muss ich dir Recht geben.

Ich hab mir allerdings angewöhnt für jede Unit, auch wenn sie Formlos ist als eine eigene Klasse zu behandeln. Somit hab ich mir im Prinzip meine eigene kleine Bibliothek aufgebaut und diese Wird ständig erweitert.
Das System hat sich bewährt.
Meinem Azubi hab ich es auch ersteinmal standardkonform beigebracht.

LG
Stefan

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 16:18 
Naja gut, ist sicher Geschmackssache. Was mir daran nicht gefällt ist dass du doch jedesmal ne Instanz anlegen musst. Bei nur einer eigenen Unit geht das ja noch. Aber stellen wir uns einmal normales Delphi vor:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
dialogs := TDialogs.Create;
dialogs.showMessage('Hallo was geht ab');

sysUtils := tSysUtils.Create;
caption := sysUtils.IntToStr(200*3);


Klar was ich meine?

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Di 29.07.08 16:26 
Jup, ist klar ;-)

Wär ziemlich nervig, dass stimmt schon =)

Aber deswegen gibts für alles eine Funktion die mir das erzeugt und wieder zerstört.
Ist in den firmeninternen Anwendung die sinnvollste Methode. Aber kommt mir jetzt bitte nicht mit Speicherplatz und wie unsicher das doch ist :mrgreen:

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 16:38 
Nö, wenn du damit klarkommst (mit dem Aufrufen mein ich) ist dagegen nix einzuwenden. Bin keiner von den Speed und Memory-Knickern ^^

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
wicked Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 31.07.08 12:05 
hallo,

ich habe wieder ein problem mit einer einfachen funktion.. habs wohl doch noch nicht ganz verstanden.. es geht darum, dass man zum beispiel eine rechenaufgabe stellt (hier 3+3) und überprüft, ob die eingabe stimmt.. hier der quelltext:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ErgebnisEdit: TEdit;
    OkButton: TButton;
    Label1: TLabel;
    ErgebnisPanel: TPanel;
    procedure OkButtonClick(Sender: TObject);
    function Vergleich(Eingabe:Integer) : String;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Vergleich(Eingabe:Integer) : String;
begin
  if Eingabe=6
    then Result:='Das war richtig.'
    else Result:='Das war leider falsch.'
end;

procedure TForm1.OkButtonClick(Sender: TObject);
begin
  ErgebnisPanel.Caption:=Vergleich(StrToInt(ErgebnisEdit.Text))
end;

end.



danke schonmal für hilfe!!

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt