Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.? (https://www.delphipraxis.net/195846-kann-man-einer-procedure-als-parameter-eine-andere-procedure-uebergeben-o-ae.html)

juergen 31. Mär 2018 15:23

kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.?
 
Hallo zusammen,

in meinem Code muss ich in den verschiedensten Proceduren immer wieder dieselben Bedingungen abfragen. In den Bedingungen werden verschiedenste Stati geprüft.
Das produziert Unmengen an gleichen Code und ist somit schwer wartbar/erweiterbar/ anpassbar.
Wenn es geht, würde ich das gerne ändern und suche daher nun ein Konzept.

Beispiel:
Delphi-Quellcode:
procedure Tfrm_Main.machwas;
var
  ls_FileName : string;
  RecIdx, RowIdx : Integer;
begin
  ls_FileName := ....;
  RecIdx := ....;
  RowIdx := ....;

  if gb_Stati_1 then
  begin
    procedur 1(ls_FilenName, RecIdx, RowIdx);

  end else if gb_Stati_4 then
  begin
    procedur 2(ls_FilenName, RecIdx, RowIdx);
  end;
....
end;
Im Prinzip soll in der Procedure "machwas" die ganzen Abfragen wegfallen die dann in einer globalen Procedure(?) stehen und der man als Parameter für die einzelnen Bedingungen eine andere Proceduren übergeben kann.

Beispiel:
Delphi-Quellcode:
procedure Tfrm_Main.Check_Statis(const procedure x, const procedure y);
begin
  if gb_Stati_1 then
  begin
    x; //<== meine 1. "variable" Procedure
  end else if gb_Stati_4 then
  begin
    y; //<== meine 2. "variable" Procedure
  end;
....
end;

procedure Tfrm_Main.machwas;
var
  ls_FileName : string;
  RecIdx, RowIdx : Integer;
begin
  ls_FileName := ....;
  RecIdx := ....;
  RowIdx := ....;

  Check_Statis(x, y);
So meine Vorstellungen. :stupid:
Die Bedingungen sind einiges komplexer wie hier dargestellt und die Anzahl der Proceduren (also die Anzahl der Bedingungen) sind momentan 8 Stk.
Ich denke das es für die Profiprogrammierer dafür eine Lösung geben müsste.
Gibt es die Möglichkeiten einer Procedure als Parameter eine andere Procedure zu übergeben? Oder wie löst man diese Anfortderung?
Leider bin ich (noch) sehr procedure-lastig beim Hobby-programmieren.

Ich hoffe ich konnte mein Problem überhaupt verständlich darstellen und bedanke mich schon mal vorab für Ideen und Konzeptvorschläge.

bnreimer42 31. Mär 2018 15:31

AW: kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.?
 
Ich weis nicht, ob das mit Delphi XE schon geht, aber schau mal unter http://docwiki.embarcadero.com/RADSt...oden_in_Delphi

Ghostwalker 31. Mär 2018 15:48

AW: kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.?
 
Jap...das geht :) Einfach mal nach dem Stichwort "Callback" suchen :)
Die Methode über Callbacks hat den "Nachteil" das du eine fixe Paremterliste für alle Prozeduren hast.

Innerhalb eines Objektes brauchst du die Prozedur aber nicht mal übergeben..schließlich kennst du die einzelnen Prozeduren, die je nach Status aufgerufen werden sollten.

Evtl. wär auch das ein Ansatz:

Delphi-Quellcode:
Type
  TCallback = Procedure (Parameter1:string);
  TStatus = (sStatus1,sStatus2,sStatus3);

Procedure Callback1(param1:string);
begin
  :
end;

Procedure Callback2(param1:string);
begin
  :
end;

Procedure CallBack3(Param1:string);
begin
  :
end;

const
  TCalls : array[TStatus] of TCallback = (
   @Callback1,@Callback2,@Callback3
  );

Procedure CheckState(aState:TStatus);
begin
  TCalls[aState]('Was auch immer');
end;
Hab das jetzt nicht ausprobiert ob das so geht, aber vom Prinzip her sollte es gehen.

Bernhard Geyer 31. Mär 2018 15:56

AW: kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.?
 
Da geht:

Delphi-Quellcode:
type
  TMyCheckFunction = function(...): Boolean;

procedure Machwas(MyCheckFunction: TMyCheckFunction);
begin
  ...
  if MyCheckFunction(...) ...
end;


function CheckImpl1(...): Boolean;

function CheckImpl2(...): Boolean;


procedure DoIt;
begin
  Machwas(CheckImpl1);
 
  Machwas(CheckImpl2);
end;

juergen 31. Mär 2018 20:16

AW: kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.?
 
Hallo,

danke für das Aufzeigen verschiedener Möglichkeiten. :dp:
Ich werde mich wohl für anonyme Methoden entscheiden, da diese in meiner Delphi-Hilfe auch ziemlich gut erklärt sind.

Schöne Ostern!

himitsu 31. Mär 2018 20:35

AW: kann man einer Procedure als Parameter eine andere Procedure übergeben, o.ä.?
 
Und natürlich gibt es noch die Objekt-Methoden, so wie du sie schon seit Jahren aus deinem Delphi kennst ... z.B. die Events der VCL, ala OnClick, OnCreate usw.


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