AGB  ·  Datenschutz  ·  Impressum  







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

Ereignisverteilung verstehen

Ein Thema von DualCoreCpu · begonnen am 24. Okt 2009 · letzter Beitrag vom 24. Okt 2009
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

Ereignisverteilung verstehen

  Alt 24. Okt 2009, 10:28
Hallo!

Ich beschäftige mich gerade mit der Verteilung der Ereignisse in einer Anwendung. Irgendwo muss das Ereignis ausgelöst werden. Dann kommt die Verteilung auf die Klassen.

In einem Multitasking Betriebssystem wie Windows wird der jeweiligen Message ein Handle mitgegeben und das Windows API sorgt dafür, das dann nur dasjenige Objekt das Ereignis zu sehen bekommt, für das dieses Ereignis bestimmt ist.

Hätte man aber kein Windows API, wie würde dann womöglich in einem Single Tasking Betriebssystem die Verteilung der Ereignisse aussehen. Ich stelle mir das so vor:

Delphi-Quellcode:
procedure TMyClass.HandleMouse(Sender: TObject; Shift: TShiftstate, X, Y: Integer);
var Index: Integer; Instance: TCustomControl;
begin
  if Index < TCustomControl(Sender).ComponentCount then
  if not TCustomControl(Sender).ContainsMouse(X, Y) then
  begin
   if (TCustomControl(Sender).ComponentCount > 0)
      then inc(Index)
  end
  else
  begin
    //if TCustomControl(Sender).Components[Index].ComponentCount > 0 then
    Instance := TCustomControl(Sender); //Zwischenspeicher, falls Ablauf noch
                                        //nicht richtig.
                                        //Dann kann ich Instance zu
                                        //korrekter Formulierung verw.
    HandleMouse(Sender, Shift, X, Y);
    TCustomControl(Sender).Select;
  end;
end;
Das Mausereignis wird ausgelöst, indem ich z.B. meine linke Maustaste drücke. Nun muss ermittelt werden, welches Objekt voher von mir ausgewählt wurde z.B. welche der angenemmenen 3 Eingabezeilen auf meinem Hauptfenster die folgenden Tastatureigaben erhalten soll.

Wenn nur Eingabezeilen und Buttons auf dem Formular sind, könnte man sequentiell vorgehen. Nun kann aber auch eine Schaltfläche da sein, deren Betätigung einen Dialog erscheinen lässt, auf dem wiederum mehrere Eingabemöglichkeiten vorliegen. AUch dort muss dann die Ereignisverteilung funktionieren. Daher meine rekursive Lösung in meinem Quelltext.

Ist der im obigen Quelltext formulierte Ablauf so richtig?

Ich bin mir mit der Abbruchbedingung nicht sicher. Die Rekursion muss ja aufhören, wenn ich an dem per Tab oder mit der Maus ausgewählten Objekt angekommen bin. Wie formuliere ich das im Quelltext?
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#2

Re: Ereignisverteilung verstehen

  Alt 24. Okt 2009, 10:42
Zitat von DualCoreCpu:
Single Tasking Betriebssystem
Zitat von DualCoreCpu:
Ereignisse
Was denn jetzt?

Eine Routine wie HandleMouse wäre vermutlich eine Funktion zurückgibt ob das Ereignis bearbeitet wurde und deswegen nicht mehr weitergegeben werden muss (TMessage.Result, ..). Der andere Fall ist das da einfach nichts mehr ist was das Ereignis bearbeiten könnte (Parent / Child = nil).
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#3

Re: Ereignisverteilung verstehen

  Alt 24. Okt 2009, 11:39
@Tryer:

WIe bitte soll ich es denn formulieren?
Ich weiß, das Windows ein Multitasking Betriebssystem ist.

Ich will dennoch eine eigene Ereignisverwaltung bauen, ganz egal, ob das beim heutigen Stand der Technik noch sinnvoll ist. Ich will es lernen, ganz einfach. Ich will auch nicht Windows nachentwickeln,obwohl das laut WINE auch schon gemachrt wurde, sogar GPL basiert.

Ich will ganz einfach verstehen, was da hinter den Kulissen abläuft.

Wie zum Beispiel kommt man zu dem Objekt, welches die ankommenden Ereignisse aktuell ankommen sollen?
Ich weiß wirjklich nicht, wie ich das klarer formulieren soll. Gib mal einen Tipp. Gibt es dafür vielleicht einen Fachbegriff? Im Informatikunterricht ist mein Lehrer kürzlich auf DOS eingegangen. Da gab es keine Messages. Und trotzdem soll es damals das so genannte Turbo Vision gegeben haben, eine Ereignisgesteuerte Fensterbibliothek. Also muss das doch irgendwie gemacht worden sein. Auch Herr Gates muss die Messages in seinem Windows API irgendwie programmiert haben, aber wie. Nachvollziehen muss doch erlaubt sein?
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#4

Re: Ereignisverteilung verstehen

  Alt 24. Okt 2009, 12:11
Sorry, das sollte kein Angriff sein. Ich halte auch mehr vom verstehen als vom benutzen.

Windows empfängt im Hintergrund alle Ereignisse (Interrupts durch Hardware(Treiber), ..).
Jetzt könnte es so ein das es eine Liste aller Fenster gibt (aller Objekte, welche sich registriert haben um z.B. Mausbotschaften zu empfangen, sprich an der Ereignisbehandlung teilzuhaben (->WindowProc)).
Diese Liste könnte nach der "z-Koordinate" sortiert sein, so das das oberste Fenster an erster Stelle steht. Dann wird die Liste durchlaufen und geprüft ob PunktImRechteck(Fensterrechteck). Wenn dies erfüllt ist, dann wird die WindowProc des Fensters mit dem Ereignis (der Botschaft) aufgerufen. Jetzt obliegt des dieser Funktion, ob die Botschaft selber verarbeitet wird oder z.B. ala "KeyPreView" erst an andere übergeordnete Fenster weitergegeben wird. Windows kümmert das nicht, es wartet nur bis der WindowProc-Aufruf abgeschlossen ist. Wenn Message.Result vom Fenster gesetzt wurde weiß Windows das die Botschaft angenommen wurde, also ist die Behandlung beendet. Ansonsten wird ggf. weitergesucht ob ein anderes Fenster sich dafür interessiert (das hängt halt vom Ereignis und vom Result ab, ein MouseKlick geht nur an das oberste Fenster, aber nicht an andere (inaktive) Fenster die darunter liegen, ein QueryEndSession geht an alle TopLevel - Fenster (also die, welche als Parent den Desktop "Windows" haben, bzw. alle "Hauptfenster" der Anwendungen).
Man merkt, die Komplexität entsteht bei der Entscheidung: Wer muss/darf von einem Ereignis etwas mitkriegen.
Such im MSDN mal nach Message / WindowProc, da finden sich einige Erklärungen zu den Abläufen. (GetMessage, HandleMessage, DispatchMessage, ..)

Grüsse, Dirk
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:26 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