Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klasse mit vordefinierter Variable? (https://www.delphipraxis.net/74883-klasse-mit-vordefinierter-variable.html)

moelski 10. Aug 2006 07:24


Klasse mit vordefinierter Variable?
 
Moin !

Ich baue gerade den Inhalt einer Unit in eine Klasse um. Folgende Deklaration:
Delphi-Quellcode:
type
  TLVSpectraII = class(TObject)
    public
      function 1.....;
      function 2.....;
    private
      EnergieSumme:    Double;      // 1
      _LastZellenzahl : Byte = 0;    // 2
  end;
Die Deklaration der Variable (1) geht ja ohne Probleme. Aber die bei (2) nicht.
Kann mir jemand sagen wie ich das am besten machen kann?

RavenIV 10. Aug 2006 07:27

Re: Klasse mit vordefinierter Variable?
 
zu (2):
das geht so nicht. Kannst aber im Constructor (MyClass.Create) den Wert zuweisen.

sh17 10. Aug 2006 07:40

Re: Klasse mit vordefinierter Variable?
 
mit properties kann man das per default-wert machen, geht dann IMO nicht private

Delphi-Quellcode:
  TLVSpectraII = class(TObject)
  private
    F_LastZellenzahl: Byte;
    procedure Set_LastZellenzahl(const Value: Byte);
  published
    property _LastZellenzahl : Byte read F_LastZellenzahl write Set_LastZellenzahl default 0;
  end;
oder kleiner

Delphi-Quellcode:
  TLVSpectraII = class(TObject)
  private
    F_LastZellenzahl: Byte;
  published
    property _LastZellenzahl : Byte read F_LastZellenzahl write F_LastZellenzahl default 0;
  end;

H4ndy 10. Aug 2006 07:43

Re: Klasse mit vordefinierter Variable?
 
Du könntest auch einfach über der Klassendeklaration dir noch zusätzliche Konstanten deklarieren.
Delphi-Quellcode:
const
  _LastZellenzahl: Byte = 0;

type
  TLVSpectraII = class(TObject)
    public
      function 1.....;
      function 2.....;
    private
      EnergieSumme:    Double;      // 1
      //_LastZellenzahl : Byte = 0;    // 2
  end;

moelski 10. Aug 2006 07:48

Re: Klasse mit vordefinierter Variable?
 
Moin !

Ich habe es jetzt mal so probiert:
Delphi-Quellcode:
type
  TLVSpectraII = class(TObject)
    public
      constructor Create(Owner: TObject); override;

      function 1....;
    private
      EnergieSumme:    Double;      // 
      _LastZellenzahl : Byte;        // 
  end;
Delphi-Quellcode:
constructor TLVSpectraII.Create(Owner: TObject);
begin
  inherited Create(Owner);    // Geerbten Konstruktor aufrufen.
  _LastZellenzahl := 0;       // Variablen vor erster benutzung setzen
  _LastZyklus    := 0;
  _LastStatus    := 0;
  _LastTimeTicker := 0;
end;
Da kriege ich aber den Fehler "Eine statische Methode kann nicht überschrieben werden".

Lasse ich Override weg, dann kriege ich in constructor TLVSpectraII.Create... folgende Meldung "Zu viele Parameter".

Hmm, was ist hier nun falsch?

@H4ndy:
Könnte man machen. Aber was ist wenn ich ein neues Objekt über TLVSpectraII.Create erzeuge. Werden die Constanten dann auch neu angelegt?

3_of_8 10. Aug 2006 07:50

Re: Klasse mit vordefinierter Variable?
 
Der default Wert bei den Propertys ist KEIN Vorgabewert, der automatisch zugewiesen wird.

Der default Wert sagt nur dem Formulardesigner, bei welchem Wert er nichts in die Formularressource schreiben muss, weil es sowieso auf dem Vorgabewert ist.

sh17 10. Aug 2006 07:52

Re: Klasse mit vordefinierter Variable?
 
Zitat:

Zitat von 3_of_8
Der default Wert bei den Propertys ist KEIN Vorgabewert, der automatisch zugewiesen wird.

Der default Wert sagt nur dem Formulardesigner, bei welchem Wert er nichts in die Formularressource schreiben muss, weil es sowieso auf dem Vorgabewert ist.


jetzt wo dus sagst. das kommt davon, wenn man dinge vorschlägt, die man selbst nicht nutzt.

sh17 10. Aug 2006 07:55

Re: Klasse mit vordefinierter Variable?
 
Zitat:

Zitat von moelski
Hmm, was ist hier nun falsch?

lass override weg und im Create nur

inherited Create;

moelski 10. Aug 2006 07:57

Re: Klasse mit vordefinierter Variable?
 
Moin !

@sh17:
Also kann ich doch im Create meine Variablen setzen?


Wie ist es mit dem
Delphi-Quellcode:
 const
  _LastZellenzahl: Byte = 0;

type
  TLVSpectraII = class(TObject)
  .......
Wird das pro Objekt angelegt?

H4ndy 10. Aug 2006 07:59

Re: Klasse mit vordefinierter Variable?
 
Zitat:

Zitat von moelski
@H4ndy:
Könnte man machen. Aber was ist wenn ich ein neues Objekt über TLVSpectraII.Create erzeuge. Werden die Constanten dann auch neu angelegt?

Also eigentlich dürfte das immer im Kontext der Unit arbeiten,
in der du die Klasse deklariert hast. Da du ja zur Zugriff
auf die Konstante innerhalb der Klassen-Methoden brauchst,
sehe ich darin kein Problem das so zu machen.

Zitat:

Zitat von moelski
Da kriege ich aber den Fehler "Eine statische Methode kann nicht überschrieben werden".
Lasse ich Override weg, dann kriege ich in constructor TLVSpectraII.Create... folgende Meldung "Zu viele Parameter".

Von TObject abgeleitet Klassen haben keinen Owner-Parameter.

Delphi-Quellcode:
TLVSpectraII = class(TObject)
    public
      constructor Create;

      function 1....;
    private
      EnergieSumme:    Double;      //
      _LastZellenzahl : Byte;        // 
  end;

constructor TLVSpectraII.Create;
begin
  inherited Create;    // Geerbten Konstruktor aufrufen.
  _LastZellenzahl := 0;       // Variablen vor erster benutzung setzen
  _LastZyklus    := 0;
  _LastStatus    := 0;
  _LastTimeTicker := 0;
end;
(Im Gegensatz zum Create musst du Destroy immer überschreiben, aber auch da das "inherited Destroy;" nicht vergessen)

Jelly 10. Aug 2006 08:01

Re: Klasse mit vordefinierter Variable?
 
Zitat:

Zitat von sh17
mit properties kann man das per default-wert machen, geht dann IMO nicht private

Der Default Wert einer Klasse hat nichts mit der Vorbelegung zu tun, sondern ist die Eigenschaft, die genutzt wird, wenn keine Eigenschaft angegeben wird... Beispiel:

Delphi-Quellcode:
sl := TStringList.Create ;
s1.add ('Blubb') ;
Showmessage (s1[0]) ;    -> s1[0] ist eigentlich s1.items[0]
Aber zum Thema...

Ab Delphi 2006 (oder eventuell ab 2005 ???) kann man im Klassenkopf Konstanten definieren:

Delphi-Quellcode:
myclass = class
const
  _LastZellenzahl = 0;
private
   ...
public
   ...
end ;

TBx 10. Aug 2006 08:02

Re: Klasse mit vordefinierter Variable?
 
hallo!

Nein, Deine const - Deklarationen werden nicht pro Objekt angelegt, sondern einmalig durch die Unit definiert.

Ich denke mal, Du wolltest hier auch gar keine Konstante, sondern nur eine Variable nach deklaration mit einbem Startwert belegen.
Das geht nur über das genannte Konstrukt mit dem constructor

Gruß

onlinekater

PS
@nh17: properties können private, public, protected oder auch published angelegt werden. No Problem

moelski 10. Aug 2006 08:04

Re: Klasse mit vordefinierter Variable?
 
Moin !

Also um es mal zusammenzufassen:
Delphi-Quellcode:
TLVSpectraII = class(TObject)
    public
      constructor Create;

      function 1....;
    private
      EnergieSumme:    Double;      // 
      _LastZellenzahl : Byte;        // 
  end;

constructor TLVSpectraII.Create;
begin
  inherited Create;    // Geerbten Konstruktor aufrufen.
  _LastZellenzahl := 0;       // Variablen vor erster benutzung setzen
  _LastZyklus    := 0;
  _LastStatus    := 0;
  _LastTimeTicker := 0;
end;
Das wäre dann eine Lösung für mein Problem die funktioniert?

TBx 10. Aug 2006 08:07

Re: Klasse mit vordefinierter Variable?
 
Ja, unter der Voraussetzung, daß Du die im Create verwendeten Variablen dann auch noch deklarierst .... :wink:

Gruß

onlinekater

moelski 10. Aug 2006 08:08

Re: Klasse mit vordefinierter Variable?
 
Moin !

Ja klar ...
Delphi-Quellcode:
    private
      EnergieSumme:    Double;      // für KonvertierenGeratedaten als Merker nötig !
      _LastZellenzahl : Byte;        // speichern Zustand der letzten Daten
      _LastZyklus    : Byte;
      _LastStatus    : Byte;
      _LastTimeTicker : TLVTimeTicker;
Der Vollständigkeit halber :-)

Vielen Dank für die Infos.

sh17 10. Aug 2006 08:11

Re: Klasse mit vordefinierter Variable?
 
Zitat:

Delphi-Quellcode:
_LastTimeTicker : TLVTimeTicker;

Der kann aber nicht mit 0 initialisiert werden.

Jelly 10. Aug 2006 08:14

Re: Klasse mit vordefinierter Variable?
 
Zitat:

Zitat von sh17
Zitat:

Delphi-Quellcode:
_LastTimeTicker : TLVTimeTicker;

Der kann aber nicht mit 0 initialisiert werden.

Wenn TLVTimeTicker eine eigene Klasse ist, so sollte der Konstructor dieser Klasse die Initialisierungen übernehmen. Wenn Du in deiner Klasse andere Werte brauchst, so musst Du sie in deinem Konstruktor noch entsprechend anpassen:

Delphi-Quellcode:
_LastTimeTicker.IrgendeienProperty := 0 ;


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