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 mehreren "ebenen"? (https://www.delphipraxis.net/73636-klasse-mit-mehreren-ebenen.html)

alienous 20. Jul 2006 20:58


Klasse mit mehreren "ebenen"?
 
hi,


sitze gerade so an einer klasse, wo ich empfänger-daten und sender-daten und noch viele andere werte speichern möchte. da hab ich mich gefragt, wieso erstellste nich ein record mit name, straße, plz, ort usw, und setzt es einmal für den absender, und einmal für den empfänger usw ein, damit man das ungefähr so ansprechen kann:

Delphi-Quellcode:
Bestellung1 := TBestellung.Create;

Bestellung.Absender.Name := 'xyz';
Bestellung.Emfpaenger.PLZ := 52365;
Bestellung.BestellNr := 558712;
usw...
doch leider funktioniert das mit den records nicht so, wie ich es mir vorgestellt habe, habe mich ja vorher hier ein wenig informiert :wink:

also wie würdet ihr das lösen?
danke für die tipps schonmal!!

achja, weiß gerade nicht, wie ich das thema besser umschreiben kann, drumm hab ich "ebenen" genutzt, wenn ihr ne passendere beschreibung habt, her damit :)

mkinzler 20. Jul 2006 21:01

Re: Klasse mit mehreren "ebenen"?
 
Wie sieht die deklaration der Klasse und des Record aus?

3_of_8 20. Jul 2006 21:02

Re: Klasse mit mehreren "ebenen"?
 
Na das ist doch eigentlich ganz einfach:

Delphi-Quellcode:
type
  TAbsender = record
    Name: String;
  end;

  TEmpfaenger = record
    PLZ: Cardinal;
  end;

  TBestellung = class
  ...
  public
    Absender: TAbsender;
    Empfaenger: TEmpfaenger;
  ...
  end;
Sollte so funktionieren.

Khabarakh 20. Jul 2006 21:02

Re: Klasse mit mehreren "ebenen"?
 
Zitat:

Zitat von alienous
doch leider funktioniert das mit den records nicht so, wie ich es mir vorgestellt habe, habe mich ja vorher hier ein wenig informiert :wink:

also wie würdet ihr das lösen?

Ganz auf Records verzichten und dafür Unterklassen benutzen.

alienous 20. Jul 2006 21:07

Re: Klasse mit mehreren "ebenen"?
 
Zitat:

Zitat von 3_of_8
Na das ist doch eigentlich ganz einfach:

Delphi-Quellcode:
type
  TAbsender = record
    Name: String;
  end;

  TEmpfaenger = record
    PLZ: Cardinal;
  end;

  TBestellung = class
  ...
  public
    Absender: TAbsender;
    Empfaenger: TEmpfaenger;
  ...
  end;
Sollte so funktionieren.

ja, aber wenn ich ne property dazu noch schreiben will, die mir zb die werte untersucht (gültige plz etc..) dann gehts nicht mehr, weil man scheinbar dann nur lesen kann.
Zitat:

Zitat von mkinzler
Wie sieht die deklaration der Klasse und des Record aus?

war jetzt nur theorie, wie man das lösen könnte. über property gehts jedenfalls nicht, höchstens wenn man die records public macht.

Zitat:

Zitat von Khabarakh
Ganz auf Records verzichten und dafür Unterklassen benutzen.

ah, ich glaub ich verstehs :D danke

paritycheck 20. Jul 2006 21:53

Re: Klasse mit mehreren "ebenen"?
 
Hi,

Wenn Du einfach nur die Daten speichern willst geht das doch Problemlos mit einem Record.

Delphi-Quellcode:
type
  TAbsender = record
    Name: string;
    PLZ: Cardinal;
  end;
  TEmpfaenger = record
    PLZ: Cardinal;
  end;
  TBestellung = record
    Absender: TAbsender;
    Empfänger: TEmpfaenger;
  end;

....

procedure TForm1.Button1Click(Sender: TObject);
var Bestellung: TBestellung;
begin
  if CheckBestellDaten then begin
     Bestellung.Absender.Name:= 'Name';
     Bestellung.Absender.PLZ:= 55555;
     Bestellung.Empfänger.PLZ:= 55555;
  else
     Showmessage('Bitte überprüfen Sie das Formular.'); //ka ob deine Daten von einem Formular stammen ;)
end;
Eine Klasse würde ich nur hernehmen um einen array von TBestellung zu verwalten/durchsuchen oder einzelne Datensätze abzuspeichern.

3_of_8 20. Jul 2006 22:02

Re: Klasse mit mehreren "ebenen"?
 
Nenene, von Property war nicht die Rede.

Mit ner Property kannst du nur den GANZEN Record setzen, nicht Teile davon.

Dann musst du ne Klasse nehmen, was in diesem Fall kein Problem ist, schreib einfach in den Konstruktor für TEmpfaenger und TAbsender jeweils ein Create und im Destructor ein Free rein.

Achja: Und wenn du die Records public machst, getzt trotzdem nicht mit Propertys.

TKC 20. Jul 2006 22:54

Re: Klasse mit mehreren "ebenen"?
 
Zitat:

Zitat von 3_of_8
Dann musst du ne Klasse nehmen, was in diesem Fall kein Problem ist, schreib einfach in den Konstruktor für TEmpfaenger und TAbsender jeweils ein Create und im Destructor ein Free rein.

Wie soll das dann aussehen ??

Phantom1 21. Jul 2006 09:03

Re: Klasse mit mehreren "ebenen"?
 
Zitat:

Zitat von 3_of_8
Mit ner Property kannst du nur den GANZEN Record setzen, nicht Teile davon.

Wieso sollte das nicht gehen?
Delphi-Quellcode:
type
  TAbsender = packed record
    Name: string[255];
    PLZ: Cardinal;
  end;

  TAbsenderClass = class(TObject)
  private
    absender: array of TAbsender; // oder TObjectList
    function GetName(const Index: Integer): string;
    procedure SetName(const Index: Integer; const Value: string);
    function GetPLZ(const Index: Integer): Cardinal;
    procedure SetPLZ(const Index: Integer; const Value: Cardinal);
  public
    property Name: string index 0 read GetName write SetName;
    property PLZ: Cardinal index 1 read GetPLZ write SetPLZ;
    //..
  end;

Hawkeye219 21. Jul 2006 09:41

Re: Klasse mit mehreren "ebenen"?
 
@Phantom1

Die Index-Direktive ist nur sinnvoll, wenn die Properties sich einen Getter/Setter teilen. Wenn du aber über den Index auf die Elemente des Arrays zugreifen möchtest, dann besser so:

Delphi-Quellcode:
type
  TAbsender = packed record
    Name: string[255];
    PLZ: Cardinal;
  end;

  TAbsenderClass = class(TObject)
  private
    absender: array of TAbsender; // oder TObjectList
    function GetName(aIndex: Integer): string;
    procedure SetName(aIndex: Integer; const aValue: string);
    function GetPLZ(aIndex: Integer): Cardinal;
    procedure SetPLZ(aIndex: Integer; aValue: Cardinal);
  public
    property Name [aIndex: integer]: string read GetName write SetName;
    property PLZ [aIndex: integer]: Cardinal read GetPLZ write SetPLZ;
    //..
  end;
Gruß Hawkeye

Phantom1 21. Jul 2006 09:48

Re: Klasse mit mehreren "ebenen"?
 
Hawkeye219: Ja stimmt, da hab ich wohl auf die schnelle etwas verwechselt :wink:

3_of_8 21. Jul 2006 11:54

Re: Klasse mit mehreren "ebenen"?
 
Na so gehts natürlich. Aber dann ist der gewünschte Effekt, nämlich eine Klassenschachtelung wieder nicht gegeben.


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