AGB  ·  Datenschutz  ·  Impressum  







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

Procedure als Parameter übergeben

Ein Thema von SleepyMaster · begonnen am 5. Jan 2004 · letzter Beitrag vom 24. Sep 2013
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Procedure als Parameter übergeben

  Alt 10. Nov 2011, 18:23
Steht doch weiter oben (Methodenzeiger).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#12

AW: Procedure als Parameter übergeben

  Alt 24. Sep 2013, 09:15
Ich weiß das Thema ist schon etwas älter, aber meine Frage ist eine Weiterführung von diesem hier. Da wollte ich keinen neuen anfangen.

Nun zur Frage.

Ich habe ein Aktivformular. An das übergebe ich eine Prozedur als Property. Diese wird in ShowModal aufgerufen. Der einzige Nachteil an diesem Vorgehen, die Prozedur muß Parameterlos, bzw. die Parameter haben die ich in der Deklaration angegeben habe, besitzen.
Kann ich als Property eine Anonyme Prozedur angeben?

Hier was ich bisher habe (nur die wesentlichen Teile):
Delphi-Quellcode:
  TCallProc = procedure of object;
  TCallFunc = function: string of object;

  TWorkerThread = class(TThread)
    procedure Execute; override;
  private
    FCallProc: TCallProc;
    procedure SetCallProc(const Value: TCallProc);
  public
    property CallProc : TCallProc read FCallProc write SetCallProc;
  end;


  TAktivForm = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
  public
    property CallProc : TCallProc read FCallProc write SetCallProc;
  end;

procedure TAktivForm.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TAktivForm.WmAfterShow(var Msg: TMessage);
begin
  Thread := TWorkerThread.Create(True);
  Thread.FreeOnTerminate := True;
  Thread.CallProc := FCallProc;
  Thread.Start;

  while (not Thread.Terminated) do
  begin
    Application.ProcessMessages;
    Sleep(50);
  end;

  Close;
end;

...

  AktivForm := TAktivForm.Create(Self);
  AktivForm.CallProc := Run;
  AktivForm.lblText.Caption := rcDatenabfrage;
  AktivForm.ShowModal;
Im wesentlichen wird an die Form eine Prozedur übergeben, die bei OnShow ausgeführt wird und am Ende wird das Formular geschlossen.
Nochmal:
Nachteil, die Prozedur "Run" muß so aussehen wie TCallProc definiert ist.

Jetzt habe ich versucht:
  TCallProc = reference to procedure[(parameterlist)]; Aber da damit geht es nicht:
E2010 Inkompatible Typen: 'TCallProc' und 'Procedure of object'

Kann man das irgendwie machen oder eher nicht?

David
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Procedure als Parameter übergeben

  Alt 24. Sep 2013, 09:31
Ich denke nicht, dass das geht.

Definiere dorch einfach die in Frage kommenden Prozeduren und prüfe, ob eine davon zugewiesen ist.

Ansonsten könntest Du den Weg über die RTTI gehen. Dann weist Du einen Text zu, ermittelst die passende Methode und rufst diese auf (Invoke).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#14

AW: Procedure als Parameter übergeben

  Alt 24. Sep 2013, 11:05
Zitat:
Der einzige Nachteil an diesem Vorgehen, die Prozedur muß Parameterlos, bzw. die Parameter haben die ich in der Deklaration angegeben habe, besitzen.
Das trifft auch 1 zu 1 auf Anonyme Methoden zu.

Mal anders formuliert: Du suchst sowas wie Typenlosen-Methoden-Aufruf? Das gibt es in Delphi meines Wissens nach nicht. Dann müsste ja klar definiert sein, was passiert, wenn man die Methode aufruft ohne z.b. ein nicht Default Parameter übergeben zu haben?

Es gilt immer:

Zitat:
Zwei prozedurale Typen sind kompatibel, wenn sie folgende Bedingungen erfüllen:
Sie verwenden dieselbe Aufrufkonvention.
Sie haben denselben (oder keinen) Rückgabetyp.
Sie verwenden die gleiche Anzahl Parameter identischen Typs an den entsprechenden Positionen (die Parameternamen sind nicht von Bedeutung).
Was du machen kannst:

Delphi-Quellcode:
type
  Test = procedure(i : integer);
  procedure proc(i : integer);

procedure proc(i : integer);
begin
  ShowMessage(IntToStr(i));
end;



var
  myPointer : Pointer;
begin
  myPointer := @proc;

  if (myPointer = @proc) then
    Test(myPointer)(10);
end;

Bei procedure of Object kannst du mit TMethod(proc).Code den Pointer überprüfen.

Lass mich hören falls es was neues gibt, Grüße
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Procedure als Parameter übergeben

  Alt 24. Sep 2013, 11:33
Jetzt habe ich versucht:
  TCallProc = reference to procedure[(parameterlist)]; Aber da damit geht es nicht:
E2010 Inkompatible Typen: 'TCallProc' und 'Procedure of object'

Mir ist nicht ganz klar, was bei der Definition von TCallProc jetzt wirklich gemeint ist. Grundsätzlich kann man einem Property vom Typ reference to procedure auch eine parameterlose Klassenmethode zuweisen. Wichtig ist nur, daß die Signatur der Parameter passt.
Delphi-Quellcode:
type
  { geht beides }
  TCallProc = TProc;
  TCallFunc = TFunc<string>;
// TCallFunc = function: string of object;
// TCallProc = procedure of object;

type
  TForm158 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FCallFunc: TCallFunc;
    FCallProc: TCallProc;
    function TestFunc: string;
    procedure TestProc;
  public
    property CallFunc: TCallFunc read FCallFunc write FCallFunc;
    property CallProc: TCallProc read FCallProc write FCallProc;
  end;

procedure TForm158.FormCreate(Sender: TObject);
begin
  CallProc := TestProc;
  CallFunc := TestFunc;
end;

function TForm158.TestFunc: string;
begin
  Result := 'Hallo Welt';
end;

procedure TForm158.TestProc;
begin
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:22 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