Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Simple Frage zu Funktionen (https://www.delphipraxis.net/104332-simple-frage-zu-funktionen.html)

.chicken 1. Dez 2007 20:30


Simple Frage zu Funktionen
 
Aehm mir is da grad was durchn Kopf gegangen und irgendwie war ich mir nichmehr sicher wie es denn nun richtig ist.

Mal angenommen ich habe eine Klasse TPlayer und eine Klasse TPlayerArray.
TPlayerArray enthaelt ein Array von TPlayer. Wenn ich nun in einer Funktion von TPlayerArray per ID als result einen der TPlayer im Array ausgebe, und den verändere, werden dann die Player im Array veraendert? Oder wird durch das Result eine neue Instanz dieses TPlayers erzeugt (was ich vermute).

Danke schonmal! :)

mkinzler 1. Dez 2007 20:34

Re: Simple Frage zu Funktionen
 
Kommt darauf an, wie du das machst.

DGL-luke 1. Dez 2007 20:35

Re: Simple Frage zu Funktionen
 
Kommt ein bisschen drauf an, wie du das baust.

Delphi-Quellcode:
type
  TPlayer = record
    Key: Integer;
  end;

  TPlayerArray = class
  private
    FPlayers = array of Players;
  public
    function GetPlayer(Id: Integer): TPlayer;
  end;

implementation

function TPlayerArray,GetPlayer(Id: Integer): TPlayer;
begin
  Result := FPlayers[Id];
end;
In dem Fall sollte kopiert werden.

cruiser 1. Dez 2007 20:35

Re: Simple Frage zu Funktionen
 
Wenn TPlayer eine Klasse ist und in einem TPlayerArray Instanzen dieser Klasse liegen, dann speichert das Array nur die Pointer auf den Adressraum der jeweiligen Instanz. Soll heissen, du gibst nur die Kopie des Pointers weiter, der aber zum originalen Adressraum zeigt. Es wird also auch die Instanz im Array geändert, weil es ja die selbe Instanz ist, auf die der kopierte Pointer zeigt.

Anders ist das bei Records. Wenn du da nicht explizit die Pointer zu den Records ablegst kopierst du die Records samt Daten anstelle der Pointer.

.chicken 1. Dez 2007 20:56

Re: Simple Frage zu Funktionen
 
Delphi-Quellcode:
type
  TPlayer = class
  private
  public
    name: string;
  end;

  TPlayerArray = class
  private
    FPlayers = array of Players;
  public
    function GetPlayer(Id: Integer): TPlayer;
  end;

implementation

function TPlayerArray,GetPlayer(Id: Integer): TPlayer;
begin
  Result := FPlayers[Id];
end;
Also wenn ich das so aufbaue und dann folgendes aufrufe:
Delphi-Quellcode:
GetPlayer(5).name := 'Hans Meyer';
Dann wird der Name des Players mit der ID 5 in 'Hans Meyer' geändert?

mkinzler 1. Dez 2007 20:59

Re: Simple Frage zu Funktionen
 
Ja, weil ja eine Referenz(Zeiger) zurückgegeben wird

.chicken 1. Dez 2007 21:25

Re: Simple Frage zu Funktionen
 
Super, danke :)

Luckie 1. Dez 2007 22:09

Re: Simple Frage zu Funktionen
 
Warum machst du nur den halben Schritt? Anstatt des Arrays würde ich eine typisierte Liste nehmen: Container-Klassen in Delphi

.chicken 1. Dez 2007 23:21

Re: Simple Frage zu Funktionen
 
Seh ich mir morgen an, danke ;-) Bin gespannt was das is, aber jetzt muss ihc pennen, muss morgen relativ früh raus :) Danke für die Info!

.chicken 5. Dez 2007 20:54

Re: Simple Frage zu Funktionen
 
So, habs mir angesehn. Letztendlich mache ich es glaube ich so, dass ich mir die Funktionen die ich von der Liste bräuchte selbst schreibe und dann halt ein Array benutze. Komme damit ganz gut klar, und da das ganze nicht zu umfangreich ist geht das glaube ich so auch ganz gut, oder warum sollte ich umsteigen?

Aber eine Frage habe ich. Wenn ich nun das PlayerArray habe und eine Instanz davon erstelle
Delphi-Quellcode:
PlayerArray := TPlayerArray.create;
Dann möchte ich die Möglichkeit haben mit
Delphi-Quellcode:
PlayerArray[i] := xx;
Auf die ArrayEinträge zugreifen zu können, ohne immer folgendes machen zu müssen
Delphi-Quellcode:
PlayerArray.Player[i] := xx;
//oder
PlayerArray.ByIndex(i) := xx;
Wie realisiere ich das? Hoffe ihr versteht was ich meine?

mkinzler 5. Dez 2007 20:59

Re: Simple Frage zu Funktionen
 
Das geht so natürlich nicht.

Namenloser 5. Dez 2007 21:34

Re: Simple Frage zu Funktionen
 
Das geht mit Delphi-Referenz durchsuchenProperties. Da kannst du einer Klasse eine Eigenschaft zuweisen und eine Methode zum "herausgeben" des werts sowie eine zum setzen des Werts angeben.

DP-Maintenance 5. Dez 2007 21:43

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.

.chicken 6. Dez 2007 12:49

Re: Simple Frage zu Funktionen
 
Zitat:

Zitat von NamenLozer
Das geht mit Delphi-Referenz durchsuchenProperties. Da kannst du einer Klasse eine Eigenschaft zuweisen und eine Methode zum "herausgeben" des werts sowie eine zum setzen des Werts angeben.

Das weiss ich schon. Ich möchte aber ohne den Aufruf einer Funktion eingeben zu muessen die Werte erhalten dh mit
Delphi-Quellcode:
Playerarray[i];
statt
Delphi-Quellcode:
Playerarray.GetPlayer(i);
@mkinzler: Warum geht das nicht? Das muss doch irgendwie gehen, denn Listen sind doch auch abgeleitet von TObject, also müssen sie doch auch irgendwie zu dieser "Fähigkeit" gekommen sein!?

Apollonius 6. Dez 2007 14:28

Re: Simple Frage zu Funktionen
 
Nimm ein Property und setze ein Default; dahinter. Theoretisch kannst du auch mehrere Eigenschaften zu Default-Eigenschaften erklären, das habe ich allerdings noch nie gesehen.

.chicken 6. Dez 2007 14:49

Re: Simple Frage zu Funktionen
 
DAS wollte ich, dankeschön :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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