Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Übergabeparameter in Funktion (https://www.delphipraxis.net/135885-uebergabeparameter-funktion.html)

martin_ 19. Jun 2009 12:46


Übergabeparameter in Funktion
 
Hallo,
ich habe folgenden Code
Delphi-Quellcode:
function A (Value:Integer) : Integer;
begin
....
 i := C;
....
end

function B (Value:Integer) : Integer;
begin
....
 i := D;
....
end
Die beiden Funktionen unterscheiden sich nur durch die Zuweisung von C bzw. D an i. Wobei C und D wieder beliebige Funktionen sind.
Delphi-Quellcode:
function A (Value:Integer) : Integer;
begin
 result := machinhalt (Value; myfunction.C);
end

bzw.

function B (Value:Integer) : Integer;
begin
 result := machinhalt (Value; myfunction.D);
end

function machinhalt (Value : Integer; aFunction : TObject)
begin
...
 i := aFunction();
...
end
Nach Compilieren erscheint die Fehlermeldung das Operator auf Operandentyp nicht anwendbar ist (in machinhalt bei der Zuweisung). Wie kann ich mein Problem beheben?

Aphton 19. Jun 2009 13:30

Re: Übergabeparameter in Funktion
 
#1. Semikolon Fehler
#2. Objekte <> Funktionen

Beispiel:
Delphi-Quellcode:
type
  TEmtpyFunc = Function(): Integer;

function MachInhalt( Value: Integer; Func: TEmptyFunc ): Integer;
begin
// ...
  i := Func();
// ...
end;
MfG

jfheins 19. Jun 2009 13:31

Re: Übergabeparameter in Funktion
 
Du kannst Funktionen nicht als TObject übergeben. (Geht vll. in Java, aber in Delphi definitiv nicht)

Was du machen kannst: Definiere einen Event-Typ (oder wie das heißt) der eine Funktion beschreibt. Dann kannst du den Statt TObject nutzen ;)

Das Semikolon ist natürlich falsch, aber nicht der Hauptfehler ;)

martin_ 19. Jun 2009 14:24

Re: Übergabeparameter in Funktion
 
Delphi-Quellcode:
type
  TEmtpyFunc = Function(): Integer;

function MachInhalt( Value: Integer; Func: TEmptyFunc ): Integer;
begin
// ...
  i := Func();
// ...
end;
Ist es richtig das die Funktion MachInhalt keine Funktion einer Klasse ist, sondern nur zwischen Typ und Implementation steht.

DeddyH 19. Jun 2009 14:28

Re: Übergabeparameter in Funktion
 
Das geht schon in Ordnung.

martin_ 19. Jun 2009 14:45

Re: Übergabeparameter in Funktion
 
Es könnte daher auch x.MachInhalt stehen?

DeddyH 19. Jun 2009 14:51

Re: Übergabeparameter in Funktion
 
Nein, das wäre eine Methode.

martin_ 19. Jun 2009 15:03

Re: Übergabeparameter in Funktion
 
Das ist wiederum schlecht, da alle Funktionen in diesem Beispiel Methoden sind.

jfheins 19. Jun 2009 15:20

Re: Übergabeparameter in Funktion
 
Dann musst du es halt entsprechend anpassen ;)
Delphi-Quellcode:
type
  TEmtpyFunc = Procedure(out Value: Integer) of object;

procedure TForm1.jetztmachschon(out a: Integer);
begin
  a := 42;
end;

function MachInhalt( Value: Integer; Func: TEmptyFunc ): Integer;
begin
// ...
  Func(i);
// ...
end;

MachInhalt(23, meinobjekt.jetztmachschon);
Ich hab das mal von funktion auf procedure mit out-Parameter geändert, müsste aber auch als Funktion gehen.

DeddyH 19. Jun 2009 15:26

Re: Übergabeparameter in Funktion
 
Dann definier Dir doch eine Basisklasse, die die Methode (abstrakt) deklariert und leite die weiteren davon ab.
Delphi-Quellcode:
unit Unit6;

interface

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

type
  TMyBaseClass = class
  protected
    function TuWas(const Value: Integer): Integer;virtual;abstract;
  end;

  TClassA = class(TMyBaseClass)
  public
    function TuWas(const value: Integer): Integer;override;
  end;

  TClassB = class(TMyBaseClass)
  public
    function TuWas(const value: Integer): Integer;override;
  end;

  TForm6 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure Test(const obj: TMyBaseClass);
  public
    { Public-Deklarationen }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

{ TClassB }

function TClassB.TuWas(const value: Integer): Integer;
begin
  Result := value * 2;
end;

{ TClassA }

function TClassA.TuWas(const value: Integer): Integer;
begin
  Result := value * 3;
end;

{ TForm6 }

procedure TForm6.btn1Click(Sender: TObject);
var c1, c2: TMyBaseClass;
begin
  c1 := TClassA.Create;
  try
    c2 := TClassB.Create;
    try
      Test(c1);
      Test(c2);
    finally
      c2.Free;
    end;
  finally
    c1.Free;
  end;
end;

procedure TForm6.Test(const obj: TMyBaseClass);
begin
  if Assigned(obj) then
    ShowMessage(IntToStr(obj.TuWas(2)));
end;

end.


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