Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Konzeptfrage zu Problem Methodenzeiger vs. reguläre Procedur (https://www.delphipraxis.net/141645-konzeptfrage-zu-problem-methodenzeiger-vs-regulaere-procedur.html)

BAMatze 13. Okt 2009 09:34


Konzeptfrage zu Problem Methodenzeiger vs. reguläre Procedur
 
Hallo und guten Tag an alle DP´ler,

Wollte mal eine Frage stellen zu einem Eventhandling, was ich probiert habe, welches aber so anscheinend (noch) nicht funktioniert. Ich wollte in einer Procedure einen Thread öffnen, diesen abarbeiten und dann über ein Event schließen. Da dies nirgendswo anders benötigt wird, habe ich mal folgende Struktur ausprobiert:

Delphi-Quellcode:
procedure TForm2.Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
var TempList: TMesswertpacket;
  procedure GetMesswertList(Sender: TObject; List: TStringList);
    begin
      try
        TempList.FsLMesswertListe.Assign(List);
      finally
        FMessThread.Free;
      end;
    end;
begin
// in der Messung sollen iMessreihen * iMesswerte an Messpunkten aufgenommen, um
// diese später statistisch auszuwerten.
// Dafür Mesthread erstellen, der in regelmäßigen Abständen die entsprechende Anzahl
// an Messwerten aufnimmt.
  FMessThread := TMessThread.create((iMessreihen * iMesswerte), iMessabstand);
  try
    FMessThread.OnMessWertListcompleted := GetMessWertList;
    FMessThread.WaitFor;
    TempList.Messwertreihen := iMessreihen;
    TempList.Messwertanzahl := iMesswerte;
    // weitere Aufrufe, die die TempList an eine andere Funktion schicken
  except
    FMessThread.Free;
  end;
end;
Ich weiß, wenn ich die GetMesswertList in die Funktionsliste der TForm2 aufnehme, bekomme ich das ohne Probleme hin, wollte es aber in sich verschachteln, da die GetMesswertList-Procedure eh nirgendswo anders Verwendung findet. Kann man das in irgendeiner Form so zum Laufen bringen (derzeit bekomme ich immer Fehlermeldung, wegen regulärer Funktion und Methodenzeiger)?

Vielen Dank im Voraus
BAMatze

Ps.: das Event wird erst nach einem Schleifenaufruf (for-Schleife) und somit nach Ermittlung ALLER Messwerte ausgelöst.

mkinzler 13. Okt 2009 09:38

Re: Konzeptfrage zu Problem Methodenzeiger vs. reguläre Proc
 
Rufe die Prozedur/Funktion in der Methode auf

BAMatze 13. Okt 2009 09:41

Re: Konzeptfrage zu Problem Methodenzeiger vs. reguläre Proc
 
Zitat:

Zitat von mkinzler
Rufe die Prozedur/Funktion in der Methode auf

Jetzt muss ich doch mal kurz fragen, wie du das meinst. Procedure/ Funktion ist klar, sollte meine GetMesswertList-Procedure sein aber welche Methode meinst du?

sirius 13. Okt 2009 09:51

Re: Konzeptfrage zu Problem Methodenzeiger vs. reguläre Proc
 
Ich würde bezweifeln, dass es irgendwie geht eine nested function so aufzurufen. Wie soll er aus der nested function dann die lokale Variable Templist finden. Er weiß doch gar nicht, wo er sich gerade im Stack befindet.

Edit: Ja Wahnsinn. Bei D7 geht das sogar durch den Compiler. Liefert aber, wie erwartet, totalen Unfug. Na den kann man ja lange suchen.
Delphi-Quellcode:
type TProc=procedure;

procedure Foo(proc:TProc);
var s:String;
begin
  s:='Test'; //nur damit der Stack auch etwas "durcheinander" kommt.
  Proc;
  showmessage(s); //..und damit die CodeOptimierung mir das s nicht rausschmeißt
end;

procedure TForm1.Button1Click(Sender: TObject);
var x:Integer;
 procedure test;
 begin
   showmessage(inttostr(x));
 end;
begin
  x:=5;
  test;
  Foo(@test);
end;

BAMatze 13. Okt 2009 10:23

Re: Konzeptfrage zu Problem Methodenzeiger vs. reguläre Proc
 
Zitat:

Zitat von sirius
Ich würde bezweifeln, dass es irgendwie geht eine nested function so aufzurufen. Wie soll er aus der nested function dann die lokale Variable Templist finden. Er weiß doch gar nicht, wo er sich gerade im Stack befindet.

Edit: Ja Wahnsinn. Bei D7 geht das sogar durch den Compiler. Liefert aber, wie erwartet, totalen Unfug. Na den kann man ja lange suchen.
Delphi-Quellcode:
type TProc=procedure;

procedure Foo(proc:TProc);
var s:String;
begin
  s:='Test'; //nur damit der Stack auch etwas "durcheinander" kommt.
  Proc;
  showmessage(s); //..und damit die CodeOptimierung mir das s nicht rausschmeißt
end;

procedure TForm1.Button1Click(Sender: TObject);
var x:Integer;
 procedure test;
 begin
   showmessage(inttostr(x));
 end;
begin
  x:=5;
  test;
  Foo(@test);
end;

Ok Antwort ist also nein für alle Versionen, denke ich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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