AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream)
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream)

Ein Thema von michele_tedesco · begonnen am 12. Mai 2014 · letzter Beitrag vom 14. Mai 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 13. Mai 2014, 12:15
@OlafSt

Wenn ich dir meinen Schlüssel zu meiner Wohnung gebe, dann kannst du in die Wohnung rein und dort umräumen.
Tauscht du den Schlüssel nun aus und gibts mir diesen zurück, komme ich nicht mehr in meine Wohnung.
procedure Foo( var AKey : TWohnung ); Gebe ich dir eine Kopie meines Schlüssels, dann kannst du immer noch in die Wohnung rein und umräumen.
Da ich aber keinen Schlüssel von dir zurücknehme, kann ich trotzdem noch mit meinem Schlüssel in meine Wohnung (und sehe dann entweder Chaos oder endlich mal eine aufgeräumte Wohnung)
procedure Foo( AKey : TWohnung );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (13. Mai 2014 um 12:18 Uhr)
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 13. Mai 2014, 12:18
...oder eine leere wohnung

Ich persönlich habe das ganze ja schon länger verstanden (auch wenn ich der Ansicht bin, das CONST nun mal CONST ist, auch Eigenschaften sollten dann unveränderlich sein).

Ich hoffe, der TE bekam nun seine Antwort
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 13. Mai 2014, 12:20
...oder eine leere wohnung

Ich persönlich habe das ganze ja schon länger verstanden (auch wenn ich der Ansicht bin, das CONST nun mal CONST ist, auch Eigenschaften sollten dann unveränderlich sein).

Ich hoffe, der TE bekam nun seine Antwort
Ähm, wenn das so sein sollte, dann dürften auch keine Methoden ausgeführt werden, denn die könnten ja Eigenschaften verändern. Wofür will ich dann eine Instanz übergeben?
(Es wird ja gar nicht die Instanz übergeben, nur der Weg, wie ich dort hinkomme und bei const kann ich den Weg auch gar nicht ändern)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#14

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 13. Mai 2014, 15:34
Wenn man weiß was bei einer Instanz übergeben wird (nur eine Referenz, quasi eine Visitenkarte), dann versteht man auch die Delphi-Dokumentation.

Mit dem var wird die gleiche Visitenkarte (Referenz) übergeben. Bemale ich die, dann ist die bemalt.

Ohne dem var wird eine Kopie der Visitenkarte (Referenz) übergeben. Bemale ich die, dann ist eben diese Kopie bemalt und das Original bleibt unverändert.

Mit dem const wird die Visitenkarte (Referenz) als unbemalbares Objekt (Read-Only) übergeben und kann gar nicht bemalt werden.

Besser kann man es nicht erklären.

Da solltest du dir ein Patent drauf geben lassen.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#15

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 13. Mai 2014, 15:36
Keiner hat die Frage wirklich verstanden, ergo hat sie auch keiner wirklich beantwortet.
Süß

Sir Rufo hat es genau richtig beschrieben.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
michele_tedesco

Registriert seit: 19. Mär 2014
50 Beiträge
 
#16

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 14. Mai 2014, 12:10
@OlafSt

Wenn ich dir meinen Schlüssel zu meiner Wohnung gebe, dann kannst du in die Wohnung rein und dort umräumen.
Tauscht du den Schlüssel nun aus und gibts mir diesen zurück, komme ich nicht mehr in meine Wohnung.
procedure Foo( var AKey : TWohnung ); Gebe ich dir eine Kopie meines Schlüssels, dann kannst du immer noch in die Wohnung rein und umräumen.
Da ich aber keinen Schlüssel von dir zurücknehme, kann ich trotzdem noch mit meinem Schlüssel in meine Wohnung (und sehe dann entweder Chaos oder endlich mal eine aufgeräumte Wohnung)
procedure Foo( AKey : TWohnung );
In deinem Beispiel wird aber die Wohnung übergeben und dicht der Schlüssel

Wenn ich an der Kopie des Schlüssels etwas ändere (Eigenschaft: Farbe, oder Form), dann ist bei procedure Foo( AKey : TKey ); dann ist doch auch der Original-Schlüssel geändert, richtig?

Gibt es eine Möglichkeit (gibt es überhaupt Situationen) wo das Objekt vollkommen als Kopie übergeben wird??

Ist das Verhalten in .Net das selbe?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 14. Mai 2014, 12:13
Gibt es eine Möglichkeit (gibt es überhaupt Situationen) wo das Objekt vollkommen als Kopie übergeben wird??

Ist das Verhalten in .Net das selbe?
Es gibt keine Möglichkeit dass das Objekt als Kopie übergeben wird. Wenn du das brauchst, dann musst du überlegen ob du auf Records umsteigen willst/kannst.

In .NET ist das Verhalten soweit ich weiß das selbe.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
michele_tedesco

Registriert seit: 19. Mär 2014
50 Beiträge
 
#18

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 14. Mai 2014, 12:14
Danke an alle schon Mal
Ich habe verstanden wie sich ein Objekt als Parameter verhaltet
Ziel erreicht!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 14. Mai 2014, 12:38
@OlafSt

Wenn ich dir meinen Schlüssel zu meiner Wohnung gebe, dann kannst du in die Wohnung rein und dort umräumen.
Tauscht du den Schlüssel nun aus und gibts mir diesen zurück, komme ich nicht mehr in meine Wohnung.
procedure Foo( var AKey : TWohnung ); Gebe ich dir eine Kopie meines Schlüssels, dann kannst du immer noch in die Wohnung rein und umräumen.
Da ich aber keinen Schlüssel von dir zurücknehme, kann ich trotzdem noch mit meinem Schlüssel in meine Wohnung (und sehe dann entweder Chaos oder endlich mal eine aufgeräumte Wohnung)
procedure Foo( AKey : TWohnung );
In deinem Beispiel wird aber die Wohnung übergeben und dicht der Schlüssel
Ein absolutes, definitives und ultimatives NEIN!

Es wird eben nicht die Instanz übergeben, sondern eine Referenz/Zeiger/Pointer (wie auch immer du das definieren willst) auf die Instanz.

Wenn ich an der Kopie des Schlüssels etwas ändere (Eigenschaft: Farbe, oder Form), dann ist bei procedure Foo( AKey : TKey ); dann ist doch auch der Original-Schlüssel geändert, richtig?
Es wird nicht der Schlüssel (Referenz/Zeiger/Pointer) geändert, sondern die Instanz!
Und selbst wenn du in dem Falle den Wert von AKey änderst, dann wird der Wert von
Delphi-Quellcode:
procedure Foo( AKey : TWohnung );
begin
  AKey := TWohnung.Create; // In AKey steht jetzt der Wert $22222222
end;

procedure Bar;
var
  LKey : TWohnung;
begin
  LKey := TWohnung.Create; // <-- In LKey steht jetzt z.B. der Wert $11111111
  Foo( LKey );
  // LKey hat jetzt immer noch den Wert $11111111
end;
LKey nicht geändert.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.617 Beiträge
 
Delphi 12 Athens
 
#20

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 14. Mai 2014, 13:33
Holen wir mal ein bisschen aus:
Delphi-Quellcode:
procedure TfrmSchiessMichTot.MachWas;
var
  //Instanzvariable
  Dingens: TDingens;
begin
  //Erzeugen der Instanz und Ablegen in der Variablen (intern ein Zeiger)
  Dingens := TDingens.Create;
Dingens ist also ein Zeiger auf die Instanz, die mit dem Create-Aufruf angelegt wurde.
Delphi-Quellcode:
procedure MachDingens(ADingens: TDingens);
//ADingens ist hier eine Kopie der ursprünglichen Instanzvariablen,
//zeigt aber somit auch auf dieselbe Instanz, daher lässt sich darüber auf
//deren Methoden und Eigenschaften zugreifen
Folgender Code schadet also nicht, da er nur die Kopie betrifft:
Delphi-Quellcode:
procedure MachDingens(ADingens: TDingens);
begin
  ADingens := TDingens.Create;
Delphi-Quellcode:
procedure MachDingens(var ADingens: TDingens);
//Hier handelt es sich um die Original-Instanzvariable. Überschreibt man die,
//hat man auch in der aufrufenden Routine keinen Zugriff mehr auf die
//ursprüngliche Instanz
Weist man hier nun dem Parameter einen neuen Wert zu, betrifft das auch die Originalvariable, die somit in der aufrufenden Routine nicht mehr erreichbar ist. Bestenfalls bewirkt das lediglich ein Speicherleck, kann aber auch sehr viel schlimmer ausgehen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz