AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Anonyme Methoden, Wann,warum, Vorteile
Thema durchsuchen
Ansicht
Themen-Optionen

Anonyme Methoden, Wann,warum, Vorteile

Ein Thema von Alex_ITA01 · begonnen am 29. Sep 2014 · letzter Beitrag vom 30. Sep 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 07:45
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.
Ist das bei einer Prozedur innerhalb einer Methode anders?
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.134 Beiträge
 
Delphi 12 Athens
 
#2

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 07:53
Danke @Stevie. Das muss ich mir erstmal komplett durchlesen

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.049 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 09:09
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.
Ist das bei einer Prozedur innerhalb einer Methode anders?
Ja, denn dort kannst du nur über parameter Informationen übergeben. Variable capturing läuft etwas anders - siehe Closures
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.687 Beiträge
 
Delphi 12 Athens
 
#4

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 09:25
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.
Ist das bei einer Prozedur innerhalb einer Methode anders?
Ja! Nicht, was die Variablen betrifft, aber bei dem Zeitpunkt der Ausführung. Eine lokale Prozedur L innerhalb einer Methode M kann nur innerhalb dieser Methode M aufgerufen werden. Für alles außerhalb von M ist sie schlichtweg nicht sichtbar. Die lokalen Variablen von M sind dann, bei entsprechender Anordnung des Quelltexts, innerhalb von L verfügbar. Eine Anonyme Methode A kann aber auch außerhalb des Kontexts von M aufgerufen werden, in dem sie deklariert wurde. Trotzdem kann sie auf die lokalen Variablen von M zugreifen, obwohl M zu diesem Zeitpunkt schon längst beendet wurde.

Gerne verwendete Beispiele sind sicher die Methoden Synchronize und Queue aus TThread. Diesen kann man entweder parameterlose Methoden (procedure of object) oder eben auch parameterlose Anonyme Methoden mitgeben. Bei den simplen Methoden muss man die eigentlich benötigten Parameter in Felder der abgeleiteten Thread-Klasse stecken (Nein, globale Variablen sind da bei Todesstrafe verboten!). Das mag bei Synchronize noch gehen, da dort der Aufruf, wie der Name vermuten lässt, synchron geschieht. Bei Queue ist das aber nicht so. Da bietet sich eine Anonyme Methode an, die auf eine lokale Variable zugreift.

Hier mal ein typischerweise absolut sinnfreies Beispiel:

Delphi-Quellcode:
program Project36;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections,
  System.Classes;

type
  TMyThread = class(TThread)
  public
    class procedure ExecuteThread;
  end;

  TMyThread1 = class(TMyThread)
  protected
    procedure Execute; override;
  end;

  TMyThread2 = class(TMyThread)
  protected
    procedure Execute; override;
    function MakeAnonMeth(Value: Integer): TThreadProcedure;
  end;

class procedure TMyThread.ExecuteThread;
var
  instance: TMyThread;
begin
  instance := Self.Create;
  try
    instance.WaitFor;
  finally
    instance.Free;
  end;
end;

procedure TMyThread1.Execute;
var
  I: Integer;
  aProc: TThreadProcedure;
begin
  aProc := Procedure
    begin
      Writeln(Format('%d Prozent', [I]));
    end;
  for I := 0 to 100 do begin
    Synchronize(aProc);
  end;
end;

procedure TMyThread2.Execute;
var
  I: Integer;
begin
  for I := 0 to 99 do begin
    Queue(MakeAnonMeth(I));
  end;
  Synchronize(MakeAnonMeth(100));
end;

function TMyThread2.MakeAnonMeth(Value: Integer): TThreadProcedure;
begin
  result := Procedure
    begin
      Writeln(Format('%d Prozent', [Value]));
    end;
end;

begin
  TMyThread1.ExecuteThread;
  TMyThread2.ExecuteThread;
  Readln;
end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 09:47 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