Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion an Funktion übergeben. (https://www.delphipraxis.net/8793-funktion-funktion-uebergeben.html)

samson 12. Sep 2003 09:26


Funktion an Funktion übergeben.
 
Hallo Leute,

ist es möglich eine Function an eine Function zu übergeben :?: :?: :?:

Nachdem meine Function im Basisformular fertig ist, soll die übergebene Function ausgeführt werden. Um Kreisbeziehungen zu vermeiden, möchte ich eine Function an eine Function übergeben.

Danke schon jetzt für Eure Hilfe.

Gruss


Samson

TypusMensch 12. Sep 2003 11:42

Re: Funktion an Funktion übergeben.
 
Du kannst ein Parameter weitergeben. Also sagen wir mal ein geschachteltes System in etwa so:


FUNKTION1(...) : ...;
begin
...
end;

FUNKION2(...) : ...;
begin
...
blablabla := FUNKTION1(...);
...
end;

HAUPTPROZEDUR(...);
begin
...
blablabla := FUNTKION2(...);
...
end;

Drumherum noch ein paar Schleifen, wie du es halt brauchst und somit wird auch auf die jeweilige Funktion beliebig oft zugegriffen.

Verstanden??? Is jetzt 'n bissel kurz erklärt, aber ich hoffe, du weißt, wie ich es meine... :wink:

Rumpi 12. Sep 2003 11:58

Re: Funktion an Funktion übergeben.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe ich habe das richtig verstanden !

Hier ein kleines Programm dazu.

Du kannst eine Function in einem anderen Formular ( Form2)
rufen und bei der Übergabe bestimmen was am ende
"in dem Übergebenden Formular (Form1)"
ausgeführt werden soll.

Form2 muss die Methoden von Form1 und
Form1 nicht die von Form2 kennen bis
auf die gemeinsame Function die gerufen werden kann.

Teste einfach mal durch ob es das ist was du brauchst.

mfg Rumpi

Code:
Delphi-Quellcode:
unit Unit1;

interface

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

type

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    FMyFunction : TNotifyEvent;
    procedure MyFunction( Sender: TObject );
  public
    { Public declarations }
    procedure CallFunction(  Func: TNotifyEvent );
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  FMyFunction := MyFunction;
end;


procedure TForm1.CallFunction( Func: TNotifyEvent );
begin
  MyFunction( Self );
  if Assigned( Func ) and (@Func <> MethodAddress( 'MyFunction' )) then
    Func( nil );
end;

procedure TForm1.MyFunction( Sender: TObject );
begin
  Caption := 'MyFunction ' + Name;
  Sleep( 500 );
  Caption := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CallFunction( nil );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.CallFunction( FMyFunction );
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if Not Form2.Visible then
    Form2.Show;
end;

end.

//**********************************************************

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FMyFunction : TNotifyEvent;
    { Private declarations }
    procedure MyFunction( Sender: TObject );
  public
    { Public declarations }
    procedure CallFunction(  Func: TNotifyEvent );
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  FMyFunction := MyFunction;
end;


procedure TForm2.CallFunction( Func: TNotifyEvent );
begin
  MyFunction( Self );
  if Assigned( Func ) and (@Func <> MethodAddress( 'MyFunction' )) then
    Func( nil );
end;

procedure TForm2.MyFunction( Sender: TObject );
begin
  Caption := 'Function ' + Name;
  Sleep( 500 );
  Caption := '';
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
   Form1.CallFunction( FMyFunction );
end;

end.

woki 12. Sep 2003 12:22

Re: Funktion an Funktion übergeben.
 
Hallo,

vielleicht hilft dir zusätzlich weiter, was Du unter den Stichworten "Methodenzeiger" oder "prozedurale Typen" in der Onlinehilfe findest.

Grüße
Woki

Rumpi 12. Sep 2003 12:30

Re: Funktion an Funktion übergeben.
 
Das ist besser !

Delphi-Quellcode:
procedure TForm???.CallFunction( Func: TNotifyEvent );
begin
  MyFunction( Self );
  if Assigned( Func ) and (@Func <> @FMyFunction) then
    Func( nil );
end;
mfg Rumpi

Ronny Grabo 12. Sep 2003 12:31

Re: Funktion an Funktion übergeben.
 
Hallo,

irgendwie hab ich es nicht ganz verstanden, Du hast MyFunction als procedure deklariert und nicht als Funktion (function).

Delphi-Quellcode:
    private
    { Private declarations }
    FMyFunction : TNotifyEvent;
    procedure MyFunction( Sender: TObject );
eine Function wird jedoch wie folgt deklariert :
Delphi-Quellcode:
function FunktionsName(Variable:Typ):Rückgabewert
Gruß Ronny.

samson 12. Sep 2003 14:00

Re: Funktion an Funktion übergeben.
 
Danke!

Ich habs geschafft. Nochmal zur Erklärung!

Ich habe eine MDI-Application. Diese hat natürlich MDI-Childs, welche nicht von TForm abgeleitet sind, sondern von MyBasicForm.

MyBasicForm ist von TForm abgeleitet.

Jetzt habe ich eine procedure der MDI-Hauptform geschrieben welche bestimmte Aktionen macht wenn das MDI-Child geschlossen wird.

Aufgrund der Tatsache, das der Code beim Schliessen eines MDI-Childs immer gleich ist, habe ich eine entsprechende procedure in MyBasicForm geschrieben.

Problem war, das ich nicht die MDI-Hauptunit in MyBasicForm einusen will. Also muss das MDI-Child die vorhin genannte Funktion übergeben.

Ich habs jetzt folgend gelöst.

Delphi-Quellcode:
Typ
  TMyFunc:procedure of Object;

Typ
  MyBasicForm = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction; MainFunc:TMyFunc);

.
.
.
end;
implementation
      procedure MyBasicForm.FormClose(Sender: TObject; var Action: TCloseAction; MainFunc:TMyFunc);
      begin
        .
        .
        .
        MainFunc;
      end;
Ich danke auf jedem Fall allen die mir geholfen haben.

Gruss


Samson :hello:


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