ich muss euch nochmal um Beistand bitten. Ich habe folgendes vor: Ich habe drei Klassen, die ein Spiel realisieren. Diese Klassen sollen möglichst lose gekoppelt sein, daher kommunizieren sie über das Beobachterpattern miteinander (FPOObserver und TPersistent... da hattet ihr mir in einem anderen Thread schon viel geholfen). Natürlich muss ich die Observer über die erfolgten Zustandsänderungen informieren. Dazu habe ich mir Datenklassen gebaut, die folgendermaßen definiert sind:
Code: Alles auswählen
(* Events *)
{ TMinedOutEvent }
TMinedOutEvent = class // parent class
EventType : TMinedOutEventType;
end;
PMinedOutEvent = ^TMinedOutEvent;
{ TPlayerMovedEvent }
TPlayerMovedEvent = class(TMinedOutEvent)
NewPosition : TPos;
function GetData : TPos;
end;
{ TMinesNumberChangedEvent }
TMinesNumberChangedEvent = class(TMinedOutEvent)
NumberOfMines : Integer;
function GetData : Integer;
end; // ... es gibt noch weitere Events...
Code: Alles auswählen
(* inform the Observers about movement *)
FPlayerMovedEvent := TPlayerMovedEvent.Create;
FPlayerMovedEvent.EventType:= moePlayerMoved;
FPlayerMovedEvent.NewPosition := FPlayerPosition;
FPONotifyObservers(self, ooCustom, @FPlayerMovedEvent);
Code: Alles auswählen
procedure TPitch.FPOObservedChanged(ASender: TObject;
Operation: TFPObservedOperation; Data: Pointer);
var
PEvent : PMinedOutEvent absolute Data;
Event : TMinedOutEvent;
begin
if Operation = ooCustom then
begin
if PEvent^.EventType = moeUserActionRequested then
begin
Event := PEvent^ as TUserActionRequestedEvent;
MovePlayer(Event.GetData);
end;
if PEvent^.EventType = moeLevelChanged then
begin
Event := PEvent^ as TLevelChangedEvent;
MakeNewLevel(Event.GetData);
end;
end;
end;
Also mein Problem:minedoutpitch.pas(315,26) Error: identifier idents no member "GetData"
Meine Events leiten alle von einer Basisklasse ab. Sie haben aber unterschiedliche Parameter in den Daten, die sie zurückgeben sollen (mal Integer, mal ein selbstdefiniertes Record usw.). Ich dachte, ich übergebe die Basisklasse. Diese enthält einen Hinweis darauf, was für ein konkretes Event eigentlich gemeint ist und in das caste ich dann. Nur... das mag der Compiler nicht. Wie kann ich sowas realisieren?