AGB  ·  Datenschutz  ·  Impressum  







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

Pointer auf Prozeduren

Ein Thema von MaOfDe · begonnen am 29. Mär 2005 · letzter Beitrag vom 29. Mär 2005
Antwort Antwort
Seite 1 von 2  1 2      
MaOfDe

Registriert seit: 3. Jan 2004
Ort: Berlin
73 Beiträge
 
Delphi 6 Personal
 
#1

Pointer auf Prozeduren

  Alt 29. Mär 2005, 12:32
Hallo!
Stehe grad vor folgenden Problem:
Wir haben eine Klasse A und eine Klasse B gegeben. Von Klasse B erzeugen wir jedoch mehrere Instanzen, welche alle in den Arbeitsablauf einer Instanz der Klasse A integriert werden sollen.
Ich hab mir dazu überlegt, dass man einfach die zu integrierenden Methoden von Klasse B als Pointer in einer Liste von Klasse A speichert. Klasse A könnte dann einfach die Liste durchgehen und die Methoden aufrufen.
Es ist nicht so, dass ich auch andere Wege wüsste ^^, aber mich würde mal interessieren, wie das geht, schließlich macht man das auch irgendwie so bei einem dynamischen Funktionsaufruf einer DLL...
Habs schon mal versucht, aber ich bekomm leider das speichern der Prozeduren-Zeiger nicht hin ...
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 12:47
Moin!

Wieso merkst du dir nicht einfach alle Instanzen von Klasse B in Klasse A in einer TObjectList. Klasse A sollte dazu z.b. im Konstruktor einfach Klasse B aufrufen und ihr Self übergeben, damit Klasse A die TObjectList füllen kann. Wenn du nun eine Methode in allen Instanzen von Klasse B nacheinander aufrufen willst, dann laufe über alle Einträge in der TObjectList und rufe die Methode auf.

Instanzenvariablen sind intern schon Zeiger. Die TObjectList hat somit Referenzen auf die Klasseninstanzen - somit brauchst du keine Zeiger mehr auf die einzelnen Methoden.

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 12:48
Delphi-Quellcode:
type tproctype = procedure (e:integer);

procedure a(w:integer);
begin

end;

procedure TForm1.Button1Click(Sender: TObject);
 var e:pointer;
begin
 e := @a;
 tproctype(e)(2);
end;
Oder du benutzst TList
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 12:51
Moin!

Das ist dann aber ein Procedurezeiger und kein Methodenzeiger....

Somit wär's ein Methodenzeiger:
Delphi-Quellcode:
type tproctype = procedure (e:integer) of object;

procedure TForm1.a(w:integer);
begin

end;

procedure TForm1.Button1Click(Sender: TObject);
var e:tproctype;
begin
e := a;
e(2);
end;
MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 12:53
Richtig. Ein Fehler von mir.
Delphi-Quellcode:
type tproctype = procedure (Sender:TObject);

procedure a(Sender:TObject);
begin
 ShowMessage('Klick');
end;

procedure TForm1.Button1Click(Sender: TObject);
 var e:pointer;
     m : TMethod;
begin
 m.Code := @a;
 m.Data := self;
 OnClick := TNotifyEvent(m);
 e := @a;
end;
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
MaOfDe

Registriert seit: 3. Jan 2004
Ort: Berlin
73 Beiträge
 
Delphi 6 Personal
 
#6

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 13:16
@sniper_w:
Wie gesagt, andere Wege sind mir bekannt, aber ich wähle diesen, weil er irgendwie Klasse hat *g*.

Bei mir siehts zurzeit so aus:
Code:
type
  TProc = procedure;
...
constructor TKlasseB.Create(A: TKlasseA);
  var P: TProc;
begin
  P:=Self.Proc;
  A.List.Add(@P);
end;

procedure TKlasseB.Proc;
begin
  //bla
end;

...

procedure TKlasseA.Abarbeiten;
  var I: Integer;
begin
  for I := 0 to List.Count-1 do TProc(List[I]^);
  //hier kommt ne hübsche EAccessViolation
end;
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 13:18
Zitat von MaOfDe:
Wie gesagt, andere Wege sind mir bekannt, aber ich wähle diesen, weil er irgendwie Klasse hat *g*.
Kein Kommentar

Ändere mal folgendes
Code:
type
  [s]TProc = procedure;[/s]
  TProc = procedure of object;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
MaOfDe

Registriert seit: 3. Jan 2004
Ort: Berlin
73 Beiträge
 
Delphi 6 Personal
 
#8

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 13:20
Zitat:
Code:
type
  TProc = procedure;
  TProc = procedure of object;
sry klappt auch nicht.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 13:21
Zitat von MaOfDe:
sry klappt auch nicht.
Stimmt, weil die Objekt-Referenz bereits nicht mehr gegeben ist Mache es also doch lieber nach Standard OOP Ansätzen wie oben beschrieben

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Pointer auf Prozeduren

  Alt 29. Mär 2005, 13:30
TProc(List[I]^) Falsch, es wird nicht dereferenziert und es fehlt der implizite Self Parameter.

Nimm den OOP Ansatz, der macht das alles für dich automatisch, typsicher, ohne manuelle Zeigerarithmetik, ist genauso effizient und gerade für Anfänger besser geeignet. Besonders der Punkt der zeitlichen Gültigkeiten der verlinkten Methoden kannst du über die Object Liste viel besser erschlagen.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:12 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