AGB  ·  Datenschutz  ·  Impressum  







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

Mehrfachbehandlung von Events

Ein Thema von Delbor · begonnen am 16. Mai 2015 · letzter Beitrag vom 18. Mai 2015
 
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Mehrfachbehandlung von Events

  Alt 16. Mai 2015, 10:13
Delphi-Version: XE4
Hi zusammen

Hintergrund ist: Ich habe mehrere Frames, die miteinander über Events kommunizieren:
  1. Ein ToolboxFrame enthält diverse Buttons zum kopieren, einfügen, löschen etc.
  2. Mehrere Frames mit jeweils einem Synedit
Erstmal bin ich davon ausgegangen, dass ein abgefeuerter Event von verschiedenen Empfängern gleichzeitig abgefangen werden können. Zum Beispiel feuert der ToolboxFrame einen Event, um der Anwendung mitzuteilen, dass ein Button geklickt wurde. Ein Syneditframe regiert darauf und kopiert Text des Syneedits; gleichzeitig reagiert die Mainform, indem sie diie Darstellung der Sidebar anpasst (zum Bleistift den Inhalt der Zwischenablage anzeigt).
Ausgehend von dieser Annahme war ich der Meinung, dass verschiedene, auch vedeckte(weil auf verschiedenen Tabsheets), SyneditFrames auf diesen Event aus dem Toolboxframe reagieren würden. Das wäre sehr problematisch gewesen. Zum Glück haben mich dieser Thread und eigene Tests davon überzeugt, dass dem anders ist - der Test hat ergeben, dass nur gerade der Frame auf dem ActiveTabsheet auf das Event reagiert, auch wenn der Eventhandler mehrfach vorhanden ist.
Soweit, so gut, es funktioniert so, wie ich will - oder eben doch nicht ganz so gut, da ich im Moment nicht wirklich nachvollziehen kann, weshalb dies so ist.Hier mal einige meiner beteiligten Events:
Delphi-Quellcode:
procedure TToolBoxWebFrame.TLB_CopyClick(Sender: TObject);
  var Event: String;
begin
  if Assigned(FCopyOnClipBoard) then begin //procedure DoCopyOnClipBoard(Event: String);
    Event := 'TLB_CopyClick';
    FCopyOnClipBoard(Event);
    TLB_Einfuegen.Enabled := True;
    TLB_Ausschneiden.Enabled := True;
    TLB_Copy.Enabled:= False;
  end;
end;
Obiger Event könnte ein simpler TNotifyevent sein, zur Kontrolle wollte ich aber einen Parameter mitgeben, der mir die Quelle im Synedit ausgibt, da ich in Eventprogrammmierung noch nicht wirklich sattelfest bin..
Der Eventhandler im Syneditframe:
Delphi-Quellcode:
procedure THTMLFrame.DoCopyOnClipBoard(const Event: String);
begin
   if SynEdit1.SelText.Length > 0 then begin
       SynEdit1.CopyToClipboard;
   end;
   SynEdit1.Lines.Add(Event);
end;
Ausserdem:
Delphi-Quellcode:
procedure THTMLFrame.SynEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Synedit1.SelText <> 'then begin
    if assigned(FOnSelectText) then
      FOnSelectText(Self);
  end;
end;
und der Eventhandler:
Delphi-Quellcode:
procedure TToolBoxWebFrame.DoOnSelectText(Sender: TObject);
begin
Self.TLB_Copy.Enabled := True;
Self.TLB_Ausschneiden.Enabled := True;
end;
Und natürlich, um es nicht zu vergessen:
Delphi-Quellcode:
{***************************************************************************}
procedure TDelborWebServerMain.FormCreate(Sender: TObject);
  var Event: String;
begin
  SideBarWebFrame1.FileTreeFrame1.OnFileFound := DoOnFileFound;
  ToolBoxWebFrame1.OnPCtrlActivePage := DoOnPCtrlActivePage;
  SideBarWebFrame1.FileTreeFrame1.OnPathlist := DoOnPathList;

  ManageEvents;
end;

procedure TDelborWebServerMain.ManageEvents;
begin
  ToolBoxWebFrame1.OnCutOnClipBoard := SynEditFrame1.DoCutOnClipBoard;
  ToolBoxWebFrame1.OnCopyOnClipBoard := SynEditFrame1.DoCopyOnClipBoard;
  ToolBoxWebFrame1.OnPasteFromClipBoard := SynEditFrame1.DoPasteFromClipBoard;
  ToolBoxWebFrame1.OnOnSafe := SynEditFrame1.DoOnSafeSynedit;
  ToolBoxWebFrame1.OnOnOpen := SynEditFrame1.DoOnOpenSynedit;
  ToolBoxWebFrame1.OnOnNew := SynEditFrame1.DoOnNewSynedit;
  SynEditFrame1.OnSelectText := ToolBoxWebFrame1.DoOnSelectText;
end;
Im Moment nachvollziehbar ist: das Frame auf dem ActiveTabsheet ist wegen seines Parenmts Enabled und kann deshalb das Event empfangen; die Edits auf den andern Tabsheets sind nicht enabled und deren Eventhandler desshalb nicht assigned. Soweit so gut?

Nun kommt aber die Sache mit der Liste aus dem verlinkten Thread ins Spiel:
Zitat:
Du brauchst eine "Liste" von solchen Zeigern

TList<TBarcodeEvent>

Und da kann man via Add was hinzufügen und per Remove wieder entfernen.
Ok, die Liste gehört dahin, wo gefeuert wird
Hier die Eventtypen, die in meinem ToolbarFrame definiert sind (wie schon gesagt: alle könnten auch TNotifyEvent sein):
Delphi-Quellcode:
type
  TCutOnClipBoard = procedure(const Event: string)of object;
  TCopyOnClipBoard = procedure(const Event: string) of object;
  TPasteFromClipBoard = procedure(const Event: string) of object;
  TOnSafe = procedure(const Event: string) of object;
  TOnOpen = procedure(const Event: string) of object;
  TOnNew = procedure(const Event: string) of object;
Wenn ich das mit der Liste richtig verstanden habe, müsste eine solche nun für jeden Typen, der von mehreren Zielen/Eventhandlern empfangen werden soll, eine solche Liste anlegen.
Und da ist nun mein gordischer Knoten: In der Liste sind die Eventtypen mehrfach aufgelistet, aber diese Typen kennen ja ihr Ziel nicht??
Oder hab ich jetzt die Antwort gefunden: ein abgefeuertes Event kann genau von einem Eventhandler behandelt werden und muss deshalb per Liste mehrmals abgefeuert werden?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
 


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:13 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