Avatar billede safl Nybegynder
12. august 2003 - 10:36 Der er 18 kommentarer og
1 løsning

Funktions problemer

Hello!

Det er 2 år siden ca. jeg sidst legede med Delphi så jeg er virkelig rusten! Jeg har denne funktion som ikke virker:

function create_connection_entry(): Integer;
var
  errcode: integer;
  newname: string;
  MagRasEdt: TMagRasEdt;
begin
  MagRasEdt := TMagRasEdt.Create(self);
  newname := 'testen';

// Load deafault!
    MagRasEdt.PPPDefault ;

// Sæt indstillinger
  with MagRasEdt do
  begin

    LocalPhoneNumber := 'xxx.xx';
    UserName := 'xxx';
    Password := 'xxx';
    DeviceName := 'WAN Miniport (PPTP)';
    DeviceType := 'WAN Miniport (PPTP)';

  end;
  errcode := MagRasEdt.PutAllEntryProps (newname) ;
  if errcode = 0 then MagRasEdt.PutDialProps (newname) ;
  MagRasEdt.Destroy;
  return := 1;
end;

ved linien:  MagRasEdt := TMagRasEdt.Create(self);
Melder den fejlen: "Undeclared identifier: 'self'"

Hvad går galt?

mvh safl
Avatar billede kustoden Nybegynder
12. august 2003 - 11:01 #1
Det er fordi det ikke er en metode i et objekt. Således er Self ikke defineret.

Du kan enten lave den som en del af et objekt (function TMyobject.Create_Conn...) eller Create TMagRasEdt med nil som owner i stedet for self.

Det vil også spare dig for access violations m.m. for når du creater den med en owner, vil den blive destructed, når owner bliver destructed.

M.a.o. lav det som :

function create_connection_entry(): Integer;
var...

begin
  MagRasEdt := nil
try try
  MagRasEdt := TMagRasEdt.Create(nil);
Do_Stuff...

finally
  FreeAndNil(MagRasEdt);
end;{finally}

except
  do_exceptionhandling();
end;{except}
end;{func}
Avatar billede safl Nybegynder
12. august 2003 - 11:10 #2
Jeg er ikke helt med der :) Som sagt er det år siden.
Koden jeg skrev til at starte med virkede fint i en procedure men jeg ville have det i en funktion da den procedure den skal være i ikke bliver fyldt med alt for meget.
Jeg prøvede det med nil men det virkede ikke rigtig :(
Avatar billede kustoden Nybegynder
12. august 2003 - 11:22 #3
Vi prøver igen :

Den oprindelige kode lå i en procedure i et object (en metode!)

procedure TMyObject.Create_Connection_Entry();

(Det interessante er TMyObject, som også kan hedde TForm1 o.m.a.)

Nu kender jeg ikke TMagRasEdt, men hvis den skal have en form e.l. i constructoren så smider du din for med i stedet for nil)

Du skriver ikke rigtig noget om hvorfor det ikke virker med nil. Hvad går galt?
Avatar billede safl Nybegynder
12. august 2003 - 11:29 #4
Den melder ingen fejl, den gør simpelthen bare ikke noget.
Avatar billede tolderlund Nybegynder
12. august 2003 - 11:40 #5
Det er ikke løsningen på dit problem, men...
Du skal aldrig kalde Destroy på et object:
  MagRasEdt.Destroy;
Altid kald Free:
  MagRasEdt.Free;
Avatar billede safl Nybegynder
12. august 2003 - 11:45 #6
Ok jeg tror bare jeg laver en procedure det virker som om det er det nemmeste selvom det ikke er for kønt :)
Avatar billede kustoden Nybegynder
12. august 2003 - 11:46 #7
Nu gør den altså ingenting? Hverken fejl eller noget andet?


Prøv lige at komme med hele funktionen i sin nuværende form.
Avatar billede safl Nybegynder
12. august 2003 - 12:32 #8
Sådan ser den ud nu:

procedure TForm1.create_connection_entry(Sender: TObject);
var
  username: string;
  password: string;
  con_name: string;
  MagRasEdt: TMagRasEdt;
begin

// Lav objectet
  MagRasEdt := TMagRasEdt.Create(self);

// Indlæs verdierne
  username := username_edit.text;
  password := password_edit.text;
  con_name := 'testen';

// Sæt default
    MagRasEdt.PPPDefault ;

// Sæt indstillinger
  MagRasEdt.LocalPhoneNumber := 'xxxx.xx';
  MagRasEdt.UserName := Username;
  MagRasEdt.Password := Password;
  MagRasEdt.DeviceName := 'WAN Miniport (PPTP)';
  MagRasEdt.DeviceType := 'WAN Miniport (PPTP)';

// Lav forbindelsen
  MagRasEdt.PutAllEntryProps (con_name) ;
  MagRasEdt.PutDialProps (con_name) ;

// Nak objectet
  MagRasEdt.Free;
end;

Men det fedeste ville være hvis det var en funktion hvor jeg kunne give brugernavn og password som parametre.
Avatar billede kustoden Nybegynder
12. august 2003 - 12:37 #9
Der har du jo lige nøjagtig det, jeg startede med at skrive.

Din procedure hedder : TForm1.create_connection_entry(Sender: TObject);

Altså en member metode i TForm1. Din funktion var ikke en del af TForm1.

Du skal altså erklæren den i enten private eller public i TForm1, og så i implementeringen skrive

function TForm1.create_connection_entry(Sender: TObject);

Forskellen er, som jeg skrev øverst i det første indlæg, at den tilhører et objekt (eller rettere en klasse) nemlig TForm1.

Hvis du bare havde læst mit første indlæg ville problemet have været løst for længe siden. :-)
Avatar billede kustoden Nybegynder
12. august 2003 - 13:09 #10
Du behøver vel strengt taget ikke Sender, da du ikke bruger den til noget, men så kunne du overføre brugernavn og password i stedet.
Avatar billede safl Nybegynder
12. august 2003 - 14:01 #11
Hvordan gør jeg det?
Avatar billede kustoden Nybegynder
12. august 2003 - 14:34 #12
Øverst i din pas-fil står der noget i retning af

TYPE
TForm1 = class(TForm)
bla bla bla
bla bla bla
end;

Prøv at smide det herud, så sætter jeg funktionserklæringen ind.
Avatar billede kustoden Nybegynder
12. august 2003 - 14:38 #13
Ellers se på denne

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
  function create_connection_entry(const UserName : String; const Password : String): Integer;

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


function TForm1.create_connection_entry(const UserName : String; const Password : String): Integer;

begin
  // Kopier din function ind her)
end;

end.
Avatar billede safl Nybegynder
12. august 2003 - 15:42 #14
Hvor erklærer jeg så mine variable? Den her stavl:
var
  username: string;
  password: string;
  con_name: string;
  MagRasEdt: TMagRasEdt;
Avatar billede athlon-pascal Juniormester
12. august 2003 - 15:49 #15
Overordnede på-tværs-af-funktioner-og-procedurer-variabler skal erklæres der hvor der i kustodens kode-eksempel står
var
  Form1: TForm1;

f.eks.
var
  Form1: TForm1;
  username: string;
  password: string;
  con_name: string;
  MagRasEdt: TMagRasEdt;
Avatar billede kustoden Nybegynder
12. august 2003 - 15:49 #16
OK, hvis jeg skal skrive programmet for dig, så kræver det lidt mere end 60 point. :-)

De erklæres i klassen, i dette tilfælde TForm1, bortset fra MagRasEdt, der jo bliver erklæret i funktionen.

Prøv at finde nogle gode bøger om Delphi og OOP.

se evt. http://www.eksperten.dk/spm/380852 o.l.
Avatar billede kustoden Nybegynder
12. august 2003 - 16:00 #17
Man kan selvfølgelig også gøre som athlon-pascal, og lave dem, så de kan tilgås fra hele din unit.
(Det kan man rent faktisk også med membervariable, men det er noget snavs, så det putter jeg lige i parantes).
Avatar billede safl Nybegynder
12. august 2003 - 16:28 #18
hehe det var mig der kogede jeg var igang med at erklære username og password igen!

Jeg siger mange tak for svarene nu kører skidtet som det skal og det er bare lækkert! Det var utrolig lærerigt for mig :) Jeg er slet ikke vant til at programmere på denne måde plejer at scripte i PHP og der er det så simpelt som det overhovedet kan blive.
Tusinde tak! Ha' en god dag!
Avatar billede kustoden Nybegynder
12. august 2003 - 18:00 #19
Dejligt at det virker.
God dag til dig.
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