Avatar billede zerohero Nybegynder
24. juni 2003 - 20:21 Der er 11 kommentarer og
1 løsning

Modtage Messages

Hvordan kan man modtage windows messages, uden at bruge en form. Hvis jeg nu har en ny klasse:

type
  NyKlasse = class(TObject)
  private
    procedure ModtagMsg( var Msg: TMessage ); message wm_User;
  public
  end;

Hvordan kan jeg så få windows til at sende messages til proceduren "ModtagMsg" ? Det kan være at jeg har misset et eller andet med idéen bag Windows, men jeg synes bare at det er mærkligt, hvis det kun er TForms der kan modtage messages!!!

ZeroHero
Avatar billede zerohero Nybegynder
24. juni 2003 - 20:54 #1
OK, jeg fandt lidt brugligt fra www.udvikleren.dk og min NyKlasse ser således ud nu:

type
  NyKlasse = class(TObject)
  private
      MinHandle : THandle;
      procedure ModtagBesked(var Besked: TMessage);
      constructor Create;
      destructor Destroy;
  public
  end;

implementation

constructor TNyKlasse.Create;
begin
  MinHandle := AllocateHwnd(ModtagBesked);
end;

destructor TNyKlasse.Destroy;
begin
  DeAllocateHwnd(MinHandle);
end;

procedure TNyKlasse.ModtagBesked(var Besked: TMessage);
begin
  if Besked.Msg <> 0 then
  ShowMessage('Besked Modtaget')
  else
    DefWindowProc(MinHandle, Besked.msg, Besked.WParam, Besked.LParam);
end;

Men ingenting sker overhovedet!!! Trods jeg ved den burde modtage bekeder!!! Det virker ikke som om det virker overhovedet.
Er der nogen der kan fortælle mig om jeg er helt på vildspor?
Avatar billede zerohero Nybegynder
24. juni 2003 - 21:20 #2
OK Ja så fik jeg det til at virke!!!

type
  NyKlasse = class(TObject)
  private
      MinHandle : THandle;
      procedure ModtagBesked(var Besked: TMessage);
  public
      constructor Create;
      destructor Destroy; override;
  end;

En lille dummer fejl ;)) (som sædvanligt)
Avatar billede borrisholt Novice
25. juni 2003 - 11:42 #3
AHr du et program det virker, eller ej ?

Og er du retuneret til Danevang ?

Jens B
Avatar billede zerohero Nybegynder
25. juni 2003 - 17:50 #4
Jeg har fået det til at virke - sådan da!!! Det vil sige, at det kun virker hvis jeg fremprovokere en ShowMessage() for hver gang der modtages en besked fra Windows - er det ikke mega mærkligt:

Virker ikke:

procedure TNyKlasse.ModtagBesked(var Besked: TMessage);
begin
  case Besked.Msg of
    MM_WOM_Open: FPlaying := True;
    MM_WOM_Close: ;
    MM_WOM_Done: FPlaying := False;
    else
      DefWindowProc(MinHandle, Besked.msg, Besked.WParam, Besked.LParam);
    end; //Case
end;

Viker:

procedure TNyKlasse.ModtagBesked(var Besked: TMessage);
begin
  case Besked.Msg of
    MM_WOM_Open: begin
                  FPlaying := True;
                  ShowMessage('Start afspilning');
                end;
    MM_WOM_Close: ;
    MM_WOM_Done: begin
                  FPlaying := False;
                  ShowMessage('Stoppet afspilning');
                end;
    else
      DefWindowProc(MinHandle, Besked.msg, Besked.WParam, Besked.LParam);
    end; //Case
end;

Hvorfor virker det kun når jeg bruger ShowMessage() i mit kode?
Avatar billede borrisholt Novice
26. juni 2003 - 09:34 #5
Kigger lige på det ... Ang dit Wave problem .. Har du set at TBASSPlayer v.1.3 kan det hele ?

Jens B
Avatar billede borrisholt Novice
26. juni 2003 - 10:56 #6
Send mig lige en mail .... Så har jeg et projekt der virker :-)

Du har bare brugt for få heste !

Jens B
Avatar billede borrisholt Novice
26. juni 2003 - 11:05 #7
Nu har jeg fået mit domæne til at virke ....

http://www.borrisholt.com/eksperten/Message.zip

Jens b
Avatar billede zerohero Nybegynder
26. juni 2003 - 17:01 #8
Hej BorrisHolt,

jeg har afprøvet din Message.Zip og sat det over i mit projekt - det virker bare ikke. Jeg sender lige min projekt til dig, så du bedere kan få en helhed over alt min kode. Pointen er at en timer hele tiden viser min TWaveFile klasses "state/mode" (om du vil). Hvis jeg skipper ShowMessage() i min Message Methode opstår en fejl når wavefilen har sluttet sin afspilning. Fejlen skyldes nemlig at når en wavefil har afsluttet sin afspilning skal den stoppes med WaveResetOut() & WaveCloseOut() - derfor har jeg brug for messages der kan fortælle mig det! Håber du kan lukke HESTENE FRI og lade vognen stå - eller sådan et eller andet ;)

ZeroHero
Avatar billede borrisholt Novice
27. juni 2003 - 08:24 #9
Kunde du ikke finde dig en ICQ. Så kunne vi lige "snakke" om det.

Mit nummer er : 31312742

Jens B
Avatar billede zerohero Nybegynder
28. juni 2003 - 11:39 #10
Jep så har jeg installeret ICQ (Dansk) og tilføjet dig som kontakt person.
Mit nummer er: 252768197

ZeroHero
Avatar billede zerohero Nybegynder
01. juli 2003 - 15:46 #11
Nå men jeg tror at jeg fandt en vej. Hvis jeg bruger en TTimer der opdatere min TWaveFile klasse hele tiden virker det!

PS: Hvorfor kontaktede du mig ikke over ICQ'en Borrisholt? Måske er det mig der har installeret den forkert. Jeg kuan ikke se nogen forskel på funktionen AllocateHWnd() som ligger i Windows.pas og din MyAllocateHWnd() ?
Men skidt lortet virker nu - og det er det vigtigste - God Sommer!
Avatar billede borrisholt Novice
01. juli 2003 - 15:52 #12
Jeg har haft meget travlt ....

Jeg så dig godt .... Forskellen på MyAllocateHWnd()  og AllocateHWnd() er at i den første har du selv mulighed for at bestemme ClassName.

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester