Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi prozedurvariable (https://www.delphipraxis.net/6203-prozedurvariable.html)

clownxx 3. Jul 2003 12:19


prozedurvariable
 
Hallo, kann mir mal jemand erklären, was eine Prozedurvariable ist und wozu ich sie verwende?? Danke

sakura 3. Jul 2003 12:25

Also Prozedurvariable ist nicht gerade ein Fachausdruck, von daher kann ich nur mutmaßen, was gemeint ist. Ich denke mal, dass eine lokale Variabel, deren Scope nur innerhal einer Prozedur gültig ist. Diese Variablen werden ganz normal zur Berechnung von Daten herangezogen.
Delphi-Quellcode:
var
  GlobaleVariabel: Integer;
....

procedure TueWas;
var
  ProzedurVariabel: Integer; // (*) Wahrscheinlich ist die gemeint.
begin
  ....
  ProzedurVariabel := WeissIchWas * 3005 div GlobaleVariabel;
  ....
end;
...:cat:...

clownxx 3. Jul 2003 12:34

also die Definition lautet wie folgt:

Delphi-Quellcode:
var
  status: procedure(Status: Integer; Text: PChar);
nur was kann ich dann damit anfangen??

[Edit=Sakura]Delphi-TAGs gesetzt[/Edit]

Hansa 3. Jul 2003 12:39

Du meinst wahrscheinlich "prozedurale Parameter". Die habe ich allerdings noch nie gebraucht. Ich schreibe das aber jetzt eigentlich deshalb, weil Du die Prozedur status nennst und dann noch einen Parameter namens Status hast. Meckert Delphi da nicht ?

clownxx 3. Jul 2003 12:42

soryy, tipfehler, es muss heißen:

Delphi-Quellcode:
var
  status: procedure(Status_wert: Integer; Text: PChar);
[Edit=Sakura]BITTE selbst die Delphi-TAGs setzen! MfG[/edit]

sakura 3. Jul 2003 12:49

Ah ja ;-) So nennen wir die heute :lol:

Also es geht um Prozedurale Typen; hier mal ein Auszug aus dem Delphi Language Guide
Zitat:

Prozeduren und Funktionen können als Wert betrachtet und einer Variablen zuge-wiesen werden, so dass sie sich als Parameter übergeben lassen. Dieses Verfahren wird durch sogenannte prozedurale Typen ermöglicht. Nehmen wir an, Sie definieren eine Funktion mit dem Namen Calc, die zwei Integer-Parameter übernimmt und einen Integer-Wert zurückgibt:

function Calc(X,Y: Integer): Integer;

Sie können die Calc-Funktion nun der Variablen F zuweisen:

var F: function(X,Y: Integer): Integer;
F := Calc;

Wenn Sie im Kopf einer Prozedur oder Funktion den Bezeichner nach dem Wort procedure bzw. function entfernen, erhalten Sie den Namen eines prozeduralen Typs.
Dieser Typname kann direkt in einer Variablendeklaration (siehe oben) verwendet oder zur Deklaration neuer Typen benutzt werden:
Delphi-Quellcode:
type
TIntegerFunction = function: Integer;
TProcedure = procedure;
TStrProc = procedure(const S: string);
TMathFunc = function(X: Double): Double;
var
F: TIntegerFunction; { F ist eine parameterlose Funktion, die einen Integer zurückgibt }
Proc: TProcedure; { Proc ist eine parameterlose Prozedur }
SP: TStrProc; { SP ist eine Prozedur, die einen String-Parameter übernimmt }
M: TMathFunc; { M ist eine Funktion, die einen Double-Parameter (reeller Wert) übernimmt und einen Double-Wert zurückgibt }
procedure FuncProc(P: TIntegerFunction); { FuncProc ist eine Prozedur, deren einziger Parameter eine parameterlose Funktion ist, die einen Integer zurückgibt }
Alle oben aufgeführten Variablen sind sogenannte Prozedurenzeiger, also Zeiger auf
die Adresse einer Prozedur oder Funktion.

clownxx 3. Jul 2003 13:56

soweit habe ich das Beispiel verstanden, aber:
f ist also ein eigener Typ, der eine Funktion übernehmen darf!
das hat bei mir dann in delphi auch funktioniert, bis auf die zuweisung:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
f: function(a,b:integer): integer;
begin
f:= plus;
end;
Fehler: Inkompatible Typen Prozedure und Methodenzeiger!

davon mal abgesehen, was bringt mir das in der Praxis, wenn ich einer Variablen eine Prozedure zuweisen kann??

Gibt es dafür nicht mal ein Codebeispiel um das zu veranschaulichen??

Danke

[Edit=Sakura]:warn: Das waren jetzt das dritte Mal, daß ich Deine Delphi-TAGS setzten musste. :twisted:[/Edit]

sakura 3. Jul 2003 13:58

Wie ist die Funktion Plus definiert?

...:cat:...

:warn: NUTZE DIE DELPHI TAGS!!!

clownxx 3. Jul 2003 14:09

Die Prozedure plus ist definiert:

Delphi-Quellcode:
Procedure plus(x,c: integer): integer;
begin
result:=x+c;
end;

sakura 3. Jul 2003 14:11

Na dann ändere mal. Eine Prozedure kann keinen Rückgabewert haben.

Code:
[color=#ff0000]function[/color] plus(x,c: integer): integer;
begin
  result:=x+c;
end;
...:cat:...

P.S. Danke für die Nutzung der DELPHI-Tags. :spin:

clownxx 3. Jul 2003 14:13

sorry, das war ein Tipfehler, ich hab das schon so! Aber der Fehler ist immer noch

sakura 3. Jul 2003 14:20

Also folgender Code wird bei mir problemlos kompiliert und ausgeführt.
Delphi-Quellcode:
function Plus(X, C: Integer): Integer;
begin
  Result := X + C;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  F: function(A, B: Integer): Integer;
begin
  F := Plus;
  ShowMessage(IntToStr(F(1, 2)));
end;
...:cat:...

Sanchez 3. Jul 2003 14:45

Bei clownx hat die Funktion Plus keine Parameter erhalten

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var
    f: function(a,b:integer): integer;
begin
   f:= plus;
end;
Plus erwartet aber 2 integervariablen

mfg Daniel

sakura 3. Jul 2003 14:54

@Sanchez0815: Du sprichst die Zuweisung der Variablen an, da werden keine Parameter angegeben. Siehe auch mal in meinem Code nach ;-)

...:cat:...

Sanchez 3. Jul 2003 17:31

Sorry, hab nur flüchtig gelesen :oops:

mfg Daniel

sakura 3. Jul 2003 22:15

Die Diskussion zum Unterschied zwischen Prozeduren und Funktionen kann hier forgesetzt werden:


In diesem Thread bitte nur zu "Prozedurvariablen" posten.
Danke

SAKURA

...:cat:...

2_daniel 13. Jul 2006 13:54

hi,
bin gerade dabei mit prozeduralen Typen zu "spielen"

in deinem Beispiel ist aber die "plus"-function ist alleinstehen, gehört zu keiner klasse.

Zitat:

Zitat von sakura
Also folgender Code wird bei mir problemlos kompiliert und ausgeführt.
Delphi-Quellcode:
function Plus(X, C: Integer): Integer;
begin
  Result := X + C;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  F: function(A, B: Integer): Integer;
begin
  F := Plus;
  ShowMessage(IntToStr(F(1, 2)));
end;
...:cat:...

ich würde gern was in der richtung machen :
Delphi-Quellcode:
 TForm2 = class(TForm)
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function somefunc : Integer;
Delphi-Quellcode:

 TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
  private
    { Private-Deklarationen }
var
  F, G: function: Integer;
  I: Integer;
....

  f := tform2.somefunc;
  i := f;
..also meiner prozedurale Variable eine Funktion zuweisen die in einem anderen Formular / Klasse defineirt ist....und da meckert delphi immer noch...

in der Delphi Hilfe scheinen alle zusammen zu gehören:
Delphi-Quellcode:
var
  F, G: function: Integer;
  I: Integer;
  function SomeFunction: Integer;
    ...
  F := SomeFunction;   // Zuweisung von SomeFunction an F
  G := F;                // Kopieren von F zu G
  I := G;                // Funktionsaufruf; Zuweisung des Ergebnisses an I
...irgendwelche Tipps wie ich das lösen kann ???

gruss
daniel

Phistev 13. Jul 2006 14:02

Re: prozedurvariable
 
Syntax für Methoden:
Delphi-Quellcode:
var f: function(a,b:integer):integer of object;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 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 by Thomas Breitkreuz