Toon posts:

delphi beginners vraag over functies / procedures

Pagina: 1
Acties:
  • 241 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
ik heb begonnen om delphi te leren, het lukt al aardig.
ik heb Borland Delphi enterprise 6 geinstalleerd, en ik heb een leerboek voor delphi. Het leerboek heb ik van een oom gekregen, maar dat is bestemt voor versie 2 en 3 staat op de kaft.

Als ik STANDAARD een venster open en er nog nix in zet, dan ziet de source code er zo uit:
-------------------------------------------------------------------------------
unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

end.
--------------------------------------------------------------------------------
(tussen de stippel lijnen staat de source code.

Ik wil een functie / procedure erin zetten die ik overal in het programma kan aanroepen, maar dit lukt me niet.

de procedure(verwisselen van waarde) bevat devolgende source code:
----------------------------------------------------------------------------
a:=edit1.text
edit1.text:=edit2.text
edit2.text:=a
-------------------------------------------------------------------------------
a is hierbij een tijdelijke variabele voor in de procedure.

kan iemand me uitleggen HOE ik het moet doen?
want ik kom er niet meer uit.

zijn de verschillen tot wat je kan ERG groot tussen delphi 3 en 6?
anders is het makkelijker om te zoeken naar een oudere versie die beter bij het boek past? of maakt da nie uit?

Verwijderd

Topicstarter
owwjaa, heb al search gebruikt, maar da waren vrij vage antwoorden die ik kon vinden

  • Marv
  • Registratie: Oktober 2000
  • Laatst online: 11-06 06:52
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Test();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Test();
begin
//bla
end;


Tussen de haakjes kun je parameters gaan definieren :)

Edit: als je de functie overal wilt aanroepen moet je 'm misschien niet in private zetten maar in public ;)

"Everything I've ever done or said is the complete opposite of what I've wanted" -- George


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:58
Marv schreef op 12 oktober 2002 @ 13:42:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Test();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Test();
begin
//bla
end;


Tussen de haakjes kun je parameters gaan definieren :)

Edit: als je de functie overal wilt aanroepen moet je 'm misschien niet in private zetten maar in public ;)


Private en public zijn acces modifiers die bepalen waar die functie zichtbaar is.
Als je een functie in een class maakt (een member-function), dan kun je die functie niet oproepen zonder dat er een object van die class geinstantieerd is (tenzij het een static function is).
Private geeft aan dat de functie of member enkel zichtbaar/aanroepbaar is binnen de class
Public geeft aan dat de functie/member ook buiten de class zichtbaar is. Maar dat zal wel in dat Delphi boek uitgelegd staan.
Ik stel voor dat bavariaboy eerst moet leren gaan, en dan pas moet leren lopen. Je begint best bij het begin in dat boek, niet voorlopen en eerst alles goed begrijpen voor je naar het volgende hoofdstuk gaat.

Als je een functie wilt maken die je overal kunt oproepen zonder dat je een object nodig hebt, dan moet je een gewone functie maken. Die definieer je in het interface gedeelte en werk je uit in het implementation gedeelte.

code:
1
2
3
4
5
6
7
8
9
interface

procedure TestFunction();

interface
procedure TestFunction()
begin
  // Hier komt de code
end;

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:58
Verwijderd schreef op 12 oktober 2002 @ 13:37:
zijn de verschillen tot wat je kan ERG groot tussen delphi 3 en 6?
anders is het makkelijker om te zoeken naar een oudere versie die beter bij het boek past? of maakt da nie uit?


Misschien koop je best een boek over Delphi6?

Het beste is eerst dat je de basis dingen onder de knie hebt, en deze zullen niet zo verschillend zijn in beide versies.

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 30-08 22:17

mulder

ik spuug op het trottoir

denk dat je even wat dingen moet gaan leren. Als je een functie overal wilt gebruiken zul je deze in een unit moeten plaatsen. De plek waar je deze functie plaatst moet ook weten dat dus die unit gebruikt moet worden (uses). Vervolgens weet die functie niet wie edit1 is. Dus die zul je aan de functie moeten meegeven. :/

Ik denk niet dat jij een boek zoekt die meer op delphi 6 is gericht, maar een boek dat op programmeren is gericht. Zoek eens op google naar wat voorbeeld programmaatjes (voor bv Delphi 6) en ga daar eens mee spelen, daar leer je het meest van.

oogjes open, snaveltjes dicht


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 12:54

Tomatoman

Fulltime prutser

Met dat boek voor Delphi 2 en 3 moet je zeker uit de voeten kunnen.

Om basaal inzicht te krijgen in hoe Object Pascal - de programmeertaal van Delphi - werkt, zou je eerst eens een eenvoudig consoleprogramma kunnen maken: File - New - Other... - Console Application. Daarmee maak je een Windows-programma dat in een DOS-box draait, zodat je je geen zorgen hoeft te maken over objecten, access specifiers en dergelijke en je helemaal kunt richten op hoe procedures en functies werken. Hier een voorbeeld hoe je met een globale functie werkt:

Delphi:
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
program VoorbeeldProg;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function MaalTwee(n: Integer): Integer;
begin
  Result := n * 2;
end;

var
  S: string;
  n: Integer;
begin
  Write('Typ een regel tekst: ');
  Readln(S);
  Writeln('Je typte: ', S);

  Write('Typ een getal: ');
  Readln(n);
  n := MaalTwee(n);
  Writeln('Het getal maal twee is ', n);

  Writeln('Druk op <Enter> om het programma te verlaten.');
  Readln;
end.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Ik heb vorig jaar pascal gehad op school, vandaar dat hij de overstap op delphi beter leek dan C++ (maar dat doet er niet toe in dit topic). De programmeertaal ken ik een klein beetje, en ook het maken van programmatjes lukt.

maar nou wou ik dus een programmatje uit het boek maken, waar ook bij beschreven staat hoe ik dan een functie maak, maar dat lukt me dus niet echt.

een voorbeeld van hoe in het boek procedures / functies worden gedaan.
-------------------------------------------------------------------------------------
unit Unit2;

interface
procedure Verwissel (var A,B:String);
//Verwisselt de waarden van A en B
function Wortel (A:Extended):Extended;
//Benadert de vierkantswortel uit A

implementation

procedure Verwissel;
var OnthoudEven: String;
begin
OnthoudEven:=A;
A:=B;
B:=OnthoudEven;
end;

function Wortel;
var X,XNieuw: Extended;
begin
A:=Abs(A);
XNieuw:=1;
repeat
X:=XNieuw;
XNieuw:=(X+A/X)/2;
until Abs(XNieuw-X)<1E-15;
Result:=XNieuw;
end;
end.
-------------------------------------------------------------------------------------

allemaal leuk en aardig wat ze in het boek schrijven, maar als ik dat dus ingeef in delphi, en ik maak ff 2 knoppen om ze aan te roepen
source code zie hieronder:
---------------------------------------------------------------------------------------------
unit Unit1;

interface
procedure Verwissel (var A,B:String);
//Verwisselt de waarden van A en B
function Wortel (A:Extended):Extended;
//Benadert de vierkantswortel uit A

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure Verwissel;
var OnthoudEven: String;
begin
OnthoudEven:=A;
A:=B;
B:=OnthoudEven;
end;

function Wortel;
var X,XNieuw: Extended;
begin
A:=Abs(A);
XNieuw:=1;
repeat
X:=XNieuw;
XNieuw:=(X+A/X)/2;
until Abs(XNieuw-X)<1E-15;
Result:=XNieuw;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
a:=edit1.text; B:= edit2.text;
verwissel(a,b)
edit1.text:=a; edit2.text:=b
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit2.text:=floattostr(wortel(strtofloat(edit1.text)));
end;

end.
---------------------------------------------------------------------------------

dan krijg ik een HELE lijst met errors bij het compileren, wat doe ik dan fout?

[ Voor 0% gewijzigd door Verwijderd op 12-10-2002 17:40 . Reden: kleine foutjes verbeterd ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:58
Tja, mocht je nu eens zeggen welke compiler-errors je kreeg, en op welke lijn je die kreeg, en enkel de relevante code had gepost, dan ging dat al veel beter/makkelijekr zijn.
Trouwens, imho moet je compiler - errors wel zelf kunnen oplossen. De compiler heeft je al aan op welke lijn het fout gaat en geeft je al een omschrijving van de fout.

Tip: gebruik ook code-tags als je hier code post.

https://fgheysels.github.io/


Verwijderd

Topicstarter
code tags???
maar owkeej, ik kreeg errors op de regel van uses al bijv.
wat ik vreemd vind...
[Error] Unit1.pas(9): Declaration expected but 'USES' found

daarna kwamen :
[Error] Unit1.pas(14): Undeclared identifier: 'TForm'
[Error] Unit1.pas(15): Undeclared identifier: 'TEdit'
[Error] Unit1.pas(17): Undeclared identifier: 'TButton'
[Error] Unit1.pas(46): Undeclared identifier: 'l'
en nog een paar, maar dan wordt de lijst wat lang


owja, ik ben de variable a en b vergeten te declareren, maar vergeef me dit foutje aub, de compiler doet het ook niet als ik deze wel declareer.

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:58
Jawel.

[code] en afsluiten met [ /code]
maar owkeej, ik kreeg errors op de regel van uses al bijv.
wat ik vreemd vind...
[Error] Unit1.pas(9): Declaration expected but 'USES' found

daarna kwamen :
[Error] Unit1.pas(14): Undeclared identifier: 'TForm'
[Error] Unit1.pas(15): Undeclared identifier: 'TEdit'
[Error] Unit1.pas(17): Undeclared identifier: 'TButton'
[Error] Unit1.pas(46): Undeclared identifier: 'l'
en nog een paar, maar dan wordt de lijst wat lang
Staat er in jouw boek niets over de structuur van een unit file?

Zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface

uses
  blaa;

procedure Test();
function     Test2() : Integer;

implementation

uses
  nogblaat

procedure Test
begin
end;

function Test2() : Integer;
begin
end;


Misschien lees je toch nog eens best goed in dat boek hoor...

https://fgheysels.github.io/


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 12:54

Tomatoman

Fulltime prutser

1. In de FAQ kun je lezen hoe je code netjes kun weergeven in het forum (vervang < en > door [ en ]):
<code=delphi>
{hier komt je code}
</code>
Laat maar, Whoami was me voor.

2. Je typt:
code:
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  a:=edit1.text; B:= edit2.text;
  verwissel(a,b)

Daar gaan een paar dingen fout. Ten eerste moet iedere regel eindigen met een puntkomma (behalve "begin" en "if/then/else"). Ten tweede zijn a en b nergens gedeclareerd. Er staan wel een A en B in de procedure Verwissel, maar dat zijn locale variabelen. Locale variabelen zijn alleen zichtbaar binnen de procedure Verwissel, maar niet daarbuiten. Je zult daarom a en b binnen Button1Click moeten definiëren. Om verwarring met de variabelen in Verwissel te voorkomen, kun je ze dan meteen andere namen geven en de code wat netter maken (hoofdletters, spaties, iedere regel code op een eigen tekstregel):
code:
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button1Click(Sender: TObject);
var
  Eerste, Tweede: string;
begin
  Eerste := Edit1.Text;
  Tweede := Edit2.Text;
  Verwissel(Eerste, Tweede);
  Edit1.Text := Eerste;
  Edit2.Text := Tweede;
end;


3. Al is het niet noodzakelijk, het is heel handig om de declaratie van de functievariabelen in het interface-gedeelte te herhalen in het implementation-gedeelte. Dat maakt het gemakkelijker om de implementatie van de functie te begrijpen.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
interface

procedure Verwissel(var A, B: string);

...

implementation

procedure Verwissel(var A, B: string);
begin
  ...

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
van de declaratie had ik al gezegt...
de error die de compiler tegenkomt als eerste wordt niet opgelost door de punt-komma's die ik vergeten ben bij het intypen van de code hier op GOT.

en ik snap nou nog steeds niet hoe ik die procedure moet maken

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 18-08 10:58

Bergen

Spellingscontroleur

Volgende keer graag de hele unit hier geven van wat je zelf hebt geprobeerd, niet 2 losse stukjes code :) Anyway, hier een voorbeeld, de rest moet je ff zelf uitwerken!!
Delphi:
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
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Verwissel; // dit is de declaratie
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    Verwissel; // dit is de aanroep
end;

procedure TForm1.Verwissel; // Dit is de uitwerking, let op 'TForm1.' wat ervoor staat
var
    Tijdelijk: string; // veel betere variabele-naam dan jouw 'a'
begin
    Tijdelijk := edit1.text;
    edit1.text := edit2.text;
    edit2.text := Tijdelijk;
end;

end.

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 07:04
Je hebt wel bij uses Forms bij toegevoegd?? Want hij herkent TForm niet :? Of de buttons op de form gezet??

Verwijderd

Topicstarter
ik heb een nieuw project aangemaakt in delphi (helemaal opnieuw begonne dus) en ik heb edit1.text en edit2.text en een button op ut form geplaatst...

daarna heb ik de stukjes overgenomen zoals GerbenW het heeft gezegt, en de verwissel werkt, ik ga ff wat experimenteren hiermee...
heb ook nog wat andere source codes gevonden op internet, en ga daarmee ook aan de slag...

jullie horen nog wel van me als ik er weer niet uitkom, vooralsnog HARTELIJK DANK

Verwijderd

Topicstarter
en dat de compiler Tform niet herkende, weet ik ook niet
maar dat laad ik nou maar zitte, want nou heb ik geen errors
Pagina: 1