AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur einer Variablen zuweisen

Ein Thema von a.def · begonnen am 17. Jan 2017 · letzter Beitrag vom 17. Jan 2017
Antwort Antwort
a.def
(Gast)

n/a Beiträge
 
#1

Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 13:42
Ich habe eine grundlegende Frage zu einem Problem.

Statt in einer bestimmten Funktion (Schleife) X-Mal ein Case aufzurufen in welchen entschieden wird ob Func1, Func2 oder Func3 verwendet wird, möchte ich gerne zuvor (vor der Schleife) Func1 2 oder 3 einer Variablen zuweisen.

Von StackOverflow:
Delphi-Quellcode:
interface

type
  TNodeFunction = function(AInput: String): String;

implementation

function Func1(AInput: String): String;
begin
   result := AInput;
end;

function Func2(AInput: String): String;
begin
   result := 'Fooled You';
end;

function Func3(AInput: String): String;
begin
   result := UpperCase(AInput);
end;

procedure Demonstration;
var
  SomeFunc, SomeOtherFunc: TNodeFunction;
begin

     SomeOtherFunc = Func3;

     SomeFunc := Func1;
     SomeFunc('Hello'); // returns 'Hello'
     SomeFunc := Func2;
     SomeFunc('Hello'); // returns 'Fooled You'

     SomeOtherFunc('lower case'); // returns 'LOWER CASE'

end;
Mit dem obigen beispiel funktioniert das wunderbar. Aber was, wenn man Func1 2 oder 3 auch im Unit-Kopf deklariert hat? Wieso funktioniert das dann nicht mehr?
Der Fehler lautet
Zitat:
[dcc32 Fehler] uTest.pas(257): E2009 Inkompatible Typen: 'Reguläre Prozedur und Methodenzeiger'

Geändert von a.def (17. Jan 2017 um 13:45 Uhr)
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 13:45
TNodeFunction = function(AInput: String): String of object; Müsstest du für Objektmethoden verwenden. Mischen geht IIRC nicht.
Sebastian
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 13:54
Ok davon habe ich jetzt, sagen wir mal, 0 verstanden aber es funktioniert leider nicht.

Ich könnte meine Prozedur auch "nackt" deklarieren, also ohne Deklaration im Kopf aber das macht wieder Arbeit, wenn man Variablen außerhalb benutzen möchte.
  Mit Zitat antworten Zitat
SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 13:58
Du könntest auch Anonyme Methoden verwenden.
http://docwiki.embarcadero.com/RADSt...oden_in_Delphi

Dadurch kannst du TNodeFunction sowohl eine andere Funktion als auch inline-deklarationen von Funktionen zuweisen (SomeOtherFunc)

Delphi-Quellcode:
interface

type
  TNodeFunction = reference to function(AInput: String): String;

implementation

function Func1(AInput: String): String;
begin
   result := AInput;
end;

function Func2(AInput: String): String;
begin
   result := 'Fooled You';
end;



procedure Demonstration;
var
  SomeFunc, SomeOtherFunc: TNodeFunction;
begin

     SomeOtherFunc := function (AInput: String): String; begin Result := UpperCase(AInput); end;

     SomeFunc := Func1;
     SomeFunc('Hello'); // returns 'Hello'
     SomeFunc := Func2;
     SomeFunc('Hello'); // returns 'Fooled You'

     SomeOtherFunc('lower case'); // returns 'LOWER CASE'

end;
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 14:01
Dann nochmal mit Code - Konsolenanwendung, damit man es schnell nachgebastelt kriegt.

DPR:

Delphi-Quellcode:
program Project1;

uses
  System.SysUtils,
  Unit1 in 'Unit1.pas',
  Unit2 in 'Unit2.pas';

var
  X: TFoo;
begin
  Demonstration;
  WriteLn('');
  X := TFoo.Create;
  try
    X.Demonstration;
  finally
    X.Free;
  end;
  ReadLn;
end.
Unit 1 - direkte Funktionsaufrufe

Delphi-Quellcode:
unit Unit1;

interface

type
  TNodeFunction = function(AInput: String): String;

function Func1(AInput: String): String;
function Func2(AInput: String): String;
function Func3(AInput: String): String;
procedure Demonstration;


implementation

uses
  System.SysUtils;

function Func1(AInput: String): String;
begin
   result := AInput;
end;

function Func2(AInput: String): String;
begin
   result := 'Fooled You';
end;

function Func3(AInput: String): String;
begin
   result := UpperCase(AInput);
end;

procedure Demonstration;
var
  SomeFunc, SomeOtherFunc: TNodeFunction;
begin

     SomeOtherFunc := Func3;

     SomeFunc := Func1;
     WriteLn(SomeFunc('Hello')); // returns 'Hello'
     SomeFunc := Func2;
     WriteLn(SomeFunc('Hello')); // returns 'Fooled You'

     WriteLn(SomeOtherFunc('lower case')); // returns 'LOWER CASE'

end;

end.
Unit 2 - Objektmethoden

Delphi-Quellcode:
unit Unit2;

interface

type
  TNodeFunction = function(AInput: String): String of object;

  TFoo = class
    function Func1(AInput: String): String;
    function Func2(AInput: String): String;
    function Func3(AInput: String): String;
    procedure Demonstration;
  end;

implementation

uses
  System.SysUtils;

procedure TFoo.Demonstration;
var
  SomeFunc, SomeOtherFunc: TNodeFunction;
begin
   SomeOtherFunc := Func3;

   SomeFunc := Func1;
   WriteLn(SomeFunc('Hello')); // returns 'Hello'
   SomeFunc := Func2;
   WriteLn(SomeFunc('Hello')); // returns 'Fooled You'

   WriteLn(SomeOtherFunc('lower case'));
end;

function TFoo.Func1(AInput: String): String;
begin
  result := AInput;
end;

function TFoo.Func2(AInput: String): String;
begin
  result := 'Fooled You';
end;

function TFoo.Func3(AInput: String): String;
begin
  result := UpperCase(AInput);
end;

end.
Sebastian
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#6

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 14:01
Danke für die bisherigen Antworten. Leider kommt keine der Lösungen in Frage, da meine Prozeduren im Unit-Kopf deklariert sind und nicht "lose" rumliegen.

Kleine aber wichtige Info: meine Prozeduren sind im Unit-Kopf in einer Klasse deklariert.

Delphi-Quellcode:
unit uTest;

interface

uses ... ;

type
 TFunc = procedure(Parameter ...);

type
 TWorkerThread = class(TThread)
 private
  aFunc: TFunc;
  procedure meineProzedur1(Parameter ...);
  procedure meineProzedur2(Parameter ...);
  procedure meineProzedur3(Parameter ...);
 // ...
end;

implementation

procedure TWorkerThread.meineProzedur1(Parameter ...);
begin
end;

procedure TWorkerThread.meineProzedur2(Parameter ...);
begin
end;

procedure TWorkerThread.meineProzedur3(Parameter ...);
begin
end;

procedure TWorkerThread.Execute;
begin
 aFunc := TWorkerThread.meineProzedur2; // <= geht nicht
end;

Geändert von a.def (17. Jan 2017 um 14:05 Uhr)
  Mit Zitat antworten Zitat
SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 14:06
Du kannst bei Anonymen Methoden sowohl "lose" (inline) als auch deklarierte Methoden (function Func1...) zuweisen (dachte das ist in meinem Beispiel ersichtlich).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Prozedur einer Variablen zuweisen

  Alt 17. Jan 2017, 14:07
"Lose" heißt doch, dass sie in der Unit rumliegen.
Also entweder im Interface oder nur in der Implementation.

procedure ist für "lose" Prozeduren/Funktionen, die nicht als Methoden in einem Object/Record liegen.

procedure of object ist für Methoden und Klassen-Methoden in Objekten.

reference to procedure ist ein generisches Interface, was alle möglichen Referenzen speichern kann,
also zu Prozeduren/Funktionen, zu Methoden (in Objekten), zu anonymen Methoden und zu Inline-Prozeduren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Jan 2017 um 14:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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