Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - in records forwarden


Allesquarks - Mi 01.11.06 17:48
Titel: in records forwarden

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 type  TMathkeyword=class;

        TParsefunctions=function(zeile:string;start:integer;var parseend:integer;selfkey:TMathkeyword):TFunction;

        TMathkeyword = class
        priority:integer;
        tag:integer;
        notation:string;
        functionclass:TFunctionclass;
        parsefunction:TParsefunctions;
  end;


wie man sieht musste ich um parsefunctions zu definieren TMathkeyword forwarden. Ich habe das aber nur über den Umweg hinbekommen, dass Mathkeyword ne Klasse ist. Dabei soll ees eigentlich ein record sein. In Delphi 7 war dazu eine schöne Hilfe bin aber inzwischen bei Turbo angelangt.

Edit: Oder geht das bei records gar nicht?


Reinhard Kern - Mi 01.11.06 18:04

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Hallo,

wenn du eine Klasse hast, ist der aktuelle Parameter immer ein Pointer, daher ist forward kein Problem. Bei einem record könntest du ja auch mit einem Pointer arbeiten und als Parameter einen allgemeinen Pointer definieren (dann brauchst du keine vorherige Deklaration, erst in der Implementierung), aber schön ist das auch nicht, weil die Typprüfung teilweise entfällt.

Gruss Reinhard

NACHTRAG:

wg. pointer geht es auch folgendermassen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    PMathkeyword = ^TMathkeyword;

    TParsefunctions=function(zeile:string;start:integer;
                             var parseend:integer;selfkey:PMathkeyword):TFunction;

    TMathkeyword = record
        priority:integer;
        tag:integer;
        notation:string;
        functionclass:TFunctionclass;
        parsefunction:TParsefunctions;
        end;


Xion - So 06.03.11 16:32

Das Topic ist zwar schon etwas abgestaubt, ich hab aber exakt das selbe Problem.

Allerdings funktioniert das mit dem Pointer bei mir nicht, da er bei der Deklaration von PMathkeyword logischerweise TMathkeyword auch noch nicht kennt.

Mein konkreter Fall:


Delphi-Quelltext
1:
2:
3:
4:
5:
 type TObservationFunction = procedure (var Ball: TGameBall; [...] );
  type TGameBall=record
    [...]
    ObservationFunction: TObservationFunction;
  end;


Wenn es so nicht geht wäre das extrem doof...da ich die Records durch die Gegend jongliere, wenn ich da die Funktion nicht dranpacken kann, ist das ziemlich doof.

Edit:
So gehts:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  type
     PGameBall = ^TGameBall;

     TObservationFunction=procedure (var Ball: PGameBall; [...]) of object;

      TGameBall=record
        [...]
        ObservationFunction: TObservationFunction;
  end;

Ob ich mit dem Pointer zufrieden bin...mal sehen ;)


jaenicke - So 06.03.11 16:58


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TGameBall = class
  private
    type
      TObservationFunction = procedure(var Ball: TGameBall; [...]) of object;
  private
    FObservationFunction: TObservationFunction;
  end;
Funktioniert aber erst ab Turbo Delphi / Delphi 2006. Eine Klasse ist meistens ja eh sinnvoller als ein Record.


Xion - So 06.03.11 17:07

Geht auch in Delphi 2005 schon, dankö. Klasse ist zwar nicht so schön für mich...aber besser als der Pointer :D