Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#25

Re: Pokerprojekt realisierung

  Alt 3. Apr 2007, 20:54
Zitat von .chicken:

Ich dachte jetzt eigentlich, dass ich vielleicht irgendwie sowas schreiben kann:
Delphi-Quellcode:
  MyEvent: Procedure (Sender: TObject) of Object; //richtig so? :D

  Server.onClientRead := MyEvent;
Hoppla, da ist einiges durcheinander geraten.
MyEvent: Procedure... ist ganz schlecht! Der Doppelpunkt legt den Typ einer Variable fest. Dieser kann nicht einfach vom Typ procedure... sein, das würde zu einem Problem führen, dass ich nicht näher erläutern möchte. Einfach gesagt würden zwei Variablen mit diesem Typ nie kompatibel sein, da Delphi keinen einheitlichen Typen annehmen würde (wie gesagt, egal).
Du müsstest erst einen Datentypen erzeugen:
Delphi-Quellcode:
type
  TMyEvent = procedure(Sender: TObject) of Object;
Dann kannst Du Variablen von diesem Typen erstellen:
Delphi-Quellcode:
var
  variable: TMyEvent;
Ich hoffe Du siehst den Unterschied, so wie die nötigen Schlüsselwörter. An sich sollte jeder Datentyp auch ein Präfix (T für Typen, P für Zeiger) enthalten. Methodenzeiger bekommen ein T, da es sich um Referenzen handelt. Nur explizite Zeiger (Datentyp Pointer oder Dinge mit ^ wie ^Integer, ^Byte, ...) bekommen ein P vorgesetzt!
Damit ist immer klar, wann Du einen Typen meinst und wann eine Methode/Variable oder sonst was.

Wichtig ist aber auch hier, dass Du die zwei Seiten (Observable und Observer) unterscheidest. Die Benachrichtigung wird bereits durch TServerSocket ausgelöst. Das heißt, TServerSocket ist bereits ein fertiger Observer. Was noch fehlt ist die Methode, die benachrichtigt werden soll, also der Observer.
Welche Signatur die Methode haben muss kannst Du der OH entnehmen, dort unter Ereignisse findest Du das OnClientRead-Event und dessen Datentyp. Folgst Du dem, so siehst Du welche Argumente (z.B. Sender: TObject bei einem TNotifyEvent) Du übergeben musst. Ich gehe mal davon aus, dass Du da schon nachgeschaut hast und es sich hier um eine Methode handelt, die ein Argument von TObject bekommt.

Streich die beiden Zeilen, die ich oben gepostet habe und dann stimmt auch der Anfang
Delphi-Quellcode:
  procedure TForm1.MyEvent(Sender:TObject);
  begin
    blablabla;
  end;
Das kannst Du so stehen lassen, da ist alles korrekt. Was Du nun hast sind beide Seiten, TServerSocket bietet eine Möglichkeit jmd. zu benachrichtigen und TForm1 hat eine Methode, die benachrichtigt werden kann (TForm1.MyEvent). Was noch fehlt ist das Verknüpfen/Registrieren, so dass TServerSocket weiß, dass TForm1.MyEvent zurück gerufen werden soll.
Ok, jetzt wird mir klar was Du mit der Zeile meintest:
server.onClientRead := MyEvent; Wobei Server eine Instanz von TServer sein muss und MyEvent eben die Methode von TForm1 (also die Zuweisung in einer Methode von TForm1 aufgerufen wird). Hier käme z.B. das OnFormCreate in Frage (wenn Server bereits erstellt wurde).

Hier noch eine Bitte, bei solchen Zeilen wäre es immer schön, wenn Du ein wenig den Kontext angeben würdest. Wie Du gesehen hast ist (mir) hier nicht klar, was für einen Typ Server hat (usw.).
  Mit Zitat antworten Zitat