Autor |
Beitrag |
wicked
      
Beiträge: 19
|
Verfasst: 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:
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 public 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 Gausi: Delphi-Tags hinzugefügt
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Di 29.07.08 09:43
Hi und
in solchen Fällen empfiehlt sich immer der Crashkurs von Christian.
Viele Grüße
|
|
ImbaPanda
      
Beiträge: 98
Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
|
Verfasst: 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:
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
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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: Di 29.07.08 09:50
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function Kreisflaeche(Radius:Real) : Real; begin Result:=Pi*sqr(Radius); end;
procedure TForm1.RechnenButtonClick(Sender: TObject); begin FlaecheEdit.Text:=FloatToStr(Kreisfläche(Parameter);end; |
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Di 29.07.08 10:03
huuuuuh hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function Kreisflaeche(Radius:Real) : Real; begin Result:=Pi*sqr(Radius); end;
procedure TForm1.RechnenButtonClick(Sender: TObject); begin FlaecheEdit.Text:=FloatToStr(Kreisfläche(Parameter);end; | |
Wat?
Du hast ne Klammer vergessen..
Und was soll an ImbaPandas 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 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: 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
      
Beiträge: 98
Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
|
Verfasst: Di 29.07.08 11:28
Jepp ist meistens so^^ Einer ist immer schneller
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Di 29.07.08 15:46
Tilman 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Di 29.07.08 15:50
ZeitGeist87 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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Di 29.07.08 16:00
ZeitGeist87 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 29.07.08 16:00
Tilman hat folgendes geschrieben: | ZeitGeist87 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:
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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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:
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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 
      
Beiträge: 19
|
Verfasst: 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:
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 public 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 Christian S.: Delphi-Tags hinzugefügt
|
|
|