![]() |
AW: Procedure als Parameter übergeben
Steht doch weiter oben (Methodenzeiger).
|
AW: Procedure als Parameter übergeben
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:
Im wesentlichen wird an die Form eine Prozedur übergeben, die bei OnShow ausgeführt wird und am Ende wird das Formular geschlossen.
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; Nochmal: Nachteil, die Prozedur "Run" muß so aussehen wie TCallProc definiert ist. Jetzt habe ich versucht:
Delphi-Quellcode:
Aber da damit geht es nicht:
TCallProc = reference to procedure[(parameterlist)];
E2010 Inkompatible Typen: 'TCallProc' und 'Procedure of object' Kann man das irgendwie machen oder eher nicht? David |
AW: Procedure als Parameter übergeben
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). |
AW: Procedure als Parameter übergeben
Zitat:
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:
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
Delphi-Quellcode:
kannst du mit
procedure of Object
Delphi-Quellcode:
den Pointer überprüfen.
TMethod(proc).Code
Lass mich hören falls es was neues gibt, Grüße |
AW: Procedure als Parameter übergeben
Zitat:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 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