Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Liste von proceduren (https://www.delphipraxis.net/188482-liste-von-proceduren.html)

Alexander I 8. Mär 2016 15:59

Liste von proceduren
 
Hallo,

weiß jemand wie man eine Liste von proceduren erstellt?

Herrauskommen soll so was wie:
Delphi-Quellcode:
procedurenKette.Add(procedure1);
procedurenKette.Add(procedure2);
procedurenKette.Add(procedure3);
und der Aufruf:

Delphi-Quellcode:

procedurenKette.Do

mit :

Delphi-Quellcode:
procedure Add(procedure);
begin
Liste(i).Add(procedure);
end;

procedure Do;
begin
for i:=0 to anzahlDerÜbergebenenProceduren do
Liste(i);
end;

Danke und Gruß.

Neutral General 8. Mär 2016 16:02

AW: Liste von proceduren
 
Hallo,

Das sollte so gehen:
Delphi-Quellcode:
type
  TProcedure = procedure;

  TProcedureList = class(TList<TProcedure>) // uses Generics.Collections für TList<T>
  public
    procedure Do;
  end;

procedure TProcedureList.Do;
var i: Integer;
begin
  for i:=0 to Count-1 do
    Items[i]();
end;

Alexander I 9. Mär 2016 12:44

AW: Liste von proceduren
 
Vielen Danke.

Ich hab das jetzt so gelöst.

Delphi-Quellcode:

type

  TKinematic = procedure(x, y, z: double) of Object;

  TTransformation = record
    LinkProcedure: TKinematic;
    x, y, z: double;
  end;

  TKinematicChain = class(TList<TTransformation>)
  public

    procedure AddKinematic(transformation: TKinematic; x, y, z: double);

    constructor Create;
    destructor destroy;
  end;

implementation

{ TKinematicChain }

procedure TKinematicChain.AddKinematic(transformation: TKinematic; x, y, z: double);
var
  transform: TTransformation;
begin
  transform.LinkProcedure := transformation;
  transform.x := x;
  transform.y := y;
  transform.z := z;
  Add(transform)
end;

end.
Aufgerufen wird das ganze so :

Delphi-Quellcode:
  kette := TKinematicChain.Create;
  kette.AddKinematic(glGrafik.Translate, 0, 0, -40);
  kette.AddKinematic(glGrafik.Rotate, 0, -45, 0);
Was mich jetzt dabei stört ist, dass ich gerne die übergebenen Methoden:

Delphi-Quellcode:
 kette.AddKinematic(  glGrafik.TranslateF, 0, 0, -40  );
 kette.AddKinematic(  glGrafik.Rotate, 0, -45, 0      );
so aufrufen würde :

Delphi-Quellcode:
 kette.AddKinematic( glGrafik.TranslateF ( 0, 0, -40 )  );
 kette.AddKinematic( glGrafik.Rotate ( 0, -45, 0 )       );
mit :

Delphi-Quellcode:
TKinematicChain = class(TList<TKinematic>)
...
procedure TKinematicChain.AddKinematic(transformation: TKinematic);
begin
  Add(transform)
end;

Da bekomme ich aber Fehlermeldungen. Der mag die Parameter (x, y, z: double) nicht.

Kurz und gut : Ich würde gerne auf das record verzichten und die Methode mit Parametern direkt in der Kette speichern.

Ideen?? Vorschläge??

Gruß.

Neutral General 9. Mär 2016 12:58

AW: Liste von proceduren
 
So geht es nicht.
Die einzige Möglichkeit wie du quasi die Procedure direkt mit Parametern abspeichern könntest wäre so:

Delphi-Quellcode:
type
  TKinematic = reference to procedure;

TKinematicChain = class(TList<TKinematic>);

//Aufruf:
kette.Add(procedure begin glGrafik.TranslateF ( 0, 0, -40 ) end);
Ob dir das besser gefällt ist natürlich ne andere Frage, das procedure begin ... end würde mich mehr nerven, als kette.AddKinematic( glGrafik.TranslateF, 0, 0, -40 );

himitsu 9. Mär 2016 12:58

AW: Liste von proceduren
 
Das kann nicht gehen, denn
Delphi-Quellcode:
glGrafik.TranslateF ( 0, 0, -40 )
führt diese Funktion aus und übergibt dann dessen Result (eine Prozedur hat kein Result, also knallt das da) an AddKinematic, aber du willst doch den Funktionszeiger gespeichert haben, oder doch dessen Rückgabe?

Also im Prinzip wie Michael es zeigt, wobei man das auch über einen "statischen" Wrapper machen kann, anstatt mir einem Anonymen.

Alexander I 9. Mär 2016 13:20

AW: Liste von proceduren
 
Danke.


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