Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi gibt es Class Procedures in Records? (https://www.delphipraxis.net/128271-gibt-es-class-procedures-records.html)

himitsu 27. Jan 2009 09:45


gibt es Class Procedures in Records?
 
ja ja, ich schonwieder :oops:

Gibt es irgendeates ähnliches wie die KlassenProzeduren auch für Records?

etwa so:
Delphi-Quellcode:
TMyRecord = packed Record
  Obj: TMyObject;
  Class Function Create: TMyRecord;
End;

Class Function TMyRecord.Create: TMyRecord;
  Begin
    Result.Obj := TMyObject.Create;
  End;
Es soll eine Function entstechen, welche wie der Konstructer bei Klassen aussieht
und intern einen Record erstellt.

Hab hier ein Objekt (unterschiedliche Objecte) in einem Record "versteckt" und wollte dafür auch einige Create-Funktionen direct in dem Record anlegen.

Aktuell geht es zwar auch ohne sowas, aber es wäre schon hübscher, wenn es ginge :)


im Prinzip soetwas wie z.B. bei Implicit/Explicit, nur ohne übergebene Parameter:
Code:
TMyRecord = [color=#0000af][b]packed Record[/b][/color]
  [color=#0000af][b]Class Operator[/b][/color] Implicit[color=#808080](x: irgendwas)[/color]: TMyRecord ;
  [color=#0000af][b]Class Operator[/b][/color] Explicit[color=#808080](x: irgendwas)[/color]: TMyRecord ;


in Liebe dat himilein :angel: , oder so

mkinzler 27. Jan 2009 09:47

Re: gibt es Class Procedures in Records?
 
In neueren Delphi Version ( m.W. ab D2006) ja.

himitsu 27. Jan 2009 09:57

Re: gibt es Class Procedures in Records?
 
In D2009 wird bei Class (vor Functionen ... siehe erster Code) gemeckert :cry:

Zitat:

[DCC Fehler] OperatorInterface.pas(131): E2398 Klassenmethoden in Record-Typen müssen statisch sein
etwas ab D2006/TurboDelphi hätt schon vollkommen gereicht


[add]
das mit dem Free funktioniert natürlich (ist schließlich auch nix Außergewöhnliches),
aber etwas für Create konnt ich nicht finden
Delphi-Quellcode:
Type TMyRecord = Record
    Obj: TObject;
    Function Create: TMyRecord;
    Procedure Free;
  End;

Function TMyRecord.Create: TMyRecord;
  Begin
    Result.Obj := TObject.Create;
  End;

Procedure TMyRecord.Free;
  Begin
    Obj.Free;
    Obj := nil;
  End;

Procedure TForm1.FormCreate(Sender: TObject);
  Var R: TMyRecord;

  Begin
    R := TMyRecord.Create;

    R.Free;
  End;
dank der Operatoren geht sowas zumindestens, aber es wäre natürlich etwas Tolles, wenn es auch über den TMyRecord ginge :angel2:
Delphi-Quellcode:
Procedure TForm1.FormCreate(Sender: TObject);
  Var R: TMyRecord;

  Begin
    R := TObject.Create;

    R.Free;
  End;
schon schlim, dieser Perfektionist in mir :?

mkinzler 27. Jan 2009 10:05

Re: gibt es Class Procedures in Records?
 
Delphi-Quellcode:
  TMyRecord = packed Record
    Obj: TMyObject;
    Class Function Create: TMyRecord; static;
  End;
sollte funktionieren.

himitsu 27. Jan 2009 10:07

Re: gibt es Class Procedures in Records?
 
ich probierst mal

[info] hatte oben noch was nacheditiert

Delphi-Quellcode:
Type TMyRecord = Record
    Obj: TObject;
    Function Create: TMyRecord; Static; <<<<<<
    Procedure Free;
  End;
Zitat:

[DCC Fehler] Unit1.pas(26): E2376 STATIC kann nur für nicht-virtuelle Klassenmethoden verwendet werden
neee, geht nicht ;(

himitsu 27. Jan 2009 10:15

Re: gibt es Class Procedures in Records?
 
hab die OH mal nach "static" durchsucht....
Zitat:

Zitat von OH: static
Syntax
static <datendefinition> ;
static <funktionsname> <funktionsdefinition> ;

Delphi-Quellcode:
Type TMyRecord = Record
    Obj: TObject;
    Static Function Create: TMyRecord;
    Procedure Free;
  End;
Static ist hier 'nen Syntaxfehler

mkinzler 27. Jan 2009 10:17

Re: gibt es Class Procedures in Records?
 
Kompilliert zumindes mal:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMyObject = class
  end;

  PMyRecord = ^TMyRecord;
  TMyRecord = packed Record
    Obj: TMyObject;
    Class Function Create: PMyRecord; static;
  End;

var
  Form1: TForm1;
  Test: PMyRecord;

implementation

{$R *.dfm}

class function TMyRecord.Create: PMyRecord;
var
    p: PMyRecord;
begin
    New(p);
    result := p;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Test := TMyRecord.Create;
end;

end.

himitsu 27. Jan 2009 10:19

Re: gibt es Class Procedures in Records?
 
ja hab's grad mitbekommen ... es geht :firejump:

hatte vorhin beim Test das Class vergessen :wall:
Delphi-Quellcode:
Class Function Create: TMyRecord; Static;

ich glaub ich verlieb mich langsam in diese neuen Record-Funktionalitäten :love:

[add]
ach ja ....
Danke


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

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