Avatar billede d34c0n Praktikant
15. maj 2002 - 22:45 Der er 53 kommentarer og
2 løsninger

"Function...?

Er her en der kan forklare i bund og grund hvad det er, og gerne noget detaljeret om hvordan man gør osv.
Avatar billede d34c0n Praktikant
15. maj 2002 - 22:46 #1
Det er faktisk fordi at de fleste sider med koder er noget med en "function" - som f.eks. så jeg følgende:

function GetDiskSerialNo(Drive: char): String;
Avatar billede hermandsen Juniormester
15. maj 2002 - 22:54 #2
En function er ligesom en procedure... En udrører nogle handlinger, men til forskel fra proceduren så kommer function'en ud med et resultat til sidst...
Avatar billede d34c0n Praktikant
15. maj 2002 - 22:56 #3
hvad mener du med "resultat" som du siger, og kan jeg ikke få et eks. på noget kode - bare så at jeg forstår meningen i den!

jeg er ikke lige med...
Avatar billede d34c0n Praktikant
15. maj 2002 - 22:57 #4
jeg sagde desuden også "detaljeret" :)
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:01 #5
her er et eksempel:

function test(i1, i2 : integer) : integer;
begin
  result := i1+i2;
end;

denne function kalder du ved eksempelvis

begin
showmessage(inttostr(test(1,1)));
end;

nu lægger funktionen 1 til 1 og viser resultat i messagebox...
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:02 #6
Se på følgende:

function Calc(x, y: Integer): Integer;
begin
  Result := x*y;
end;

Her udregner vi med functionen Calc et resultat af x og y når de ganges sammen... Så kan du, ligesom ved en procedure, kalde Calc...

procedure Udregn;
var
  i, j, Resultat: Integer;
begin
  i := Random(20);
  j := 15;
  Resultat := Calc(i, j);
end;

Du kan også retunere strenge, floats, records, osv.

Endnu et eksempel:

function ErstatNulMedK(I: Integer): String;
var
  J: Integer;
  S: String;
begin
  S := IntToStr(I);
  for J := 1 to Length(S) do
  begin
    if S[J] = '0' then
      Result := Result + 'k'
    else
      Result := Result + S[J];
  end;
end;

Du bruger function's hele tiden... IntToStr er for eksempel en function. Length, som jeg også har brugt, er en function.
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:03 #7
nu er jeg nogenlunde med, men det behøver man ikke nødvendigvis gøre med en function så!

og forresten hvor skriver man henne i source-koden, en function??
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:04 #8
Hehe... Jaja, jeg skal også lige ha' tid til at skrive! :)
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:08 #9
I mange tilfælde er det godt at bruge funktioner især hvis du flere steder i samme kode skal lave den samme beregning - det spare plads, tid og gør det nemmere at overskue... Desuden kan du skrive dine funktioner overalt i din kode - ligesom procedure...
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:10 #10
Den kan du skrive ligesom du skriver en procedure:

private
  function Calc(x, y): Integer;

function TForm1.Calc(x, y): Integer;
begin
  Result := x*y;
end;

Eller du kan bare skrive den før den kode du skal bruge, så behøver du ikke at erklære den i private-afsnittet... Så kan du bare skrive:

function Calc(x, y): Integer;
begin
  Result := x*y;
end;

Den kan også være inde i en anden procedure, eller function...

procedure TForm1.Button1Click(Sender: TObject);

  funtion SammenSaet(S1, S2: String): String;
  begin
    Result := S1 + S2;
  end;

begin
  Edit1.Text := SammenSaet(Edit1.Text, SammenSaet(SammenSaet('Hejsovs', Edit1.Text), Edit2.Text));
end;

På den måde kan du også bruge functioner i functioner... Du kan endda kalde en function fra sin egen function, men pas på med det, da det hurtigt kan blive til MANGE function's kald!!! :)

Håber det hjalp lidt!

//hermandsen
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:10 #11
Du kan også (ligesom procedurere) skrive dine funktioner i en anden unit og dermed kunne hente funktionerne fra mange forskellige units... Det gør det ofte lettere at arbejde med!
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:13 #12
Yepper! Som zerohero siger... Jeg skulle en gang lave et program der skulle bruge enormt mange functioner som ikke havde noget med programmet at gøre, men i stedet var ren regne atbejde... Så er det nemlig skide smart at ha' dem i en anden unit, så så lægge den under uses-afsnittet!
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:15 #13
okay :)

hvad så med efter parantesen der står " : string" hvorfr skal det med når der står navnene : string?
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:16 #14
Det er resultatet den returnerer!
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:18 #15
Jeg er foreksempel ved at lave en unit som kan en forfærdentlig masse fedt med OpenGL (3D). Så hver gang jeg laver en ny applikation med OpenGL så bruger jeg bare den samme unit og udvikler videre på den - så er jeg fri for at opfinde den dybe tallerken hver gang SMART ;)) Du kan også putte dem ind i en dll og gøre samme nummer!!!!
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:19 #16
i kender vel ikke en side eller lign. hvor jeg kunne læse om functions?
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:19 #17
Altså hvis du skriver function: String; så returnerer den en streng... Det kunne f.eks. være at du ønskede klokke-slettet lige nu som en streng. Der behøver du f.eks. ingen paranteser:

function KlokkenNu: String;
begin
  Result := TimeToStr(Time);
end;

Du kan også returnere alt muligt andet... F.eks. et TPoint, som er en record:

function TForm1.TopPunkt: TPoint;
begin
  Result.x := Form1.Left;
  Result.y := Form1.Top;
end;
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:20 #18
Det der står inde i parateserne er din InPut og det der står efter er din OutPut! Desuden kan du lave flere OutPuts ved at anvende en record!!!
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:21 #19
Kig Delphi's hjælpe-fil der står en masse!!!
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:21 #20
procedure TForm1.Button1Click(Sender: TObject);
function homo(homo1, homo2 : string) : string;
begin
homo1 := 'lol';
homo2 := 'lamer';
end;
begin
showmessage(homo(homo1,homo2));
end;



end.

hvad er fejlen ved dette?
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:23 #21
function homo(homo1, homo2 : string) : string;
begin
homo1 := 'lol';
homo2 := 'lamer';
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(homo(homo1,homo2));
end;

prøv dette...
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:23 #22
Det kan du i Delphi's hjælp! Ellers så søg lidt på google! Nettet svømmer i hjælp (og porno)! :)
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:24 #23
desuden mangler du result i din funktion

function homo(homo1, homo2 : string) : string;
begin
result := homo1+homo2;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(homo(homo1,homo2));
end;
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:25 #24
zero, jeg kan jo ikke plusse string, der skal jeg jo have integer, og jeg vil jo også angive de strings en værdi.. forstår du?
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:25 #25
Hov...

function homo(homo1, homo2 : string) : string;
begin
result := homo1+homo2;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(homo('lol','larmer'));
end;

Nu virker det!!!
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:26 #26
procedure TForm1.Button1Click(Sender: TObject);
  function homo(homo1, homo2 : string) : string;
  begin
    Result := homo1 + homo2;
  end;

begin
  showmessage(homo('lol','lamer')); //der skulle lige en komma ind!
  //og så kender den ikke variablerne homo1 og homo2. De ligger jo i function'en homo.
end;

end.
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:27 #27
hvis du pluser to strings så forlænger den bare de to strings med hinanden... Men nu ved jeg ikke lige hvad du ville med din funktion
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:27 #28
og der skal ALTID result ind??
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:28 #29
Ja... ellersbliver der ikke retuneret noget - så kunne du jo ligeså godt have brugt en procedure ;)
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:29 #30
og kan man ikke angive deres værdier i functionen så man ikke behøver det i showmessage proceduren?
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:29 #31
ups buttonclick proceduren even
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:30 #32
>>d34c0n
Du kan godt "plusse" strenge sammen det giver bare:

'Davs!' + 'homo' = 'Davs!homo'
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:31 #33
ved det!
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:32 #34
Jo, men så er ideén jo med en funktion jo lidt væk. Det er selvfølig ikke den fedeste eksempel jeg har brugt for at vise fordelen - men den kan vel bruges til at vise teknikken... :-))
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:33 #35
i skal have tak for hjælpen, begge to :)

ved i hvor man kan læse om at inkludere en DLL-fil i sin app.?
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:34 #36
Du skal altid tænke på hvilken formål du vil bruge det. Er det noget med en værdi der skal returners så brug en funktion ellers så brug en procedure!!!
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:35 #37
>>d34c0n
Du behøver ikke at skrive Result, men så har du jo ingen glæde af function'en, og som zerohero siger, så kunne du ligeså godt ha' brugt en procedure...

Du kan også returnere resultatet med function'ens navn. Som jeg viser her:

function Calc(x, y: Integer): Integer;
begin
  Calc := x*y;
end;

Det er det samme som at skrive:

function Calc(x, y: Integer): Integer;
begin
  Result := x*y;
end;
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:36 #38
Og så bare skrive ShowMessage(Calc); ?
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:36 #39
Jamen velbekomme da! :)

Det blev sgu hurtigt et langt spørgsmål!!! :)
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:37 #40
:)
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:37 #41
men jeg blev klogere.. hehe
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:38 #42
Neeeeej, det kan du så ikke, for Calc returnerer jo en Integer, og ShowMessage skal bruge en String. Så kan du i stedet skrive:

ShowMessage(IntToStr(Calc(2, 5)));
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:39 #43
>>d34c0n

Hehe... Jamen det var da altid noget! :)
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:39 #45
"I mange tilfælde er det godt at bruge funktioner især hvis du flere steder i samme kode skal lave den samme beregning - det spare plads, tid og gør det nemmere at overskue... Desuden kan du skrive dine funktioner overalt i din kode - ligesom procedure..."

.. Det kan man da ikke, da man skal angive dens navnes værdier hver gang!?
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:40 #46
sup.. tak
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:40 #47
jeg smutter altså i seng nu.. kan i sove godt ;)
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:42 #48
Hvad mener du med at kan man ikke????
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:43 #49
Hvad mener du med at "skal angive dens navn værdier hver gang!?"

Godnat :-))
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:43 #50
ja altså i en showmessage skriver i jo dens værdi der skal vises fx showmessage(din_function('værdi1','værdi2');
Avatar billede d34c0n Praktikant
15. maj 2002 - 23:45 #51
ups to ))'er ..
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:45 #52
Hvor kan du ikke skrive det flere steder i din kode?
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:45 #53
Ups! Hvor = Hvorfor :-))
Avatar billede zerohero Nybegynder
15. maj 2002 - 23:49 #54
Funktionen skriver du jo kun én gang men kaldene til funktionen kan du jo sagtens skrive mange gange rundt onktring i din kode!!!
Avatar billede hermandsen Juniormester
15. maj 2002 - 23:52 #55
Jaaaaaah, han skal skrive function'ens navn hver gang, men tænk lige på det her:

procedure TForm1.Button1Click(Sender: TObject);
  function Calc(x, y: Real): Real;
  begin
    Result := 15*x-7*y*y-3*x;
  end;
var
  x, y: Real;
begin
  x := 2.2;
  y := 5.1;
  ShowMessage(FloatToStr(Calc(x, Calc(Calc(y, Calc(x, y)), y))));
end;

Det ville være MEGET besværligt at skrive hele regnestykket ud i en køre hvis man ikke havde Calc-function'en! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester