Und wiedermal eine Frage an die alten Hasen.
Ich bin nun dabei mein Projekt etwas auszubauen, und dachte mir, dass es doch ganz schön wäre, nen Eventhandler zu baun.
Das ganze soll am ende folgendermaßen funktionieren:
Ich habe eine Klasse zb TEventObject, die schon alle wichtigen Events mitliefert (Onactive, Ondestroy, onmouseup, -move, -down, onkeypressed, usw. usw.)
Dann leite ich davon zb ein Object TMyButton ab, und dann kann ich von da an die Events MyButton.OnMouseDown abfragen. Praktisch genauso, wie es die Delphiumgebung bietet, eben nur für ein GUI
Da ich leider 0 ahnung habe, wie man an so etwas am besten herangeht, wäre es sehr nett, wenn da mal irgendwer nen link zu nem tut (glaube allerdings nicht, dass es sowas ueberhaupt gibt) schicken könnt, oder eine kurze Zusammenfassung, wie man da beginnt, oder ein paar codesegmente, falls ihr selber sowas schon gemacht habt, oder oder oder
Ich habe mir mal den Eventhandler von XD angesehen und der is mir doch etwas zu komplex, als dass ich den Punkt bestimmen könnte, wo ich starten müsste ^^
Vllt hat ja wer von euch ideen
Danke schonma im voraus
Wie Du das aufbaust, ist allein Deine Sache: Du kannst in dem "AKeyDownData" alles mitgeben, was Du Dir wünscht, Du musst Dir nur klar sein, dass Du damit eine Art "Standard" für dein Programm definierst: Auch der Benutzer Deiner GUI muss sich dran halten (so wie in Delphi, die automatisch erzeugten Eventhandler). In das "AKeyDownData" packst Du einfach das, was Du brauchst, also bei KeyDown den TastenCode, den Shiftstatus und so weiter.
Ob das FOnKeyDown eine private Variable ist, die in ein Property verpackt ist, oder einfach eine public Variable, die man einfach so von außen ändern kann, hängt einfach nur von Dir und Deinen Wünschen ab (die published Properties braucht man für den Objekt-Inspektor).
Das Programm, das Deine GUI benutzen möchte, "stöpselt" dann seine Methode, die er anlässlich eines Tastendrucks ausführen möchte, an Deinen Methodenzeiger dran. Angenommen, wir gehen den leichtesten Weg und implementieren das FOnKeyDown als Public Variable, dann sieht das so aus:
Code:
MyEventObject:= TEventObject.Create;
MyEventObject.FOnKeyDown:= MyOwnEventHandler;
In Deinem Hauptprogramm musst Du dann eine Eventhandler-METHODE einrichten, die sich nach dem Standard "TKeyDownEventMethod" richten muss:
1) Benutzerereignis abfangen (wie auch immer, ich machs mit SDL)
2) Anschauen, was man gefangen hat, Daten aufbereiten und in "AKeyDownData" stopfen
3) Wenns z.B. ein KeyDown ist: TEventObject.Event_OnKeyDown(AKeyDownData: TKeyDownData) aufrufen
4) Jetzt hat das TEventObject.Event_OnKeyDown Gelegenheit, was Eigenes zu tun, zeichnen zum Beispiel
5) Am Ende der Methode Event_OnKeyDown musst Du das TEventObject.FOnKeyDown(AKeyDownData) aufrufen, damit rufst Du EIGENTLICH den Eventhandler des Hauptprogramms auf, denn jetzt ist er dran.
Das Event fährt (sozusagen wie ein Blitz) in Dein TEventObject und direkt durch den Methodenzeiger FOnKeyDown in die Methode MyOwnEventhandler des Hauptprogramms.
Das TEventObject dient sozusagen als "Datenleitung".
Hi Danke ma fuer eure Antworten. Ich habe mir nochma die XDEngine angesehen und versucht, das was dort drinnen stand, zu verstehen und umzusetzen.
Ich verfahre nun so, wie es Traude in etwa beschrieben hat.
Code:
constructor TEventManager.Create;
begin
inherited;
LIdle := TList.Create;
LQuit := TList.Create;
LActive := TList.Create;
LKeyDown := TList.Create;
LKeyUp := TList.Create;
LMouseDown := TList.Create;
LMouseUp := TList.Create;
LMouseMove := TList.Create;
LResize := TList.Create;
LRedraw := TList.Create;
end;
Hier erstelle ich die Listen, in denen alle Events registriert werden.
Ein button, der ein OnClick bekommen soll, wird per AddMouseDown in die LMouseDown eingefuegt.
Hier mal ein Beispiel, wie ich die Geschichte benutze:
Und da Tritt in der OnIdle := Onidle zeile schon ein Fehler auf. Die Konsole meldet ein EAccessViolation nur erstellt sind die Listen im Grunde ja vorher schon, durch das Create des Eventmanagers. Der Eventmanager wird hierbei im Create von TTEst mit aufgerufen:
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo Shaddow,
Code:
with Events do
begin
OnIdle := OnIdle;
OnQuit := OnQuit;
...
End;
Ich verstehe nicht ganz was der dieser Code macht. Was sind die Variablen "Events", "OnIdle", etc. genau? Denn es sieht mir nicht aus, als ob Du mit der Anweisung
Code:
With Events Do OnIdle := OnIdle;
etwas zuweist, sondern Du weist der Variable "OnIdle" wieder den Inhalt der Variable "OnIdle" zu. Und wenn vorher nichts drin war ist auch nacher nichts drin.
Traude
Jop das war einer der Fehler. Inzwischen gehts bei mir
Das Prob war, dass Onidle ne Procedure ist und Events.Onidle eine Variable/Zeiger auf eine Procedur.
Weil ich Events ncih dauernd davor schreiben wollte, hab ichs mitm With do gemacht, aber dabei vergessen, dass
Code:
with Events do
Onidle := OnIdle
end;
das selbe ist wie
Code:
Events.OnIdle:= Events.OnIdle
Ich wollte aber
Code:
Events.Onidle:= OnIdle haben.
So hab ichs geschrieben und nach der Ausmerzung der restlichen fehler gehts nun ^^
Das KeyDown event des SDL_pollEvent ruft dann folgendes auf:
Code:
procedure OnKeyDown (Key :Word);
var i :Integer;
test : PeventData;
proc : pObjProcedureKeyPress;
begin
ifnotAssigned(EventManager.LKeyDown)then
begin
raise TSE_EventManagerFail.Create('LKeyDown not Assigned');
Exit;
end;
with EventManager.LKeyDowndo
begin
writeLn('>>>>'+inttostr(count-1));
for i :=0to Count-1do
begin
test := Items[i];
ifnotAssigned(pEventData(test).Obj)then
begin
WriteLn('1');
pProcedureKeyPress(pEvenTData(test).P)(Key);
end
else
begin
WriteLn('2');
TMethod(proc).Data:= pEvenTData(test).Obj;
TMethod(proc).Code:= pEvenTData(test).P;
proc(key);
end;
end;
// pProcedureKeyPress(Items[i])(Key);
end;
end;
Die Writelns usw. dazwischen sind nur zum debuggen gedacht.
naja das prob ist einfach, dass das ganze zwar bei einer procedure, die cih registriere (wo obj beim Adden also nil ist), super geht nur bei einer klasse kommt dauernd beim registrieren ein fehler
Bsp:
Code:
EM.AddKeyDown(@ww,camera);
Camera ist halt das objekt und es kommt dauernd der fehler:
Variable erforderlich..
ka was das soll
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo Shaddow,
ich kann Dein Problem nicht nachvollziehen. Kann kein CompilerFehler sein, denn bei mir gehts durch. Dann ist das ein Laufzeitfehler? Und bei welcher Zeile stürzt er ab?
Traude
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Ach so.
Du möchtest die Kamera im EventHandler registrieren und machst das im Constructor der Kamera. Du musst bedenken, was das heißt:
Der Kamera-Konstruktor kennt Deine Instanz "camera" ja gar nicht. Wo soll er die hernehmen? Du müsstest im Kamera-Konstruktor bei der Methode "EM.AddKeyDown (@ww,camera); " statt "camera" zumindest "Self" eintragen. Aber ich bin mir gar nicht sicher, ob das funktioniert, denn ich glaube die Variable TCamera.Self existiert erst, NACHDEM der Konstructor TCamera.Create fertig ist. Aber da bin ich mir, wie gesagt, nicht sicher
Traude
In der definierenden Deklaration einer Klassenmethode kann mit dem Bezeichner Self auf die Klasse zugegriffen werden, in der die Methode aufgerufen wird
Das heisst es sollte funktionieren, wenn Du bloss "camera" durch "Self" ersetzt.
Zuletzt geändert von Traude am Do Dez 28, 2006 15:49, insgesamt 1-mal geändert.
der fehler wurde nun in form einer art gemeinschaftsarbeit geloest:
EventManager.AddKeyDown (@TSE_Camera.ww,Self);
das tse_camera hat gefehlt obwohl ich das eigentlich scho getestet hatte ^^ vllt war da ein anderer feholer dabei
//EventManager.AddKeyDown (@ww,camera); // geht nicht
//EventManager.AddKeyDown (abc,camera); // geht nicht
EventManager.AddKeyDown(MyPointer,camera);// das geht
end;
Der Frage, warum er hier eine Variable "camera" kennt, bin ich nicht weiter nachgegangen, aber er kennt sie.
Er wollte beim kompilieren hier einen untypisierten Pointer haben. Und offensichtlich ist ein Prozedurzeiger was anderes als ein untypisierter Pointer. Aber Achtung: ein Ein Prozedurzeiger ist auch was anderes als ein Methodenzeiger. Delphi ist hier stur bei den übergebenen Parametertypen.
Traude
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.