Avatar billede snorga Nybegynder
31. oktober 2000 - 12:00 Der er 9 kommentarer og
3 løsninger

stjæling af events

Hvis jeg nu laver en ikke synligt component, som jeg gerne vil have til at \"stjæle\" nogle events fra en anden component.

Jeg har overvejet noget i stilen:
have en propoerty der er det component der skal stjæle fra. (EventComp:TComponent)
Create\'en på component:
  If assigned(EventComp.OnMouseMove) then begin
    Self.OldOnMouseMove := EventComp.OnMouseMove;
    EventComp.OnMouseMove := Self.MyMouseMove;   
  end;

Og så i MyMouseMove:
  If assigned(OldOnMouseMove) then OldMouseMove;

Der kan vel blive problemmer hvis mit stjæleComponent bliver \"Created\" før den??

Andre problemmer/løsninger?

Pointene vil blive fordelt mellem de forskellige, efter hvor meget de hjælpe mig :-)
Så det bliver nok holdt åbnet et par dage efter første svar.. (Højt point sats på grund af jeg håbe på at flere kommer med svar. hint hint?)
Avatar billede snorga Nybegynder
31. oktober 2000 - 12:02 #1
Og hvordan fungere det med at have et component der \"linker\" til et andet component?
Avatar billede borrisholt Novice
31. oktober 2000 - 12:02 #2
Du kan også implemtere et mouse hooke, således at du bliver spurgt først hvad der skal ske med dette muse event ...

Jens B
Avatar billede snorga Nybegynder
31. oktober 2000 - 12:16 #3
Det er en mulighed.. Men jeg skal også bruge Keyboard events.. og måske andre såsom OnPaint..
Avatar billede borrisholt Novice
31. oktober 2000 - 12:29 #4
Jammes så er det bare et andet hook du skal lave.

FRA online hjælpen (SetWindowsHookEX)

WH_CALLWNDPROC   

Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook

Jens B
Avatar billede snorga Nybegynder
31. oktober 2000 - 15:31 #5
Det er da ihverfald en muligt som jeg vil overveje.

Du har fået reservet en del af point\'ne :-)

Men jeg vente som skreve et par dage for se om andre har nogle kommetare/svar..
Avatar billede snorga Nybegynder
01. november 2000 - 07:55 #6
Jeg fandt (en) løsning(en) :)

et TComponent har en Loaded procedure, som bliver kaldt når form\'en ER loaded. Så den har jeg bare override\'et.. og så sætter jeg events\'ne der.
Avatar billede borrisholt Novice
01. november 2000 - 09:14 #7
Må vi se girafen ? Jeg kunne gode tænke mig at se noget kode ...

Kan du i givet fald stjæle af alle komponenter ... Er du ikke nød til at vide hvilke komponenter du har, og navnligt ikke har ?

Jens B
Avatar billede snorga Nybegynder
01. november 2000 - 09:20 #8
Girafen..? hmm.. men jo det kan du da godt, jeg smider det op i aften.

Jo, den jeg stjæle fra(MouseEvent) er valgt via en property på mit component og er af en bestemt type. Og så lige Formen(KeyEvent) hvis det er den der er ejeren af componentet.
Avatar billede borrisholt Novice
01. november 2000 - 09:24 #9
Jeg har skrevet en komponent suite, der implemterer hooks ... hvis formålet \"kun\" er at stjæle events vil de sikkert have din interese ...

Jens B
Avatar billede delphi Nybegynder
05. november 2000 - 20:01 #10
Før var det hest.  Nu skal (andre) sagesløse dyr fra de afrikanske stepper tilsyneladende osse\' blandes ind i ekspertes meningsudvækslinger...


Vedr. spørsmålet:  Snorga> Lidt ærgeligt at du selv fandt på Loaded.  Jeg har benyttet netop Loaded til netop noget af det du efterlyser.  Jeg bruger specielt Loaded, hvis jeg har en opgave der kræver at nogle database componenter lige skal være initialiseret før jeg kan bruge dem.

Delphi
Avatar billede ugge Nybegynder
05. november 2000 - 22:19 #11
Hvis jeg har forstået det korrekt vil du lave en usynlig komponent der responderer på mus og tastatur. Det findes to måder:

Den langhårede hvor du arver nedarver fra TComponent og selv laver messagehandlerne a\'la:

TDinKomponent = class(TComponent)
private
  procedure WMCHar(var Msg: TWMChar); message WM_Char;
// osv...

Alle standard windows mesages kan findes Delphi hjælpe filen.

En anden løsning er simplere. Nedarv fra TCUstomControl og override Paint handleren.

....
protected procedure Paint; override;
....


TDinKomponent.Paint
begin
  if csDesigning in ComponentState then begin
    // tegn dit lille ikon
  end;
end;

Nå. det er sent håber du kan bruge det til noget.

MVH Ugge.
Avatar billede snorga Nybegynder
06. november 2000 - 21:43 #12
Her er klippet ud hvordan jeg har gjort det..:
----------------------------------------------

  TGForm = class(TComponent)
  private
    { Private declarations }
    FIsLoaded:Boolean;
    FDXDraw: TDXDraw;

    FOnKeyDown: TKeyEvent;
    FOnKeyPress: TKeyPressEvent;
    FOnKeyUp: TKeyEvent;
    FOnMouseWheel: TMouseWheelEvent;
    FOnMouseWheelDown: TMouseWheelUpDownEvent;
    FOnMouseWheelUp: TMouseWheelUpDownEvent;
    FOnMouseUp,
    FOnMouseDown: TMouseEvent;
    FOnMouseMove: TMouseMoveEvent;

    procedure SetDXDraw(Value: TDXDraw);
  protected
    { Protected declarations }
    Procedure Loaded; Override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    Procedure OnKeyDownEvent(Sender: TObject; var Key: Word; Shift: TShiftState);
    Procedure OnKeyUpEvent(Sender: TObject; var Key: Word; Shift: TShiftState);
    Procedure OnKeyPressEvent(Sender: TObject; var Key: Char);
    Procedure OnMouseUpEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure OnMouseDownEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure OnMouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  published
    { Published declarations }
    property DXDraw: TDXDraw read FDXDraw write SetDXDraw;
  end;

procedure Register;

implementation

{ TGForm }

//****************************************
//  Init
//****************************************
constructor TGForm.Create(AOwner: TComponent);
begin
  inherited;
  FIsLoaded:=False;
  FOnKeyDown:=Nil;
  FOnKeyPress:=Nil;
  FOnKeyUp:=Nil;
  FOnMouseWheel:=Nil;
  FOnMouseWheelDown:=Nil;
  FOnMouseWheelUp:=Nil;
  FOnMouseUp:=Nil;
  FOnMouseDown:=Nil;
  FOnMouseMove:=Nil;
  FDXDraw:=Nil;
end;

//****************************************
//  Give back stolen events
//****************************************
destructor TGForm.Destroy;
begin
  inherited;
  if fIsLoaded then begin
    fIsLoaded:=False;
    if (Owner is TForm) then begin
      TForm(Owner).OnKeyDown:=FOnKeyDown;
      TForm(Owner).OnKeyUp:=FOnKeyUp;
      TForm(Owner).OnKeyPress:=FOnKeyPress;
      TForm(Owner).OnMouseMove:=FOnMouseMove;
      TForm(Owner).OnMouseUp:=FOnMouseUp;
      TForm(Owner).OnMouseDown:=FOnMouseDown;
    end;
  end;
  fDefaultFont.Free;
end;

//****************************************
//  Steal Events from Form and DXDraw
//****************************************
procedure TGForm.Loaded;
begin
  inherited;
  if csDesigning in ComponentState then exit;
  if not fIsLoaded then begin
    fIsLoaded := True;
    if (Owner is TForm) then begin
      TForm(Owner).KeyPreview := True;
      // Nap KeyDown
      If Assigned(TForm(Owner).OnKeyDown) then begin
        FOnKeyDown:=TForm(Owner).OnKeyDown;
      end else FOnKeyDown:=Nil;
      TForm(Owner).OnKeyDown:=OnKeyDownEvent;
      // Nap KeyUp
      If Assigned(TForm(Owner).OnKeyUp) then begin
        FOnKeyUp:=TForm(Owner).OnKeyUp;
      end else FOnKeyUp:=Nil;
      TForm(Owner).OnKeyUp:=OnKeyUpEvent;
      // Nap KeyPress
      If Assigned(TForm(Owner).OnKeyPress) then begin
        FOnKeyPress:=TForm(Owner).OnKeyPress;
      end else FOnKeyPress:=Nil;
      TForm(Owner).OnKeyPress:=OnKeyPressEvent;
    end;
    If FDXDraw<>nil then begin
      // Nap MouseMove
      If Assigned(FDXDraw.OnMouseMove) then begin
        FOnMouseMove:=FDXDraw.OnMouseMove;
      end else FOnMouseMove:=Nil;
      FDXDraw.OnMouseMove:=OnMouseMoveEvent;
      // Nap MouseDown
      If Assigned(FDXDraw.OnMouseDown) then begin
        FOnMouseDown:=FDXDraw.OnMouseDown;
      end else FOnMouseDown:=Nil;
      FDXDraw.OnMouseDown:=OnMouseDownEvent;
      // Nap MouseUp
      If Assigned(FDXDraw.OnMouseUp) then begin
        FOnMouseUp:=FDXDraw.OnMouseUp;
      end else FOnMouseUp:=Nil;
      FDXDraw.OnMouseUp:=OnMouseUpEvent;
    end;
  end;
end;

procedure TGForm.OnKeyDownEvent(Sender: TObject; var Key: Word; Shift: TShiftState);
begin If Assigned(FOnKeyDown) Then FOnKeyDown(Sender,Key,Shift);
  //kode
end;

procedure TGForm.OnKeyUpEvent(Sender: TObject; var Key: Word; Shift: TShiftState);
begin If Assigned(FOnKeyUp) Then FOnKeyUp(Sender,Key,Shift);
  //kode
end;

procedure TGForm.OnKeyPressEvent(Sender: TObject; var Key: Char);
begin If Assigned(FOnKeyPress) Then FOnKeyPress(Sender,Key);
  //kode
end;

procedure TGForm.OnMouseDownEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin If Assigned(FOnMouseDown) Then FOnMouseDown(Sender,Button,Shift,X, Y);
  //kode
end;

procedure TGForm.OnMouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin If Assigned(FOnMouseMove) Then FOnMouseMove(Sender,Shift,X, Y);
  //kode
end;

procedure TGForm.OnMouseUpEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin If Assigned(FOnMouseUp) Then FOnMouseUp(Sender,Button,Shift,X, Y);
  //kode
end;

procedure TGForm.SetDXDraw(Value: TDXDraw);
begin FDXDraw := Value;end;

procedure Register;
begin
  RegisterComponents(\'DelphiX\', [TGForm]);
end;
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