Avatar billede pjotre Novice
04. december 2003 - 17:08 Der er 12 kommentarer og
1 løsning

Kald af en function

Jeg har 2 Forms, hvor jeg har lavet en function i Form1.
Nu vil jeg kalde denne functionfra From2 - Kan man det?
Mvh Pjotre
Avatar billede the-unknown-soldier Nybegynder
04. december 2003 - 17:14 #1
Hvis du vil kalde kode fra en unit i en anden unit, skal du blot tilføje navnet på den unit, hvor koden ligger til din uses liste.
Avatar billede pjotre Novice
04. december 2003 - 20:20 #2
Det har jeg allerede gjort. I Form2 referere jeg allerede nu til nogle variabler, som er defineret i Form1 - og dette virker.
Avatar billede cden Nybegynder
04. december 2003 - 20:29 #3
Hvis Form1 ligger i Unit1, skal du i Unit2 under uses tilføje Unit1.(Se ovenover).
Din funktion i Form1 skal være erklæret under public, med mindre det er en funktion der er gennereret af delphi selv (ex. en ButtonClick), så er den i orden.

Form1 er et objekt af klassen TForm1, og hedder sikkert Form1.
Den er erklæret under klassen (var Form1: TForm1;)

Når du vil kalde din funktion i Form1 (ex. function VisNr:integer;)
så kalder du Form1.VisNr;
Avatar billede janbb Juniormester
05. december 2003 - 00:22 #4
ja problemet kan være at du skal def/declarere var og konst i funktionen. Det skulle man ikke i fordums versioner.
Avatar billede pjotre Novice
05. december 2003 - 11:04 #5
Jeg har følgende kode i Unit1 (form1), og hvor funktionen ligger:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

    { Private declarations }
  public

  private
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

function HentFelt(x : string) : string;
begin
HentFelt := 'a';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Show;
end;

end.

Her er så unit2, hvor jeg får fejl i compileringen:

unit Unit2;

interface

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

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

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.DFM}

procedure TForm2.Button1Click(Sender: TObject);
begin
edit1.Text := Form1.hentfelt('xx');           
{ her kommer fejlen: undeclared identifier: hentfelt }
end;

end.

Er der nogen, som kan se hvad der er galt?
Avatar billede janbb Juniormester
05. december 2003 - 12:25 #6
Jeg ville prøve at erklære min funktion først  - bare (ellers skal du lade hele funktionsbeskrivelsen indgå når du kalder altså
HentFelt(x : string)('xx'); men prøv det andet først og så evt begge dele til sidst)


unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

    function HentFelt(x : string) : string;


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.DFM}

procedure TForm2.Button1Click(Sender: TObject);
begin
edit1.Text := Form1.hentfelt('xx');           
{ her kommer fejlen: undeclared identifier: hentfelt }
end;

end.
Avatar billede janbb Juniormester
05. december 2003 - 12:28 #7
ellers flyt erklæringen ned under implementationen.Ked af jeg ikke kan huske det mere præcist.Skal prøve at finde et eksempel hvis det stadig driller.
Avatar billede pjotre Novice
05. december 2003 - 12:53 #8
Når jeg prøver dette, får jeg: Unsatisfied forward or external declaration: 'TForm2.Hentfelt'
Avatar billede the-unknown-soldier Nybegynder
05. december 2003 - 17:05 #9
Enten skal du tilføje din Function til typedefinitionen af TForm1 under Public, eller blot efter typedefinitionen(Se nedenstående)
Når Unit1 så er tilføjet under Uses i Unit2, kan funktionen kaldes fra begge units.

type
  TForm1 = class(TForm)
    Form1EditBox: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }

  end;

Function HentFelt(x : string): String;

var
  Form2: TForm2;

implementation

Bemærk at du nu ikke skal kalde Funktionen ved Form1.hentfelt('xx') men ved
hentfelt('xx').

Håber det kan hjælpe dig lidt videre.
Avatar billede cden Nybegynder
06. december 2003 - 10:32 #10
Der er 2 ting du behøver at ændre i din kode for at det virker.

1. I unit1 skal du under klasse erklæringen tilføje din funktion under public:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function HentFelt(x:string) : string;  ***** HER ER ÆNDRING 1
  end;

2. Du skal i implementeringen af funktionen i unit1 skrive klassenavnet foran funktionsnavnet:

implementation

{$R *.dfm}

uses Unit2;

function TForm1.HentFelt(x : string) : string; ***** HER ER ÆNDRING 2 (TForm1.)
begin
HentFelt := 'a';
end;

Dette virker !
Avatar billede hrc Mester
12. december 2003 - 09:55 #11
Er svaret simpelthen ikke, at du skal referere til den ene fil i den øverste Uses-linie, mens den anden skal referere til den første via en Uses placeret under implementation delen?
Avatar billede pjotre Novice
14. januar 2004 - 12:31 #12
Jeg har desv. ikke fået nogle svar som virker, så jeg lukker hermed spørgsmålet
Avatar billede janbb Juniormester
14. januar 2004 - 17:46 #13
Det er da lidt trist du ikke har fået succes med så simpel en ting.Det er nok gået lidt af 'mode' med brugen af funktioner så mange har måske lissom mig svært ved at finde de eksempler hvor det sidst blev brugt.Skal prøve at have det lidt i baghovedet hvis jeg støder på det .)
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