Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Methoden nun doch für Records? (https://www.delphipraxis.net/103048-methoden-nun-doch-fuer-records.html)

efknarf 9. Nov 2007 01:44


Methoden nun doch für Records?
 
Hallo, ihr fleißigen User,

folgenden Record habe ich deklariert:

Delphi-Quellcode:
type
  TTest = Record
  private
    Feld1: Integer;
    Feld2: Integer;
  public
    Feld3: Integer;
    procedure Clear;
  end;

implementation

procedure TTest.Clear
begin
  Feld1:=0;
  Feld2:=0;
  Feld3:=0;
end;
Nun kann man diesen TTest-Record wie einen gewöhnlichen Record verwenden, wobei sich die Felder so verhalten, wie man es von ihnen erwartet.
Weiß nicht, ob das nun bei jedem hier funktioniert. Bei mir funktionierte es jedenfalls. Ist das nun eine Methode eines Records oder wie nennt man das nun und ist diese Methode identisch mit einer Object-Methode? In der Hilfe zu Delphi und auch hier habe ich nichts dazu gefunden.
:gruebel: :wiejetzt:

mkinzler 9. Nov 2007 05:33

Re: Methoden nun doch für Records?
 
Eigentlich wird (ab D10) nur Klassenoperatoren unterstützt.
Welche Delphiversion? .Net?

WS1976 9. Nov 2007 05:35

Re: Methoden nun doch für Records?
 
Hallo,
ich weiss nicht was du für eine Delphi Version hast, aber bei mir geht das weder mit D7 noch mit D2005.
Ausserdem widerspricht das ganz klar der Object Pascal Grammatik.

Delphi-Quellcode:
type
  TTest = Record
//  private
    Feld1: Integer;
    Feld2: Integer;
//  public
    Feld3: Integer;
//    procedure Clear;
  end;
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//procedure TTest.Clear
//begin
//  Feld1:=0;
//  Feld2:=0;
//  Feld3:=0;
//end;
All die auskommentierten Zeilen sind fehlerhaft! Wobei das bei der Procedure im implementation Teil klar ist.
Ihr fehlt ja die Deklaration!

Grüsse
Rainer

efknarf 9. Nov 2007 05:50

Re: Methoden nun doch für Records?
 
Guten Morgen,

Ja! Das hatte ich fast erwartet. Meine Delphi-Version ist von CodeGear - Delphi 2007. Liegt wohl an der Version, denn in einer älteren Version funktionierte diese Art der Deklaration nicht.
Trotz dieser Neuerung ist selbst nach intensiver Suche in der Delphi-Hilfe nichts darüber zu finden. Bin auch mehr oder weniger nur zufällig darüber gestolpert.

Gruß Frank

peschai 9. Nov 2007 05:52

Re: Methoden nun doch für Records?
 
Sorry, aber ich konnte das soeben unter Delphi2007Professional nachstellen!!!
Bis auf ein fehlendes ";". Es lässt sich so komplilieren!.
Faszinierend!! Aber klar ist doch hoffentlich, daß man davon tunlichst die Finger lassen sollte!!!
:???:

efknarf 9. Nov 2007 06:07

Re: Methoden nun doch für Records?
 
Zitat:

Faszinierend!! Aber klar ist doch hoffentlich, daß man davon tunlichst die Finger lassen sollte!!!
Wahrscheinlich hast du damit sogar recht, aber es ist doch toll zu wissen, was machbar ist, denn es vereinfacht vieles. Aber ein wenig seltsam ist das schon, daß man einem Record "Methoden" zuordnen kann.

Gruß

Frank

WS1976 9. Nov 2007 06:25

Re: Methoden nun doch für Records?
 
Hallo,

ich sehe überhaupt keinen Grund ein solches Konstrukt einzusetzen.
Was soll das Ganze denn vereinfachen?
Mal ganz davon abgesehen, dass du nie genau weisst was passiert.
(Es sei denn du analysierst das Teil auf Assembler Ebene. Viel Spass dabei.)

Grüsse
Rainer

Bernhard Geyer 9. Nov 2007 06:28

Re: Methoden nun doch für Records?
 
Zitat:

Zitat von efknarf
Wahrscheinlich hast du damit sogar recht, aber es ist doch toll zu wissen, was machbar ist, denn es vereinfacht vieles. Aber ein wenig seltsam ist das schon, daß man einem Record "Methoden" zuordnen kann.

Da man dieses Feature AFAIK unter .NET 2.0 zwingend benötigte hat man es auch gleich für Win32 verfügbar gemacht.
Und was soll seltsam sein? Alle Features von einem richtigen Objekt sind trotzdem nicht möglich. Schon mal versucht von diesem Record eine ableitung zu machen?

alzaimar 9. Nov 2007 07:22

Re: Methoden nun doch für Records?
 
Das kompiliert auch unter BDS2006.

Zitat:

Zitat von WS1976
ich sehe überhaupt keinen Grund ein solches Konstrukt einzusetzen.

Leichtgewichtige 'Klassen' und statische 'Objekte', siehe B.Geyer's Anmerkungen.
Zitat:

Zitat von WS1976
Was soll das Ganze denn vereinfachen?

Gute Frage. Die haben das vermutlich für Delphi.NET implementieren müssen und dann gleich für Delphi.Win32 verfügbar gemacht.
Zitat:

Zitat von WS1976
Mal ganz davon abgesehen, dass du nie genau weisst was passiert.

:gruebel: Wieso? Es ist doch ganz klar, was passiert.

Schau mal in der Hilfe unter 'Records (erweiterte)'.


Zitat:

Zitat von Die Delphi OH
Records (erweiterte)
Zusätzlich zu den traditionellen Record-Typen lässt die Delphi-Sprache komplexere und “klassenähnliche” Record-Typen zu. Zu den Feldern können Records Eigenschaften und Methoden (einschließlich Konstruktoren), Klasseneigenschaften, Klassenmethoden, Klassenfelder und verschachtelte Typen haben. Weitere Informationen hierzu finden Sie in der Dokumentation zu Klassen und Objekten. Im Folgenden finden Sie eine Beispiel-Record-Typdefinition mit einigen “klassenähnlichen” Merkmalen.
Delphi-Quellcode:
type
  TMyRecord = record
    type
      TInnerColorType = Integer;
    var
      Red: Integer;
    class var
      Blue: Integer;
    procedure printRed();
    constructor Create(val: Integer);
    property RedProperty: TInnerColorType read Red write Red;
    class property BlueProp: TInnerColorType read Blue write Blue;
end;

constructor TMyRecord.Create(val: Integer);
begin
  Red := val;
end;

procedure TMyRecord.printRed;
begin
  writeln('Red: ', Red);
end;
Obwohl Records nun einige der Merkmale von Klassen besitzen, gibt es wichtige Unterschiede zwischen Klassen und Records.
  • Records unterstützen keine Vererbung.
  • Records können variante Teile enthalten; Klassen nicht.
  • Records sind Wertetypen, daher werden Sie bei der Zuweisung kopiert, per Wert übergeben und dem Stack zugewiesen, wenn sie nicht als global definiert sind oder explizit mit den Funktionen New und Dispose zugewiesen werden. Klassen sind Referenztypen, daher werden Sie bei der Zuweisung nicht kopiert, per Referenz übergeben und dem Heap zugewiesen.
  • Records ermöglichen das Überladen von Operatoren auf Win32- und .NET-Plattformen; Klassen ermöglichen das Überladen von Operatoren nur bei .NET.
  • Records werden automatisch mit einem Standardkonstruktor ohne Argumente erzeugt, Klassen dagegen müssen explizit erzeugt werden. Weil Records einen argumentlosen Standardkonstruktor haben, muss jeder benutzerdefinierte Record-Konstruktor ein oder mehr Parameter haben.
  • Record-Typen können keine Destruktoren haben.
    Virtuelle Methoden (die mit den Schlüsselwörtern virtual, dynamic und message angegeben werden) dürfen in Record-Typen nicht verwendet werden.
    Im Gegensatz zu Klassen können Record-Typen auf der Win32-Plattform keine Schnittstellen implementieren; auf der .NET-Plattform können Records jedoch Schnittstellen implementieren.


Hawkeye219 9. Nov 2007 07:53

Re: Methoden nun doch für Records?
 
Hallo,

hier ist ein mögliches Einsatzgebiet für Records mit Methoden: Enumerator Records.
Der Artikel zeigt auch, daß Records deutlich weniger Verwaltung erfordern - so wie es alzaimar bereits angesprochen hat.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
Seite 1 von 3  1 23      

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