Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einer Methode Klassen-eigene Variablen übergeben? (https://www.delphipraxis.net/20462-einer-methode-klassen-eigene-variablen-uebergeben.html)

Nonsense 18. Apr 2004 14:18


Einer Methode Klassen-eigene Variablen übergeben?
 
Hallo,

ich habe eine Klasse mit 4 Variablen (Integer). Nun möchte ich diese 4 Variablen verändert, d.h. inkrementieren oder dekrementieren.
Da ich nicht für jede der 4 Variablen eine Prozedur für Inc und Dec schreiben will, dachte ich mir, dass man doch eigentlich nur die Klassen-eigene Variable übergeben müsste. Pustekuchen. Funktioniert nicht.
Delphi-Quellcode:
  TStatistics = class(TObject)
  private
    FNumFox  : Integer;
    FNumGrass : Integer;
    FNumRabbit: Integer;
    FNumSand : Integer;
  public
    constructor Create;
    procedure DecNumCreature(NumCreature: Integer);
    procedure IncNumCreature(NumCreature: Integer);
    property NumFox: Integer read FNumFox;
    property NumGrass: Integer read FNumGrass;
    property NumRabbit: Integer read FNumRabbit;
    property NumSand: Integer read FNumSand;
  end;

[...]
procedure TStatistics.DecNumCreature(NumCreature: Integer);
begin
  Dec(NumCreature, 1);
end;

Aufruf mit:
Statistics.IncNumCreature(Statistics.NumFox);
Hat jemand eine Idee?

Christian Seehase 18. Apr 2004 14:40

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Moin Nonsense,

wenn Du die Property als Read Only deklarierst (write Angabe fehlt), kannst Du sie natürlich nicht verändern.

Tryer 18. Apr 2004 14:43

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Delphi-Quellcode:
type
  TNums = (numFox, numGrass, ..);
 
  ..
  procedure IncNumCreature(const Num: TNum);
  begin
    case Num of
      numFox: Inc(FNumFox);
    ..
Eine andere Variante wäre vielleicht noch einen Zeiger auf das Element zu übergeben und durch den Vergleich der Adressen auf das richtige Feld zu schliessen.

MfG,
Tryer

Nonsense 18. Apr 2004 16:38

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von Christian Seehase
Moin Nonsense,

wenn Du die Property als Read Only deklarierst (write Angabe fehlt), kannst Du sie natürlich nicht verändern.

Hatte ich schon probiert, funktioniert nicht. Außerdem habe ich ja 2 Methoden mit denen ich auf die Variablen zugreifen will - würde das denn überhaupt gehen!?
@Tryer: Gibt es da denn keinen eleganteren Weg?

woki 18. Apr 2004 17:02

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Hi,

1. vergiß das mit den Pointern
2. Hör auf Christian
3. Schon mal was von Fehlermeldungen gehört, wenn du möchtest, das man dir hilft, dass sei bitte nicht zu faul, diese uns mitzuteilen.

Grüsse
Woki

Nonsense 18. Apr 2004 17:04

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von woki
3. Schon mal was von Fehlermeldungen gehört, wenn du möchtest, das man dir hilft, dass sei bitte nicht zu faul, diese uns mitzuteilen.

Ich kriege lediglich einen Hinweis, dass der zugewiesene Wert von NumCreature nie benutzt wird. Ansonsten bleiben die Werte unverändert (d.h. sind immer noch wie im Contructor deklariert).

teebee 18. Apr 2004 17:08

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Delphi-Quellcode:
TStatistics = class(TObject)
  private
    FNums: Array[0..3] of Integer;
  public
    constructor Create;
    procedure DecNumCreature(NumCreature: Integer);
    procedure IncNumCreature(NumCreature: Integer);
    property NumFox: Integer read FNums[0] write FNums[0];
    property NumGrass: Integer read FNums[1] write FNums[1];
    ...
    end;

Procedure TStatistics.IncNumCreature(Index: Integer);
Begin
 FNums[Index] := FNums[Index]+1;
End;
Probier es mal so.
Wenn Du, wie von Tryer angesprochen, einen Aufzählungstypen erstellst, wird es auch noch übersichtlich, und Du kannst die Methoden mit KLartext aufrufen.
Delphi-Quellcode:
MyStatistics.IncNumCreature(NumFox);
Gruß, teebee

[edit] 'Inc' ersetzt... [/edit]

rsilo 18. Apr 2004 17:11

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Ich denke du musst , diese Zeile:

Code:
property NumFox: Integer read FNumFox;
durch das

Code:
property NumFox: Integer read FNumFox; write FNumFox;
ersetzen!

rsilo

Nonsense 18. Apr 2004 17:16

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von rsilo
Ich denke du musst , diese Zeile:

Code:
property NumFox: Integer read FNumFox;
durch das

Code:
property NumFox: Integer read FNumFox; write FNumFox;
ersetzen!

rsilo

Funktioniert nicht.
PS: Da kommt übrigens kein ";" vor's write.

maximov 18. Apr 2004 17:43

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
properties sind halt keine variablen! ...sie fühlen sich nur so an :stupid:

Was spricht gegen inc(FNumFoo); ?

Nonsense 18. Apr 2004 17:46

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von maximov
Was spricht gegen inc(FNumFoo); ?

Weil ich dann z.B. Nummern übergeben müsste und dann per case of die gewünschte Variable verändere. Ich denke, dass das ein ziehmlich blöder Stil ist. Das muss doch irgendwie eleganter gehen. Ich glaube ich krame wieder mein Backup raus, wo ich dann zwar 8 Prozeduren habe, was aber noch halbwegs vernünftig aussieht... :angle: :wink:

woki 18. Apr 2004 17:51

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Hi,

schau mal in der OH unter

Wert- und Variablenparameter und überprüf mal die Deklaration von
Code:
procedure TStatistics.DecNumCreature(NumCreature: Integer);
Grüsse
Woki

Nonsense 18. Apr 2004 17:55

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von woki
Hi,

schau mal in der OH unter

Wert- und Variablenparameter und überprüf mal die Deklaration von
Code:
procedure TStatistics.DecNumCreature(NumCreature: Integer);
Grüsse
Woki

Spielst du auf's var an?

woki 18. Apr 2004 17:58

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Nachtrag:

und um das dann so zu machen wie vorgesehen in der Sprachreferenz unter Arrayeigenschaften und Indexbezeichner.

Grüsse
Woki

woki 18. Apr 2004 18:00

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von Nonsense
Spielst du auf's var an?

Nun ja, wenn du einen Parameter als Wertparameter übergibst, wirken Änderungen ja nicht auf die übergebene Variable.

teebee 18. Apr 2004 18:03

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Zitat:

Zitat von Nonsense
Zitat:

Zitat von maximov
Was spricht gegen inc(FNumFoo); ?

Weil ich dann z.B. Nummern übergeben müsste und dann per case of die gewünschte Variable verändere. Ich denke, dass das ein ziehmlich blöder Stil ist. Das muss doch irgendwie eleganter gehen. Ich glaube ich krame wieder mein Backup raus, wo ich dann zwar 8 Prozeduren habe, was aber noch halbwegs vernünftig aussieht... :angle: :wink:

Wenn Du es mit einem Array machst, wie in meinem ersten Posting beschrieben, brauchst Du kein Case. Mit einem Aufzählungstypen sieht es im Quelltext auch nicht nach Zahlen aus...

BTW: 'Inc' geht natürlich nicht mit Properties, also 'x := x+1;' verwenden...

Gruß, teebee

maximov 18. Apr 2004 19:59

Re: Einer Methode Klassen-eigene Variablen übergeben?
 
Genau:

entweder 'x := x+1;' verwenden oder einzelne proceduren. Die anderen lösungen sind in der tat ein bisschen uncool 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz