2017-08-19 7 views
0
type  
    TSpieler = record 
    Name : string; 
    Konto,Position : integer; 
    Reihe : boolean; 
    Panel : TPanel; 
    end; 

var 
    PL1, PL2, PL3, PL4, PL5 : TSpieler; 

function getPlayer; 
begin 
    Result := PL1; 
end; 

procedure FeldKaufen; 
var 
    TestPlayer: TSpieler; 
begin 
    TestPlayer := getPlayer; {PL2,PL3,PL4,PL5} 
    inc(TestPlayer.Konto); {does not save} 
    {inc(PL1.Konto);}  {works just fine with every Player} 
end; 

Wie kann ich speichern PL1 Werte nach ihnen zu geben und bearbeiten sie von TestPlayer?Warum muss ich den Namen meines Typs verwenden, um ihn zu bedienen? [Delphi/Lazarus]

Das Problem ist, ich bekomme den Namen des Players durch diese getPlayer Funktion, und es ist gut, weil es den ganzen Code ein wenig sauberer macht.

+0

Aufzeichnungen sind Werttypen. Zuerst kopierst du den Inhalt von 'PL1' in' TestPlayer'. Dann werden neue Werte zu "TestPlayer" hinzugefügt. Um diese Werte beizubehalten, müssen Sie sie nach Beendigung des Vorgangs in 'PL1' zurückkopieren. –

+0

Aber es gibt ein Problem mit der Getplayer-Funktion, ich habe keine Ahnung, wie man eine Alternative programmiert, weil ich TestPlayer: = getPlayer in ein paar mehr Verfahren verwende, um den Code einfach zu halten. – Neubauer

+0

'GetPlayer' wird Ihnen eine Kopie von' PL1' geben. Um die Änderungen beizubehalten, können Sie stattdessen den Zeiger auf "PL1" übergeben. –

Antwort

2

Eine Lösung ist Zeiger auf die Spieler zu verwenden:

type 
    PSpieler = ^TSpieler; 
    TSpieler = record 
    Name: string; 
    Konto, Position: integer; 
    Reihe: boolean; 
    Panel: TPanel; 
    end; 

var PL1, PL2, PL3, PL4, PL5: TSpieler; 

function getPlayer: PSpieler; 
begin 
    Result := @PL1; 
end; 

procedure FeldKaufen; 
var TestPlayer: PSpieler; 
begin 
    TestPlayer := getPlayer; {PL2,PL3,PL4,PL5} 
    inc(TestPlayer.Konto); {does not save} 
    {inc(PL1.Konto);}  {works just fine with every Player} 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    FeldKaufen; 
end; 
+0

Das klingt ziemlich gut, aber ich bekomme den Fehler: Ausdruckstyp muss Klassen- oder Datensatztyp sein, bekam^TSpieler, sobald Ich schreibe mit Testplayer beginne – Neubauer

+1

@Neubauer, benutze weder WITH noch den Zeiger; "mit TestPlayer^do inc (Konto);" – FredS

+0

@Neubauer Bitte lesen Sie [diesen Link] (https://Stackoverflow.com/help/someone-answers), und möglicherweise entsprechend handeln. –

3

Sie haben keinen überprüfbaren Code geschrieben.

Nichtsdestoweniger ist der Eintrag (im Gegensatz zu Referenz, Zeigertyp (Objekte)), und die Zuordnung eines Datensatzes zu einem anderen kopiert nur alle Felder. Das Ändern des zweiten Datensatzes (Kopie) hat keinen Einfluss auf den ersten (außer für Spezialfälle wie Zeigerfelder des Datensatzes).

Verwandte Themen