Autor Beitrag
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.08.02 00:32 
Hallo zusammen,

leider hab ich hier noch nicht den Durchblick, weshalb ich nicht weiss ob das Thema hier ok ist oder doch unter Sonstiges. Leider hab ich hier keine Object Pascal Sparte gefunden. Aber zurück zu Frage:

Ich brauch von euch eine Antwort was richtig ist. In einem anderen Forum hab ich etwas behauptet und ... naja, ich meine ich hab Recht, der andere glaubt er hat Recht und wenn ich weitermache wird Streit draus. Deshalb frage ich hier mal. Ein Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
procedure Test(sl: TStringList);
begin
  //hier etwas mit sl machen aber kein Create und kein Free
end;


TSringList ist ein Objekt. Ich behaupte, daß man hier kein VAR vor sl stellen muß, da es nur ein Zeiger ist. Der Zeiger wird sich nicht in der Prozedur ändern wenn mit Create vorher für sl eine Instanz erstellt worden ist. Der einzige Grund ein VAR davorzustellen wäre, wenn das Objekt noch nicht initialisiert ist, also z.B. hier:

ausblenden Quelltext
1:
2:
3:
4:
5:
procedure Test(var sl: TStringList);
begin
  sl := TStringList.Create;
  //hier etwas mit sl machen 
end;


Nur hier würde sl einen anderen Wert zurückliefern als das mit dem es reingekommen ist.

Ich weiss, daß es Befehe gibt mit dem man Zeiger verändern kann (wieso auch immer). Würde man aber, nach dem für sl eine Instanz erstellt worden ist, an dem Zeiger manipulieren? Sollte man also vor das Objekt ein VAR vorstellen? Oder ist es Blödsinn.

Kann mir einer sagen wann man den Zeiger einer Instanz ändern würde.
lemming
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 470

Mac OS 10.3.1
Delphi 6 Pro, Kylix 3
BeitragVerfasst: Fr 09.08.02 09:49 
Hallo!

Es ist schlicht Blödsinn. Richtig ist das man KEIN Var, kein Create und kein Free braucht. In diesem Fall wäre "sl" nur ein pointer auf ein anderes Objekt.
Z.B. TMemo1.Lines

Schliesslich ruft man die Prozedur mit Test(Memo1.Lines) auf. Würde man versuchen danach ein Create (oder free) in Test zu versuchen bin ich mir ziemlich sicher das dies eine Exception hervor rufen würden.

Das mit dem Var hab ich ehrlich gesagt noch nie so gesehen.

Gruss lemming
cbs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.08.02 10:00 
ich bin auch der meinung von dir und lemming

du brauchst kein var, aber ob dus brauchst wenn du es innerhalb deiner procedure/function erst erstellen oder freigeben willst weiß ich nicht
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Fr 09.08.02 11:00 
Moin erstmal!

lemming hat folgendes geschrieben:
Es ist schlicht Blödsinn. Richtig ist das man KEIN Var, kein Create und kein Free braucht. In diesem Fall wäre "sl" nur ein pointer auf ein anderes Objekt.
Z.B. TMemo1.Lines


Hat er meines erachtens nach recht.

cbs hat folgendes geschrieben:
, aber ob dus brauchst wenn du es innerhalb deiner procedure/function erst erstellen oder freigeben willst weiß ich nicht


Natürlich mußt du das.

ausblenden Quelltext
1:
var test:tObject;					


Woher soll der Kompiler sonst wissen, was bei deinen Befehlen angesprochen wird.

Gruß

Renegade

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
cbs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.08.02 11:04 
@Renegade: ne, das mit var war so gemeint

Popov hat folgendes geschrieben:
TSringList ist ein Objekt. Ich behaupte, daß man hier kein VAR vor sl stellen muß, da es nur ein Zeiger ist. Der Zeiger wird sich nicht in der Prozedur ändern wenn mit Create vorher für sl eine Instanz erstellt worden ist. Der einzige Grund ein VAR davorzustellen wäre, wenn das Objekt noch nicht initialisiert ist, also z.B. hier:

ausblenden Quelltext
1:
2:
3:
4:
5:
procedure Test(var sl: TStringList); 
begin 
  sl := TStringList.Create; 
  //hier etwas mit sl machen 
end;


ob das var in diesem fall da sein muss oder nicht

das ich eine variable mit var deklarieren muss is mir sonnenklar

außerdem solltest du in meinem posting das beachten
cbs hat folgendes geschrieben:
...innerhalb deiner procedure/function...
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Fr 09.08.02 11:38 
@CBS

cbs hat folgendes geschrieben:
außerdem solltest du in meinem posting das beachten
cbs hat folgendes geschrieben:
...innerhalb deiner procedure/function...


Sorry hatte dein posting falsch verstanden. Du meintes die Definition im Procedure / Function-Header.

Ok alles klar.

cu.

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.08.02 13:08 
Ich danke euch. Anscheinend hab ich recht. Ich hab zwar auch noch nie ein Var vor einem Objekt gesehen, aber ich bin so leicht zu verunsichern (kleiner Scherz).

Allerdings hab ich die ganze Zeit gegrübelt, wann man mitten im Betrieb einem initialisiertem Objekt eine neue Adresse geben würde. Wie gesagt, ich bin nicht der große Objekt Kenner der absolut alle Möglichkeiten kennt. Für mich war es also Unsinn, aber ich bereit immer was neues zu lernen.


:twisted: :twisted: :twisted:

Hmm, tolle Smylis hab Ihr hier.
Alfons-G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 307

Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
BeitragVerfasst: Fr 09.08.02 23:09 
Hi,
einem Objekt eine willkürliche andere Adresse zuweisen, das kann für nette Überaschungen sorgen - besser auf einem Rechner testen, auf dem sich nichts Wichtiges befindet ;)
Vor Allem, wenn es in diesem Speicherbereich andere Objekte gibt, welche dem herumvagabundierenden Objekt ähnlich sind, kann es sein dass das Programm sogar ohne Absturz oder Fehlermeldungen läuft - allerdings dürfte das Ergebniss nicht das Erwartete sein ...

Einen Vorgeschmack darauf bekommst Du, wenn Du mehrere Arrays hintereinander definierst, und (bei abgeschalteter Überlaufprüfung) Indizes ansprichst, wecle höher sind, als der bei der Definition festgelegte Maximalwert.

8)

_________________
Alfons Grünewald
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 10.08.02 14:46 
Das ist der Teil der Diskusion:

Zitat:
> Ich hab zumindes noch nie was gehört,
> daß der Zeiger mitten im Betrieb verändert wird

ReallocMem, Setlength ...


Natürlich wurde die ganze Zeit über einen Objektzeiger gesprochen, auch wenn ich hier nur Zeiger schrieb. Auch wurde hier die ganze Zeit über TStringList gesprochen und wie man es als Parameter übergibt und was mit dem Zeiger in der anderen Prozedur passieren kann. Wenn also der Kollege mit solchen Befehlen reinkommt, dann muß er öfters zwischendurcht mit RealocMem seinen Objekten neue Adressen verpassen. Sonst weiss ich nicht was ich mit seiner Antwort anfangen soll.

:twisted:
aogwaba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: Sa 17.08.02 17:32 
Objectreferenzen in Delphi sind Zeiger auf Objecte, deshalb kann
das VAR wegfallen.(Call by Reference)

ausblenden Quelltext
1:
2:
3:
4:
5:
procedure Test(var sl: TStringList);
begin
 sl := TStringList.Create;
 //hier etwas mit sl machen 
end;

Hier wird eine neue Instanz von TStringList erzeugt, das alte Object
wird nicht berührt.
Ist in diesem Fall aber eine Speicherleiche, da ausserhalb der Procedure keine Referenz existiert.

cu
waba
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!