Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.917 Beiträge
 
Delphi 12 Athens
 
#7

AW: DEB DelphiEventBus vs. System.Messaging.TMessageManager

  Alt 12. Mai 2016, 10:13
Dankesehr für die interessanten Vorschläge.

Ich habe mal die Frage ob man Sleep() benutzen sollte, ich meine das verwendet auf manchen Platformen ntern
Applications.ProcessMessages.
Wäre nicht ein Timer oder WaitFor sicherer ?

Ich hatte versucht mir das mit Generics in eine abgeleitete Klasse zu basteln,
damit ich noch spezifisches Payload als Parameter und Feedback als Result-Wert mit übergeben kann.

Damit kann ich dann auch anonyme Prozeduren benutzen.

Das ist zwar noch etwas unsauber und unübersichtlich, weil viel TestCode suboptimal drin ist, aber funktioniert gut und zuverlässig.

Sieht ungefähr so aus, geht sicher einfacher, und ich muss das mal aufräumen wenn Zeit ist ...

Delphi-Quellcode:
// Definiert eine universelle Message-Ableitung, mit PAyload und Feedback
type
  TMsgLink<T1, T2> = class(TMessage)
  private
    FPayload : T1;
    FFeedback : T2;

  protected

    constructor Create(const Payload : T1; const CbFkt : T2); overload;

  public

    procedure SendToSubscriber(const Sender : TObject); //(xVal : T1);

    property Payload : T1 read FPayload write FPayload;
    property Feedback : T2 read FFeedback write FFeedback;
  end;



// Definiert ein Boolean Callback, z.B. als Handled True/False
type
  TMsgFeedback_Boolean = TMsgFeedback<Boolean>;


// Definiert einen Parameter Record als PAyload für SendMEssage
type
  TMsgPayload = record
    public
      FCmd : Integer;
      FCmdSub : Integer;
      FText : String;

      procedure Setup(const iCmd, iCmdSub : Integer; sTxt: String);

    //procedure SetText(const sTxt : String);

    public

      property Cmd : Integer read FCmd write FCmd;
      property CmdSub : Integer read FCmdSub write FCmdSub;
      property Text : String read FText write FText;

  end;

// Baut alles zusammen zu einer einfachen MskLink Klasse
type
  TMsgLink_Cmd_Base = class (TMsgLink<TMsgPayload, TMsgFeedback_Boolean>)
                        constructor Create(const iCmd, iCmdSub : Integer;
                                           const strTxt : String;
                                           const fktAsw : TProc<TObject, Boolean>
                                          ); overload;

                        constructor SendMessage(const ACmp : TObject;
                                                const iCmd : Integer; iCmdSub : Integer = 0; const sTxt : String = '';
                                                const fktAsw : TProc<TObject, Boolean> = nil;
                                                bQueue : Boolean = True
                                               ); overload;

                     end;


// So kann ich verschiedene, speziele MsgLinks aufbauen, für verschiedene Aufgaben
Rollo
  Mit Zitat antworten Zitat