![]() |
Übergabeparameter in Funktion
Hallo,
ich habe folgenden Code
Delphi-Quellcode:
Die beiden Funktionen unterscheiden sich nur durch die Zuweisung von C bzw. D an i. Wobei C und D wieder beliebige Funktionen sind.
function A (Value:Integer) : Integer;
begin .... i := C; .... end function B (Value:Integer) : Integer; begin .... i := D; .... end
Delphi-Quellcode:
Nach Compilieren erscheint die Fehlermeldung das Operator auf Operandentyp nicht anwendbar ist (in machinhalt bei der Zuweisung). Wie kann ich mein Problem beheben?
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 |
Re: Übergabeparameter in Funktion
#1. Semikolon Fehler
#2. Objekte <> Funktionen Beispiel:
Delphi-Quellcode:
MfG
type
TEmtpyFunc = Function(): Integer; function MachInhalt( Value: Integer; Func: TEmptyFunc ): Integer; begin // ... i := Func(); // ... end; |
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 ;) |
Re: Übergabeparameter in Funktion
Delphi-Quellcode:
Ist es richtig das die Funktion MachInhalt keine Funktion einer Klasse ist, sondern nur zwischen Typ und Implementation steht.
type
TEmtpyFunc = Function(): Integer; function MachInhalt( Value: Integer; Func: TEmptyFunc ): Integer; begin // ... i := Func(); // ... end; |
Re: Übergabeparameter in Funktion
Das geht schon in Ordnung.
|
Re: Übergabeparameter in Funktion
Es könnte daher auch x.MachInhalt stehen?
|
Re: Übergabeparameter in Funktion
Nein, das wäre eine Methode.
|
Re: Übergabeparameter in Funktion
Das ist wiederum schlecht, da alle Funktionen in diesem Beispiel Methoden sind.
|
Re: Übergabeparameter in Funktion
Dann musst du es halt entsprechend anpassen ;)
Delphi-Quellcode:
Ich hab das mal von funktion auf procedure mit out-Parameter geändert, müsste aber auch als Funktion gehen.
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); |
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 20:29 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