Autor Beitrag
schlumsch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

alles Win :)
Delphi 2005 Prof, Delphi 2007
BeitragVerfasst: Sa 19.12.09 13:52 
Hallo,

ich habe ein Problem mit call by value/ cb reference.
Soweit ich weiss übergebe ich mit proceduername(parameter) den parameter
als CBV, sprich der Wert des Parameters im ausführenden Kontext wird auch
bei Manipulation des Parameters innerhalb der procedure nicht verändert.
CBR würde ich mit procedurename(var parameter) machen ... richtig?

Nun, ich habe folgenden Code (su). Ich gebe Vor und Nach Aufruff der Procedur
die Inhalte meines Stringlisten-Parameters aus und diese sind unterschiedlich...
Die Modifikation der Inhalte erfolgt dabei durch
ausblenden Delphi-Quelltext
1:
pL.Strings[x] := modifyLongDirectoryname(pL.Strings[x],25);					

Der Aufruf aus meinem Hauptprogramm ist updateMemoDirsAndFiles(DirsAndFiles).
Eine Ausgabe von Dirsandfiles.strings[1] enthält vor dem Proceduraufruf den ganzen Dateinamen,
danach den modifizierten kurzen Dateinamen ... genau das soll halt nicht sein.

kann mir das jemand erklären? Übersehe ich da etwas oder werden Listen / Arrays... evtl unter
Delphi gesondert behandelt??


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure updateMemoDirsAndFiles(pL: TStringList);
var    x : integer;
begin
      if pL= NIL then
          exit;
      if pL.Count < 1 then
          exit;
      x:= 0;
      for x:=0 to pL.Count-1 do begin
        pL.Strings[x] := modifyLongDirectoryname(pL.Strings[x],25);
      end;
      for x:=0 to nList.Count-1 do begin
         FormDirectorySelect.MemoDirsAndFiles.Lines.Add(pL.Strings[x]);
      end;
end;

_________________
icq 102779206
"God is real, unless declared integer..."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 19.12.09 15:22 
Objekte werden unter Delphi immer als Zeiger, also by reference übergeben.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 19.12.09 16:12 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Objekte werden unter Delphi immer als Zeiger
Jupp...
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
also by reference übergeben.
Nein, das ist nicht gleichbedeutend!
stackoverflow.com/qu...-peeve/450890#450890 hat folgendes geschrieben:
Myth: "Objects are passed by reference"

Reality: "Objects aren't passed at all; references are passed by value"

Kein riesiger Unterschied, aber nur so lässt sich erklären, was passiert, wenn man noch ein var voranstellen würde.

_________________
>λ=
schlumsch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

alles Win :)
Delphi 2005 Prof, Delphi 2007
BeitragVerfasst: Sa 19.12.09 17:45 
Hmmm, dachte das wäre nur bei Java so. Wenn ich nun eine Listemit den vollständigen Namen haben müchte und eine Liste mit den verkürzten Dateinamen zum anzeigen bleibt mir nichts andees übrig als zum Erstellungszeitpunkt von Liste 1 auch eine neue Liste 2 zu füllen? Oder kann ich innerhalb einer Prozedur sagen: "hier, mach dir eine Kopie der Liste die du als Aufrufparameter bekommen hast, arbeite mit dieser und lass die Finger von der Aufruföliste?"
...das ich das sagen kann ist mir schon soweit klar, aber hören will bislang niemand auf mich :)

_________________
icq 102779206
"God is real, unless declared integer..."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.12.09 20:21 
user profile iconschlumsch hat folgendes geschrieben Zum zitierten Posting springen:
Oder kann ich innerhalb einer Prozedur sagen: "hier, mach dir eine Kopie der Liste die du als Aufrufparameter bekommen hast, arbeite mit dieser und lass die Finger von der Aufruföliste?"
Natürlich geht das. Indem du eine lokale Variable mit einer neuen Liste nimmst und da alle reinschreibst.

Das macht in deinem Fall aber keinen Sinn. Denn du arbeitest damit ja nicht weiter...
Warum nicht direkt so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure updateMemoDirsAndFiles(pL: TStrings);
var
  x: integer;
begin
  if not Assigned(pL) or (pL.Count < 1then
    Exit;
  for x := 0 to Pred(pL.Count) do
    FormDirectorySelect.MemoDirsAndFiles.Lines.Add(
      modifyLongDirectoryname(pL[x], 25));
end;