Czy zwykła klasa może odbierać komunikaty?

0

Cześć,

mam do Was następujące pytanie: Czy zwykła klasa może odbierać komunikaty?
Ma ona uchwyt (Handle), ale gdy próbuje na ten uchwyt wysłać komunikat - klasa go nie odbiera. Czy należy ją jakoś przed tą operacją zarejestrować w systemie? Jak to zrobić? Dzięki.

0

jeśli dobrze pamiętam to komunikaty mogę odbierać tylko okna

// dokładnie tak - Ł

0

Dzięki za odpowiedź. Chyba nie przesadze jeśli powiem że jest to dość mocne ograniczenie ;)
Pozdrawiam! Jeszcze raz dzięki!

0

Przesadzasz, bo istnieją przecież message-only windows. Czyli tak na prawdę deklaracje, w których jedynym niezbędnym elementem jest funkcja obsługi pętli komunikatów.

0

Jak to nie moze jak moze?
Wystarczy odpowiednio przekierowac komunikat ;)

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    procedure InvokeTest(var Msg: TMessage); message WM_PAINT;
  end;

  TTest = class
    procedure TestMsg(var Msg: TMessage); message WM_PAINT;
  end;

var
  Form1: TForm1;
  Test: TTest;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test := TTest.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Test.Free;
end;

procedure TForm1.InvokeTest(var Msg: TMessage);
begin
  Test.Dispatch(Msg);
end;

{ TTest }
procedure TTest.TestMsg(var Msg: TMessage);
begin
  Form1.ListBox1.Items.Add('wm_paint!');
end;
0

@add
A jesli nie chce ktos sie bawic w przekazywanie kazdego komunikatu osono to moze w TForm dac override DefaultHandler(var Message) i tam wykonywac odpowiednie dispatch na odpowiednia klase ;]

0

Bidok(nli) ale i tak bez okna, które najpierw "przekieruje" komunikaty do klasy nic nie zrobisz

BTW to ograniczenie wynika z windowsa a nie języka (Delphi)

0

Dzięki za odpowiedzi. Przekazywanie komunikatu niestety nie wchodzi w grę gdyż jest to osobny moduł obsługujący sieć, bez okna. A w Winsocku to bywa tak, że w trybie asynchronicznym (nieblokującym) mamy do czynienia z komunikatami które są wysyłane do nas gdy coś przyjdzie przez sieć... no i w tym właśnie problem ;/
Jeszcze raz dzięki za wsparcie.

0

moze to ...

{
  Delphi Application Unit by Aphex
  http://iamaphex.cjb.net
  [email protected]
}
unit ApplicationUnit;

interface

uses
  Windows;

type
  TProcedure = procedure;

  TApplication = class(TObject)
  private
    FStartup: TProcedure;
    FMain: TProcedure;
    FShutdown: TProcedure;
    FTerminated: boolean;
    function ProcessMessage(var Msg: TMsg): Boolean;
  protected
  public
    property Startup: TProcedure read FStartup write FStartup;
    property Main: TProcedure read FMain write FMain;
    property Shutdown: TProcedure read FShutdown write FShutdown;
    property Terminated: boolean read FTerminated write FTerminated;
    procedure StayResident;
    procedure Terminate;
    procedure ProcessMessages;
  end;

implementation

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> $0012 then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end
    else
    begin
      FTerminated := True;
    end;
  end;
end;

procedure TApplication.ProcessMessages;
var
  Msg: TMsg;
begin
  while ProcessMessage(Msg) do;
end;

procedure TApplication.Terminate;
begin
  FTerminated := True;
end;

procedure TApplication.StayResident;
var
  Msg: TMsg;
begin
  if Assigned(FStartup) then FStartup;
  while not FTerminated do
  begin
    while ProcessMessage(Msg) do;
    Sleep(100);
    if Assigned(FMain) then FMain;
  end;
  if Assigned(FShutdown) then FShutdown;
end;

end.
0
wieprz napisał(a)

moze to ...

Respekt... Dziękuje Ci - to rozwiązuje problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1