/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Kan man sende en TList med som var-paramet~
Fra : Carsten Madsen


Dato : 05-12-00 20:03

Subj.

Haster, tak for alle svar

MVH
Carsten



 
 
Harald Kroning (05-12-2000)
Kommentar
Fra : Harald Kroning


Dato : 05-12-00 20:29

"Carsten Madsen" <carstensm@hotmail.com> skrev i en meddelelse
news:YUaX5.991$7E2.82444@news101.telia.com...
> Subj.
>
> Haster, tak for alle svar

Øhhh... Ja, men hvorfor skulle man gøre det? (det er der sikkert nogle der
kan komme med eks. på :)

MVH HK



David A. D. Konrad (06-12-2000)
Kommentar
Fra : David A. D. Konrad


Dato : 06-12-00 09:14

Harald Kroning wrote in message <90jfmg$dsr$1@news.inet.tele.dk>...
>"Carsten Madsen" <carstensm@hotmail.com> skrev i en meddelelse
>news:YUaX5.991$7E2.82444@news101.telia.com...
>> Subj.
>>
>> Haster, tak for alle svar
>
>Øhhh... Ja, men hvorfor skulle man gøre det? (det er der sikkert nogle der
>kan komme med eks. på :)

For at bearbejde listen, måske? En anden grund til at man skulle gøre det,
dog ikke i forbindelse med objekter, men med ting som arrays er, at man på
den måde kun overfører adressen, og ikke hele variablen.

hilsen,




Niels (niLLer) (05-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 05-12-00 20:49

Just as I expected, "Carsten Madsen" <carstensm@hotmail.com> came up
with this:

>Kan man sende en TList med som var-parameter til en procedure?

Sagtens, men det given ingen mening for de fleste. Hvis du skriver:

procedure MinProc(var Liste: TList);

og så kalder proceduren med en initialiseret (created) TList, så vil
det eneste proceduren får være en pointer til en TList. Du kan så
ændre værdien af den pointer for at få Liste til at pege på en anden
liste, men:

procedure MinProc(Liste: TList); // uden "var"!!
begin
Liste.Add(@MinProc); // sikkert helt ubrugeligt, meen...
end;

vil sagtens kompilere og køre, fordi du kalder en metode i objektet.
Hvis nu TList havde en feltvariabel under Public eller Published ville
du også sagtens kunne ændre den, fordi det ikke er værdien af Liste du
ændrer på, men indholdet af det Liste peger på!

Håber det var forståeligt.

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

Stig Johansen (05-12-2000)
Kommentar
Fra : Stig Johansen


Dato : 05-12-00 21:27

Hej.


Niels (niLLer) <nmartin@ispam.com> wrote in message
news:3a2d45ad.27572235@news.12move.dk...
> Just as I expected, "Carsten Madsen" <carstensm@hotmail.com> came up
> with this:
>
> >Kan man sende en TList med som var-parameter til en procedure?
>
> Sagtens, men det given ingen mening for de fleste. Hvis du skriver:
>

Joh, det giver da mening for nogle af os.
I proceduren kan han da:
*Tilføje elementer.
*Fjerne elementer
*Finde elementer og operere på de objects, der er i listen.
*Free'e den og sætte den til NIL.

og sikkert meget mere, jeg ikke lige er kommet i tanke om.

Husk også, at en TList er en glimrende 'placeholder' for eksempelvis
integers.

[klip]
--
Med venlig hilsen/Best Regards
Stig Johansen - stig@w3data.dk
W3 Data - mailto@w3data.dk





Niels (niLLer) (05-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 05-12-00 21:35

Just as I expected, "Stig Johansen" <stig@w3data.dk> came up with
this:

>> >Kan man sende en TList med som var-parameter til en procedure?
>>
>> Sagtens, men det given ingen mening for de fleste. Hvis du skriver:
>>
>
>Joh, det giver da mening for nogle af os.
>I proceduren kan han da:
>*Tilføje elementer.
>*Fjerne elementer
>*Finde elementer og operere på de objects, der er i listen.
>*Free'e den og sætte den til NIL.
>
>og sikkert meget mere, jeg ikke lige er kommet i tanke om.

Den eneste af de ting du har skrevet der man kun kan hvis man bruger
"var" vil være at sætte variablen til "nil". Resten operer kun på det
pointeren peger på!

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

David A. D. Konrad (06-12-2000)
Kommentar
Fra : David A. D. Konrad


Dato : 06-12-00 09:19

Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...

>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
>"var" vil være at sætte variablen til "nil". Resten operer kun på det
>pointeren peger på!

Helt forkert. Netop ved at bruge en var-variabel kan man behandle listen
nøjagtigt som man lyster. Prøv følgende :

function F1(var T:TStringList);
begin
T.add('abc');
end;

procedure P1;
var T:TStringList;
begin
T:=TStringList.create;
F1(T);
//T[0] er nu lig med abc
end;

hilsen,




Jesper Krog Andersen (06-12-2000)
Kommentar
Fra : Jesper Krog Andersen


Dato : 06-12-00 10:05

konrad@dadk.dk (David A. D. Konrad) wrote in <sDmX5.1322$72.18461
@twister.sunsite.auc.dk>:

>Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
>
>>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
>>"var" vil være at sætte variablen til "nil". Resten operer kun på det
>>pointeren peger på!
>
>Helt forkert. Netop ved at bruge en var-variabel kan man behandle listen
>nøjagtigt som man lyster. Prøv følgende :
>

//Kode klippet

Prøv det samme, uden var. Det giver samme resultat.

/Data

Jan (06-12-2000)
Kommentar
Fra : Jan


Dato : 06-12-00 11:24

Hi.

"Jesper Krog Andersen" <data@krikkit.removethis.dk> skrev i en meddelelse
news:9002634FEdatakrikkitdk@194.182.148.146...
> konrad@dadk.dk (David A. D. Konrad) wrote in <sDmX5.1322$72.18461
> @twister.sunsite.auc.dk>:
>
> >Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
> >
> >>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
> >>"var" vil være at sætte variablen til "nil". Resten operer kun på det
> >>pointeren peger på!
> >
> >Helt forkert. Netop ved at bruge en var-variabel kan man behandle listen
> >nøjagtigt som man lyster. Prøv følgende :
> >
>
> //Kode klippet
>
> Prøv det samme, uden var. Det giver samme resultat.
>
> /Data

A constant (const) parameter is like a local constant or read-only variable.
Constant parameters are similar to value parameters, except that you can't
assign a value to a constant parameter within the body of a procedure or
function, nor can you pass one as a var
parameter to another routine. (But when you pass an object reference as a
constant parameter, you can still modify the object's properties.)
Using const allows the compiler to optimize code for structured- and
string-type parameters. It also provides a safeguard against unintentionally
passing a parameter by reference to another routine.

Here, for example, is the header for the CompareStr function in the SysUtils
unit:

function CompareStr(const S1, S2: string): Integer;

Because S1 and S2 are not modified in the body of CompareStr, they can be
declared as constant parameters.

-Jan



Thomas Due (07-12-2000)
Kommentar
Fra : Thomas Due


Dato : 07-12-00 08:30

For lige at slå en ting fast. Når man snakker Var parametre i procedure
hoveder, er
der stor forskel på om det er f.eks. en streng, eller et objekt man sender
afsted.

Hvis man _ikke_ anvender objekter (f.eks. TList) men faste typer, String,
Integer,
ShortString, Double osv. osv. vil en var parameter overfører en _pointer_
til variablen.

F.eks. :

(Se venligst bort fra evt. grammatiske fejl, samt manglende fejl check)

Program TestVar;

Procedure SkiftFoerste(var s : String);
Var tmp : Char;
Begin
tmp := s[1];
s[1] := s[2];
s[2] := tmp;
end;

Var str : String;

Begin
str := 'abc';
SkiftFoerste(str);
println(str); // indeholder nu 'bac'
end;

Hvis man derimod ikke havde medtaget var i SkiftFoerste så ville værdien af
str efter
kaldet til SkiftFoerste stadigvæk være 'abc'.

Så langt så godt.

Hvis man anvender objekter, f.eks. TList så er Var _overflødigt_ idet list :
TList i forevejen er
en pointer til objektet. Det er en af forskellene på at anvende statiske
typer (hedder det vistnok)
og objekter.

Så med andre ord, du kan godt have et procedure hoved som f.eks. hedder :

procedure IndsaetVaerdi(Var liste : TList);

Men det vil have fuldstændig den samme virkning hvis du skriver

procedure IndsaetVaerdi(liste : TList);

Fordi liste _er_ allerede en pointer.

Mvh
Thomas Due




"Jan" <jan@somewhere.sw> wrote in message
news:zsoX5.3229$_z1.153459@news000.worldonline.dk...
> Hi.
>
> "Jesper Krog Andersen" <data@krikkit.removethis.dk> skrev i en meddelelse
> news:9002634FEdatakrikkitdk@194.182.148.146...
> > konrad@dadk.dk (David A. D. Konrad) wrote in <sDmX5.1322$72.18461
> > @twister.sunsite.auc.dk>:
> >
> > >Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
> > >
> > >>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
> > >>"var" vil være at sætte variablen til "nil". Resten operer kun på det
> > >>pointeren peger på!
> > >
> > >Helt forkert. Netop ved at bruge en var-variabel kan man behandle
listen
> > >nøjagtigt som man lyster. Prøv følgende :
> > >
> >
> > //Kode klippet
> >
> > Prøv det samme, uden var. Det giver samme resultat.
> >
> > /Data
>
> A constant (const) parameter is like a local constant or read-only
variable.
> Constant parameters are similar to value parameters, except that you can't
> assign a value to a constant parameter within the body of a procedure or
> function, nor can you pass one as a var
> parameter to another routine. (But when you pass an object reference as a
> constant parameter, you can still modify the object's properties.)
> Using const allows the compiler to optimize code for structured- and
> string-type parameters. It also provides a safeguard against
unintentionally
> passing a parameter by reference to another routine.
>
> Here, for example, is the header for the CompareStr function in the
SysUtils
> unit:
>
> function CompareStr(const S1, S2: string): Integer;
>
> Because S1 and S2 are not modified in the body of CompareStr, they can be
> declared as constant parameters.
>
> -Jan
>
>



Dennis Fantoni (17-12-2000)
Kommentar
Fra : Dennis Fantoni


Dato : 17-12-00 10:50


"Thomas Due" <noname@nowhere.net> wrote in message
news:90ne5f$17p$1@news.inet.tele.dk...

> Så med andre ord, du kan godt have et procedure hoved som f.eks. hedder :
>
> procedure IndsaetVaerdi(Var liste : TList);
>
> Men det vil have fuldstændig den samme virkning hvis du skriver
>
> procedure IndsaetVaerdi(liste : TList);
>
> Fordi liste _er_ allerede en pointer.

Der er dog den lille forskel at du kan gøre følgende :

Procedure MakeList(var liste:Tlist);

Begin
liste:=MyListType.Create;
End;

og lade den kaldte rutine returnere en liste.

Hvis du havde defineret procedure som MakeList(liste:Tlist);
så ville du ikke få den nye liste retur, da kun den lokale liste vil blive
ændret.

VAR parametre i procedurekald, hvor der er tale om objekter er brugbare hvis
den kaldte rutine skal lave objektet, eller returnere et objekt, fremfor
bare at ændre i objektets indhold.

En generel god regel er at undgå var parametre så meget som muligt.
Programmer med masser af var parametre er svære at finde rundt i (syntes
jeg).


---
Dennis Fantoni
df@image.dk
Fantoni EDB - Delphi konsulent.
Delphi, interbase, ibobjects, cgi-expert, isapi alt kan lade sig gøre



Niels (niLLer) (17-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 17-12-00 15:28

Just as I expected, "Dennis Fantoni" <df@image.dk> came up with this:

>Der er dog den lille forskel at du kan gøre følgende :
>
>Procedure MakeList(var liste:Tlist);
>Begin
> liste:=MyListType.Create;
>End;
>
>og lade den kaldte rutine returnere en liste.

Hvis det var det der var meningen, så ville jeg nok vælge OUT i stedet
for VAR.

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- I've been Windozed!

Thomas Schulz (06-12-2000)
Kommentar
Fra : Thomas Schulz


Dato : 06-12-00 14:57

> Haster, tak for alle svar

hvis du bruger *var parameter* kan du ændre hvad den TList pointer peger på
det sted hvor du sender den som parameter
...
hvis ikke du bruger *var* kopiers pointeren til TList objektet (din
parameter) ned i din procedure/function stack det vil sige du så kun kan
modificere det givne objekt (du kan dog stadigvæk sætte din stack pointer
til TList objecktet til at pege andre sted hen - dette kan *const*
forhindre)..

Så.. dvs. Det vil for det meste ikke give nogen mening at bruge *var* med et
TObject (eller nedarvere)
du overfører 4 byte under alle omstændigheder


Thomas



Thomas Schulz (07-12-2000)
Kommentar
Fra : Thomas Schulz


Dato : 07-12-00 15:45

>..
Glem det
minimum noget af det er forkert

Thomas



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste