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
Annonceindlæg fra Infor
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}
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 :(
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?
12. august 2003 - 11:29
#4
Den melder ingen fejl, den gør simpelthen bare ikke noget.
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;
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 :)
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.
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.
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. :-)
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.
12. august 2003 - 14:01
#11
Hvordan gør jeg det?
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.
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.
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;
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;
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.
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).
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!
12. august 2003 - 18:00
#19
Dejligt at det virker. God dag til dig.
Kurser inden for grundlæggende programmering