Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozedur in Typendeklaration (https://www.delphipraxis.net/11343-prozedur-typendeklaration.html)

Niels 4. Nov 2003 19:26


Prozedur in Typendeklaration
 
Ich möchte für nen selbstdefinierten Typ gewisse Funktionen festlegen. Ich weiß aber nicht wie ich die Prozedur oder Funtion definieren soll.

Ich hab mal folgendes gemacht:

Delphi-Quellcode:
type
  dNode = ^pNode;
  pNode = record
    dat: integer;
    next: dNode;
    new: procedure (var node: dNode);
  end;
Dazu hab ich noch die Prozedur new, in der dann einfach steht new(node);
Ich hab den Befehl new jetzt nur genommen um ein einfaches Beispiel zu bringen, da kommen dann natürlich andere hin.

Das Problem hierbei wäre nur, dass ich ja schreiben muss x.new(x);
...was eigentlich relativ sinnlos ist. Ich will nur schreiben x.new;
Ist das irgendwie möglich?

MfG Niels

neolithos 4. Nov 2003 19:41

Re: Prozedur in Typendeklaration
 
Nein,

aber man könnte ja auch ne Klasse verwenden! Oder?

Christian Seehase 4. Nov 2003 19:41

Re: Prozedur in Typendeklaration
 
Moin Niels,

ja, ist möglich.
Nur kannst Du dann keinen Record nehmen, sondern musst Dir eine neue Klasse (class) erstellen.
Hier kannst Du Daten und Methoden mischen.

Niels 4. Nov 2003 19:54

Re: Prozedur in Typendeklaration
 
Wenn ich ne Klasse nehm, dann hab ich aber auch diese ganzen Standard-Funktionen und Eigenschaften drin. Kann ich das irgendwie rausschmeisen?

MfG Niels

SirThornberry 4. Nov 2003 20:00

Re: Prozedur in Typendeklaration
 
es geht maximal
Delphi-Quellcode:
type
  dNode = ^pNode;
  pNode = record
    dat: integer;
    next: dNode;
    new: TNotifyEvent;
  end;
wobei du für TNotifyEvent dann auch andere Proceduretypen oder wie sich das nennt einsetzen kannst
bsp.:
Delphi-Quellcode:
type
  TMyEvent = procedure(var node: dNode) of Object;
  dNode = ^pNode;
  pNode = record
    dat: integer;
    next: dNode;
    new: TMyEvent;
  end;
und schon hast du das was du wolltest....

Christian Seehase 4. Nov 2003 20:00

Re: Prozedur in Typendeklaration
 
Moin Niels,

Du könntest es dann noch so machen:

Delphi-Quellcode:
type
  dNode = ^pNode;
  TMyProc = procedure(var node: dNode);
  pNode = record
    dat: integer;
    next: dNode;
    new: TMyProc;
  end;
Dann müsstest Du nur bei jedem Satz den Du verwendest noch die Adresse einer entsprechenden Prozedure zuweisen.

Niels 4. Nov 2003 20:09

Re: Prozedur in Typendeklaration
 
Ich versteh nicht wirklich wo jetzt der Unterschied zwischen dem was ich und dem was ihr geschrieben habt.

Außerdem passiert folgendes:
wenn ich dann die Prozedur neu schreib sagt er mir Identifier redeclared.
Wo soll ich die Prozedur dann hinschreiben, dass es funzt?

Christian Seehase 4. Nov 2003 20:21

Re: Prozedur in Typendeklaration
 
Moin Niels,

Zitat:

Zitat von Niels
Wo soll ich die Prozedur dann hinschreiben, dass es funzt?

wie hast Du es denn gemacht.
Geht bei mir problemlos.

Niels 4. Nov 2003 20:22

Re: Prozedur in Typendeklaration
 
ich hab deins ins interface geschrieben und den Inhalt der Prozedur in den implementation-Teil

SirThornberry 4. Nov 2003 20:26

Re: Prozedur in Typendeklaration
 
Delphi-Quellcode:
type
  TMyEvent = procedure(var node: dNode) of Object;
  dNode = ^pNode;
  pNode = record
    dat: integer;
    next: dNode;
    new: TMyEvent;
  end;

  TForm1 = class(TForm)
  [...]
  private
    procedure test11(var node: dNode);
  end;
  [...]


procedure TForm1.irgendwas...
var test: pNode;
begin
 test.new := test11;
 test.new(wasweißich);
 [...]

Christian Seehase 4. Nov 2003 20:27

Re: Prozedur in Typendeklaration
 
Moin Niels,

ich auch, und das sieht dann so aus:

Delphi-Quellcode:
procedure New(var node: dNode);
begin
  // Was auch immer damit passieren soll
end;

procedure TForm1.Button1Click(Sender: TObject);

var
  pWork : pNode;
  dWork : dNode;

begin
  pWork.new := @new;
  dWork    := @dWork;
  pWork.new(dWork);
end;
Klappt auch, obwohl ich die Wahl von new als Prozedurenamen ansonsten als unglücklich erachte, da es eine Prozedur gleichen Namens ja schon gibt.
BTW:
Den Recordtypen mit p beginnen zu lassen, und den zugehörigen Pointer mit d hat mich offengestanden ein klein wenig irritiert. Eigentlich beginnen Pointer mit p (besser P).

Niels 4. Nov 2003 20:44

Re: Prozedur in Typendeklaration
 
Danke. Ich guck erstmal wie weit ich jetzt komm :)

Wegen der Typenbezeichnung:
ich hatte immer:

type
dpnode = ^dnode
dnode = record...

aber dpnode war zu lang und intern ist das ja sowieso egal.

neolithos 4. Nov 2003 20:51

Re: Prozedur in Typendeklaration
 
Delphi-Quellcode:
unit Unit2;
interface

type
  PVListNode = ^TVListNode;
  TVListNode = record
    pNext : PVListNode;
    fData : record end;
  end;

  TVList = class
  private
    pFirst : PVListNode;
    iDataSize : Integer;
  protected
    function GetLast : PVListNode;
  public
    constructor Create(aiDataSize : Integer);
    destructor Destroy; override; // fehlt noch

    procedure AddItem(const fData);
    procedure DeleteAll;
  end;

implementation


{ TVList }

procedure TVList.AddItem(const fData);
var pNew : PVListNode;
begin
  GetMem(pNew, SizeOf(TVListNode) * iDataSize);
  pNew^.pNext := nil;
  Move(fData, pNew^.fData, iDataSize); // Daten in Buffer

  if pFirst = nil then
     pFirst := pNew
  else
     GetLast^.pNext := pNew;
end;

constructor TVList.Create(aiDataSize : Integer);
begin
  inherited Create;
  pFirst := nil;
  iDataSize := aiDataSize;
end;

destructor TVList.Destroy;
begin
  DeleteAll;
  inherited;
end;

function TVList.GetLast: PVListNode;
begin
  if pFirst = nil then
     Result := nil
  else
     begin
       Result := pFirst;
       while Result^.pNext <> nil do
         Result := Result^.pNext;
     end;
end;

end.
So, sieht das ding komplett aus.

Anmerk: wie haben via ICQ getextet.

Niels 4. Nov 2003 21:05

Re: Prozedur in Typendeklaration
 
Danke für deine Hilfe (auch wenn ichs über ICQ schon gesagt hab) :wink:


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